diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-12-13 14:58:55 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-12-13 18:58:17 +0100 |
commit | b54de1bd9bbf38d4fa866ffeeafb1e79e9edcc58 (patch) | |
tree | 8f5e37d50c4dfd281d35a2d6d5b56cd530217d65 /resources | |
parent | c9354d546399bcb4d5bca4bd6f7014ad88e45f15 (diff) |
resources/js: Fix some import discrepancies between Hugo and ESBuild
This fixes the cases where
```js
import 'imp2/index.js';
import 'imp3/foo.js';
```
And these files lives in `assets` as:
```
imp2/index.ts
imp3/foo.ts
```
Fixes #10527
Diffstat (limited to 'resources')
-rw-r--r-- | resources/resource_transformers/js/integration_test.go | 44 | ||||
-rw-r--r-- | resources/resource_transformers/js/options.go | 13 |
2 files changed, 52 insertions, 5 deletions
diff --git a/resources/resource_transformers/js/integration_test.go b/resources/resource_transformers/js/integration_test.go index b9f466873..ef371248c 100644 --- a/resources/resource_transformers/js/integration_test.go +++ b/resources/resource_transformers/js/integration_test.go @@ -259,3 +259,47 @@ JS Content:{{ $js.Content }}:End: }) } + +// See issue 10527. +func TestImportHugoVsESBuild(t *testing.T) { + c := qt.New(t) + + for _, importSrcDir := range []string{"node_modules", "assets"} { + c.Run(importSrcDir, func(c *qt.C) { + files := ` +-- IMPORT_SRC_DIR/imp1/index.js -- +console.log("IMPORT_SRC_DIR:imp1/index.js"); +-- IMPORT_SRC_DIR/imp2/index.ts -- +console.log("IMPORT_SRC_DIR:imp2/index.ts"); +-- IMPORT_SRC_DIR/imp3/foo.ts -- +console.log("IMPORT_SRC_DIR:imp3/foo.ts"); +-- assets/js/main.js -- +import 'imp1/index.js'; +import 'imp2/index.js'; +import 'imp3/foo.js'; +-- layouts/index.html -- +{{ $js := resources.Get "js/main.js" | js.Build }} +{{ $js.RelPermalink }} + ` + + files = strings.ReplaceAll(files, "IMPORT_SRC_DIR", importSrcDir) + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: c, + NeedsOsFS: true, + TxtarString: files, + }).Build() + + expected := ` +IMPORT_SRC_DIR:imp1/index.js +IMPORT_SRC_DIR:imp2/index.ts +IMPORT_SRC_DIR:imp3/foo.ts +` + expected = strings.ReplaceAll(expected, "IMPORT_SRC_DIR", importSrcDir) + + b.AssertFileContent("public/js/main.js", expected) + }) + } + +} diff --git a/resources/resource_transformers/js/options.go b/resources/resource_transformers/js/options.go index 2987f5915..71ae04573 100644 --- a/resources/resource_transformers/js/options.go +++ b/resources/resource_transformers/js/options.go @@ -150,7 +150,7 @@ func resolveComponentInAssets(fs afero.Fs, impPath string) *hugofs.FileMeta { for _, ext := range []string{".js", ".ts", ".tsx", ".jsx"} { if strings.HasSuffix(impPath, ext) { // Import of foo.js.js need the full name. - return nil + continue } if fi, err := fs.Stat(base + ext); err == nil { return fi.(hugofs.FileMetaInfo).Meta() @@ -163,12 +163,10 @@ func resolveComponentInAssets(fs afero.Fs, impPath string) *hugofs.FileMeta { var m *hugofs.FileMeta - // See issue #8949. // We need to check if this is a regular file imported without an extension. // There may be ambigous situations where both foo.js and foo/index.js exists. // This import order is in line with both how Node and ESBuild's native // import resolver works. - // This was fixed in Hugo 0.88. // It may be a regular file imported without an extension, e.g. // foo or foo/index. @@ -176,14 +174,17 @@ func resolveComponentInAssets(fs afero.Fs, impPath string) *hugofs.FileMeta { if m != nil { return m } - if filepath.Base(impPath) == "index" { + + base := filepath.Base(impPath) + if base == "index" { + // try index.esm.js etc. m = findFirst(impPath + ".esm") if m != nil { return m } } - // Finally check the path as is. + // Check the path as is. fi, err := fs.Stat(impPath) if err == nil { @@ -195,6 +196,8 @@ func resolveComponentInAssets(fs afero.Fs, impPath string) *hugofs.FileMeta { } else { m = fi.(hugofs.FileMetaInfo).Meta() } + } else if strings.HasSuffix(base, ".js") { + m = findFirst(strings.TrimSuffix(impPath, ".js")) } return m |