hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 617e094482cbb8e46e5606bc7ff5ead109419d4d
parent cf12fa6161531110c17706b7e00e878eb48e9827
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Sun, 12 Jun 2022 18:42:53 +0200

js: Resolve index.esm.js

Same logic as for `index.{js,ts...}` files applies; if both `index.esm.js` and `index.js` exists (unlikely), you need to use the name
with extension when importing, else the `index.js` will win.

Fixes #8631

Diffstat:
Mresources/resource_transformers/js/options.go | 9+++++++++
Mresources/resource_transformers/js/options_test.go | 7++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/resources/resource_transformers/js/options.go b/resources/resource_transformers/js/options.go
@@ -176,6 +176,12 @@ func resolveComponentInAssets(fs afero.Fs, impPath string) *hugofs.FileMeta {
 	if m != nil {
 		return m
 	}
+	if filepath.Base(impPath) == "index" {
+		m = findFirst(impPath + ".esm")
+		if m != nil {
+			return m
+		}
+	}
 
 	// Finally check the path as is.
 	fi, err := fs.Stat(impPath)
@@ -183,6 +189,9 @@ func resolveComponentInAssets(fs afero.Fs, impPath string) *hugofs.FileMeta {
 	if err == nil {
 		if fi.IsDir() {
 			m = findFirst(filepath.Join(impPath, "index"))
+			if m == nil {
+				m = findFirst(filepath.Join(impPath, "index.esm"))
+			}
 		} else {
 			m = fi.(hugofs.FileMetaInfo).Meta()
 		}
diff --git a/resources/resource_transformers/js/options_test.go b/resources/resource_transformers/js/options_test.go
@@ -150,11 +150,16 @@ func TestResolveComponentInAssets(t *testing.T) {
 		{"Index file, folder only", []string{"foo/index.js", "bar.js"}, "foo", "foo/index.js"},
 		{"Index file, folder and index", []string{"foo/index.js", "bar.js"}, "foo/index", "foo/index.js"},
 		{"Index file, folder and index and suffix", []string{"foo/index.js", "bar.js"}, "foo/index.js", "foo/index.js"},
+		{"Index ESM file, folder only", []string{"foo/index.esm.js", "bar.js"}, "foo", "foo/index.esm.js"},
+		{"Index ESM file, folder and index", []string{"foo/index.esm.js", "bar.js"}, "foo/index", "foo/index.esm.js"},
+		{"Index ESM file, folder and index and suffix", []string{"foo/index.esm.js", "bar.js"}, "foo/index.esm.js", "foo/index.esm.js"},
+		// We added these index.esm.js cases in v0.101.0. The case below is unlikely to happen in the wild, but add a test
+		// to document Hugo's behavior. We pick the file with the name index.js; anything else would be breaking.
+		{"Index and Index ESM file, folder only", []string{"foo/index.esm.js", "foo/index.js", "bar.js"}, "foo", "foo/index.js"},
 
 		// Issue #8949
 		{"Check file before directory", []string{"foo.js", "foo/index.js"}, "foo", "foo.js"},
 	} {
-
 		c.Run(test.name, func(c *qt.C) {
 			baseDir := "assets"
 			mfs := afero.NewMemMapFs()