From d25f7ec17299d2be49ea3f0a1c736c18adbf4f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 13 Feb 2025 10:44:44 +0100 Subject: [PATCH] js/esbuild: Add drop option Fixes #13362 --- .../en/functions/js/_common/options.md | 8 +++++++ internal/js/esbuild/options.go | 16 ++++++++++++++ internal/js/esbuild/options_test.go | 22 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/docs/content/en/functions/js/_common/options.md b/docs/content/en/functions/js/_common/options.md index e2b6566ad..0d6138a7b 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 5ea2bcea9..21f9e31cd 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, diff --git a/internal/js/esbuild/options_test.go b/internal/js/esbuild/options_test.go index 7312eea27..e92c3bea6 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) {