summaryrefslogtreecommitdiffstats
path: root/modules/module.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/module.go')
-rw-r--r--modules/module.go174
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
+}