summaryrefslogtreecommitdiffstats
path: root/resources/resource_transformers/js
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-12-13 14:58:55 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-12-13 18:58:17 +0100
commitb54de1bd9bbf38d4fa866ffeeafb1e79e9edcc58 (patch)
tree8f5e37d50c4dfd281d35a2d6d5b56cd530217d65 /resources/resource_transformers/js
parentc9354d546399bcb4d5bca4bd6f7014ad88e45f15 (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/resource_transformers/js')
-rw-r--r--resources/resource_transformers/js/integration_test.go44
-rw-r--r--resources/resource_transformers/js/options.go13
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