diff --git a/commands/static_syncer.go b/commands/static_syncer.go index 17fae7d13f8..bd696520a1f 100644 --- a/commands/static_syncer.go +++ b/commands/static_syncer.go @@ -79,9 +79,9 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error { fromPath := ev.Name - relPath := sourceFs.MakePathRelative(fromPath) + relPath, found := sourceFs.MakePathRelative(fromPath) - if relPath == "" { + if !found { // Not member of this virtual host. continue } diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go index 189aa19c6cc..ae3807360ac 100644 --- a/hugolib/filesystems/basefs.go +++ b/hugolib/filesystems/basefs.go @@ -267,7 +267,7 @@ func (s SourceFilesystems) IsI18n(filename string) bool { // It will return an empty string if the filename is not a member of a static filesystem. func (s SourceFilesystems) MakeStaticPathRelative(filename string) string { for _, staticFs := range s.Static { - rel := staticFs.MakePathRelative(filename) + rel, _ := staticFs.MakePathRelative(filename) if rel != "" { return rel } @@ -276,8 +276,7 @@ func (s SourceFilesystems) MakeStaticPathRelative(filename string) string { } // MakePathRelative creates a relative path from the given filename. -// It will return an empty string if the filename is not a member of this filesystem. -func (d *SourceFilesystem) MakePathRelative(filename string) string { +func (d *SourceFilesystem) MakePathRelative(filename string) (string, bool) { for _, dir := range d.Dirs { meta := dir.(hugofs.FileMetaInfo).Meta() @@ -288,10 +287,10 @@ func (d *SourceFilesystem) MakePathRelative(filename string) string { if mp := meta.Path(); mp != "" { rel = filepath.Join(mp, rel) } - return strings.TrimPrefix(rel, filePathSeparator) + return strings.TrimPrefix(rel, filePathSeparator), true } } - return "" + return "", false } func (d *SourceFilesystem) RealFilename(rel string) string { diff --git a/hugolib/site.go b/hugolib/site.go index 3679e354cca..3d77b014af3 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -1047,7 +1047,7 @@ func (s *Site) processPartial(config *BuildCfg, init func(config *BuildCfg) erro ) for _, ev := range events { - if assetsFilename := s.BaseFs.Assets.MakePathRelative(ev.Name); assetsFilename != "" { + if assetsFilename, _ := s.BaseFs.Assets.MakePathRelative(ev.Name); assetsFilename != "" { cachePartitions = append(cachePartitions, resources.ResourceKeyPartitions(assetsFilename)...) if evictCSSRe == nil { if cssFileRe.MatchString(assetsFilename) || cssConfigRe.MatchString(assetsFilename) { diff --git a/resources/resource_transformers/js/options.go b/resources/resource_transformers/js/options.go index 689efe0b4b7..fde6f58886b 100644 --- a/resources/resource_transformers/js/options.go +++ b/resources/resource_transformers/js/options.go @@ -19,7 +19,6 @@ import ( "io/ioutil" "path/filepath" "strings" - "sync" "github.com/pkg/errors" @@ -113,11 +112,6 @@ func decodeOptions(m map[string]interface{}) (Options, error) { return opts, nil } -type importCache struct { - sync.RWMutex - m map[string]api.OnResolveResult -} - var extensionToLoaderMap = map[string]api.Loader{ ".js": api.LoaderJS, ".mjs": api.LoaderJS, @@ -141,16 +135,18 @@ func loaderFromFilename(filename string) api.Loader { func createBuildPlugins(c *Client, opts Options) ([]api.Plugin, error) { fs := c.rs.Assets - cache := importCache{ - m: make(map[string]api.OnResolveResult), - } - resolveImport := func(args api.OnResolveArgs) (api.OnResolveResult, error) { - isStdin := args.Importer == stdinImporter var relDir string if !isStdin { - relDir = filepath.Dir(fs.MakePathRelative(args.Importer)) + rel, found := fs.MakePathRelative(args.Importer) + if !found { + // Not in any of the /assets folders. + // This is an import from a node_modules, let + // ESBuild resolve this. + return api.OnResolveResult{}, nil + } + relDir = filepath.Dir(rel) } else { relDir = filepath.Dir(opts.sourcefile) } @@ -204,8 +200,7 @@ func createBuildPlugins(c *Client, opts Options) ([]api.Plugin, error) { return api.OnResolveResult{Path: m.Filename(), Namespace: nsImportHugo}, nil } - // Not found in /assets. Probably in node_modules. ESBuild will handle that - // rather complex logic. + // Fall back to ESBuild's resolve. return api.OnResolveResult{}, nil } @@ -214,26 +209,7 @@ func createBuildPlugins(c *Client, opts Options) ([]api.Plugin, error) { Setup: func(build api.PluginBuild) { build.OnResolve(api.OnResolveOptions{Filter: `.*`}, func(args api.OnResolveArgs) (api.OnResolveResult, error) { - // Try cache first. - cache.RLock() - v, found := cache.m[args.Path] - cache.RUnlock() - - if found { - return v, nil - } - - imp, err := resolveImport(args) - if err != nil { - return imp, err - } - - cache.Lock() - defer cache.Unlock() - - cache.m[args.Path] = imp - - return imp, nil + return resolveImport(args) }) build.OnLoad(api.OnLoadOptions{Filter: `.*`, Namespace: nsImportHugo},