ref: ef78a0d18a13098bcea1ff2b2d45d7388b8d41a0
dir: /modules/module.go/
// 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
}