diff options
Diffstat (limited to 'modules/module.go')
-rw-r--r-- | modules/module.go | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/modules/module.go b/modules/module.go new file mode 100644 index 000000000..a5f707635 --- /dev/null +++ b/modules/module.go @@ -0,0 +1,174 @@ +// Copyright 2019 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package modules provides a client that can be used to manage Hugo Components, +// what's referred to as Hugo Modules. Hugo Modules is built on top of Go Modules, +// but also supports vendoring and components stored directly in the themes dir. +package modules + +import ( + "github.com/gohugoio/hugo/config" +) + +var _ Module = (*moduleAdapter)(nil) + +type Module interface { + + // Optional config read from the configFilename above. + Cfg() config.Provider + + // The decoded module config and mounts. + Config() Config + + // Optional configuration filename (e.g. "/themes/mytheme/config.json"). + // This will be added to the special configuration watch list when in + // server mode. + ConfigFilename() string + + // Directory holding files for this module. + Dir() string + + // This module is disabled. + Disabled() bool + + // Returns whether this is a Go Module. + IsGoMod() bool + + // Any directory remappings. + Mounts() []Mount + + // In the dependency tree, this is the first module that defines this module + // as a dependency. + Owner() Module + + // Returns the path to this module. + // This will either be the module path, e.g. "github.com/gohugoio/myshortcodes", + // or the path below your /theme folder, e.g. "mytheme". + Path() string + + // Replaced by this module. + Replace() Module + + // Returns whether Dir points below the _vendor dir. + Vendor() bool + + // The module version. + Version() string + + // Whether this module's dir is a watch candidate. + Watch() bool +} + +type Modules []Module + +type moduleAdapter struct { + path string + dir string + version string + vendor bool + disabled bool + projectMod bool + owner Module + + mounts []Mount + + configFilename string + cfg config.Provider + config Config + + // Set if a Go module. + gomod *goModule +} + +func (m *moduleAdapter) Cfg() config.Provider { + return m.cfg +} + +func (m *moduleAdapter) Config() Config { + return m.config +} + +func (m *moduleAdapter) ConfigFilename() string { + return m.configFilename +} + +func (m *moduleAdapter) Dir() string { + // This may point to the _vendor dir. + if !m.IsGoMod() || m.dir != "" { + return m.dir + } + return m.gomod.Dir +} + +func (m *moduleAdapter) Disabled() bool { + return m.disabled +} + +func (m *moduleAdapter) IsGoMod() bool { + return m.gomod != nil +} + +func (m *moduleAdapter) Mounts() []Mount { + return m.mounts +} + +func (m *moduleAdapter) Owner() Module { + return m.owner +} + +func (m *moduleAdapter) Path() string { + if !m.IsGoMod() || m.path != "" { + return m.path + } + return m.gomod.Path +} + +func (m *moduleAdapter) Replace() Module { + if m.IsGoMod() && !m.Vendor() && m.gomod.Replace != nil { + return &moduleAdapter{ + gomod: m.gomod.Replace, + owner: m.owner, + } + } + return nil +} + +func (m *moduleAdapter) Vendor() bool { + return m.vendor +} + +func (m *moduleAdapter) Version() string { + if !m.IsGoMod() || m.version != "" { + return m.version + } + return m.gomod.Version +} + +func (m *moduleAdapter) Watch() bool { + if m.Owner() == nil { + // Main project + return true + } + + if !m.IsGoMod() { + // Module inside /themes + return true + } + + if m.Replace() != nil { + // Version is not set when replaced by a local folder. + return m.Replace().Version() == "" + } + + return false +} |