Repository: gohugoio/hugo (language: go)

Issue:
Add drop to js.Build options
https://esbuild.github.io/api/#drop


Discussion / hints:

Fix patch:
diff --git a/docs/content/en/functions/js/_common/options.md b/docs/content/en/functions/js/_common/options.md
index e2b6566adb6..0d6138a7b5c 100644
--- a/docs/content/en/functions/js/_common/options.md
+++ b/docs/content/en/functions/js/_common/options.md
@@ -81,6 +81,14 @@ import * as ReactDOM from 'react-dom/client';
 {{ $defines := dict "process.env.NODE_ENV" `"development"` }}
 ```
 
+##### drop
+
+Edit your source code before building to drop certain constructs: One of `debugger` or `console`.
+
+{{< new-in 0.144.0 />}}
+
+See https://esbuild.github.io/api/#drop
+
 ###### sourceMap
 
 (`string`) Whether to generate `inline`, `linked` or `external` source maps from esbuild. Linked and external source maps will be written to the target with the output file name + ".map". When `linked` a `sourceMappingURL` will also be written to the output file. By default, source maps are not created. Note that the `linked` option was added in Hugo 0.140.0.
diff --git a/internal/js/esbuild/options.go b/internal/js/esbuild/options.go
index 5ea2bcea90f..21f9e31cd97 100644
--- a/internal/js/esbuild/options.go
+++ b/internal/js/esbuild/options.go
@@ -138,6 +138,10 @@ type ExternalOptions struct {
 	// User defined symbols.
 	Defines map[string]any
 
+	// This tells esbuild to edit your source code before building to drop certain constructs.
+	// See https://esbuild.github.io/api/#drop
+	Drop string
+
 	// Maps a component import to another.
 	Shims map[string]string
 
@@ -298,6 +302,17 @@ func (opts *Options) compile() (err error) {
 		defines = maps.ToStringMapString(opts.Defines)
 	}
 
+	var drop api.Drop
+	switch opts.Drop {
+	case "":
+	case "console":
+		drop = api.DropConsole
+	case "debugger":
+		drop = api.DropDebugger
+	default:
+		err = fmt.Errorf("unsupported drop type: %q", opts.Drop)
+	}
+
 	// By default we only need to specify outDir and no outFile
 	outDir := opts.OutDir
 	outFile := ""
@@ -344,6 +359,7 @@ func (opts *Options) compile() (err error) {
 
 		Define:   defines,
 		External: opts.Externals,
+		Drop:     drop,
 
 		JSXFactory:  opts.JSXFactory,
 		JSXFragment: opts.JSXFragment,


Test patch:
diff --git a/internal/js/esbuild/options_test.go b/internal/js/esbuild/options_test.go
index 7312eea2770..e92c3bea681 100644
--- a/internal/js/esbuild/options_test.go
+++ b/internal/js/esbuild/options_test.go
@@ -177,6 +177,28 @@ func TestToBuildOptions(t *testing.T) {
 		JSX:             api.JSXAutomatic,
 		JSXImportSource: "preact",
 	})
+
+	opts = Options{
+		ExternalOptions: ExternalOptions{
+			Drop: "console",
+		},
+	}
+	c.Assert(opts.compile(), qt.IsNil)
+	c.Assert(opts.compiled.Drop, qt.Equals, api.DropConsole)
+	opts = Options{
+		ExternalOptions: ExternalOptions{
+			Drop: "debugger",
+		},
+	}
+	c.Assert(opts.compile(), qt.IsNil)
+	c.Assert(opts.compiled.Drop, qt.Equals, api.DropDebugger)
+
+	opts = Options{
+		ExternalOptions: ExternalOptions{
+			Drop: "adsfadsf",
+		},
+	}
+	c.Assert(opts.compile(), qt.ErrorMatches, `unsupported drop type: "adsfadsf"`)
 }
 
 func TestToBuildOptionsTarget(t *testing.T) {