Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package esbuild for openSUSE:Factory checked in at 2026-03-15 14:32:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/esbuild (Old) and /work/SRC/openSUSE:Factory/.esbuild.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "esbuild" Sun Mar 15 14:32:33 2026 rev:21 rq:1339042 version:0.27.4 Changes: -------- --- /work/SRC/openSUSE:Factory/esbuild/esbuild.changes 2026-02-25 21:11:20.240067494 +0100 +++ /work/SRC/openSUSE:Factory/.esbuild.new.8177/esbuild.changes 2026-03-15 14:33:28.550126845 +0100 @@ -1,0 +2,8 @@ +Sun Mar 15 01:05:36 UTC 2026 - Avindra Goolcharan <[email protected]> + +- update to 0.27.4: + * Fix a regression with CSS media queries (#4395, #4405, #4406) + * Fix an edge case with the inject feature (#4407) + * Attempt to improve API handling of huge metafiles (#4329, #4415) + +------------------------------------------------------------------- Old: ---- esbuild-0.27.3.tar.gz New: ---- esbuild-0.27.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ esbuild.spec ++++++ --- /var/tmp/diff_new_pack.S47baI/_old 2026-03-15 14:33:29.102149568 +0100 +++ /var/tmp/diff_new_pack.S47baI/_new 2026-03-15 14:33:29.102149568 +0100 @@ -24,7 +24,7 @@ %global tag v%{version} %global extractdir0 esbuild-%{version} Name: esbuild -Version: 0.27.3 +Version: 0.27.4 Release: 0 Summary: A JavaScript bundler written for speed License: MIT ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.S47baI/_old 2026-03-15 14:33:29.142151215 +0100 +++ /var/tmp/diff_new_pack.S47baI/_new 2026-03-15 14:33:29.146151379 +0100 @@ -1,6 +1,6 @@ -mtime: 1772003968 -commit: 857bb2499ad7e712a526b7aefa7a8c66e9973dbc985022a44d0f5807e709f8ec +mtime: 1773536828 +commit: cb5ed694e68e6c7d5868410a4e97fd11f74aa8a43e8b6d07f311fcec21ae6462 url: https://src.opensuse.org/javascript/esbuild.git -revision: 857bb2499ad7e712a526b7aefa7a8c66e9973dbc985022a44d0f5807e709f8ec +revision: cb5ed694e68e6c7d5868410a4e97fd11f74aa8a43e8b6d07f311fcec21ae6462 projectscmsync: https://src.opensuse.org/javascript/_ObsPrj.git ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-03-15 02:08:00.000000000 +0100 @@ -0,0 +1 @@ +.osc ++++++ esbuild-0.27.3.tar.gz -> esbuild-0.27.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/CHANGELOG.md new/esbuild-0.27.4/CHANGELOG.md --- old/esbuild-0.27.3/CHANGELOG.md 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/CHANGELOG.md 2026-03-12 15:12:56.000000000 +0100 @@ -1,5 +1,59 @@ # Changelog +## 0.27.4 + +* Fix a regression with CSS media queries ([#4395](https://github.com/evanw/esbuild/issues/4395), [#4405](https://github.com/evanw/esbuild/issues/4405), [#4406](https://github.com/evanw/esbuild/issues/4406)) + + Version 0.25.11 of esbuild introduced support for parsing media queries. This unintentionally introduced a regression with printing media queries that use the `<media-type> and <media-condition-without-or>` grammar. Specifically, esbuild was failing to wrap an `or` clause with parentheses when inside `<media-condition-without-or>`. This release fixes the regression. + + Here is an example: + + ```css + /* Original code */ + @media only screen and ((min-width: 10px) or (min-height: 10px)) { + a { color: red } + } + + /* Old output (incorrect) */ + @media only screen and (min-width: 10px) or (min-height: 10px) { + a { + color: red; + } + } + + /* New output (correct) */ + @media only screen and ((min-width: 10px) or (min-height: 10px)) { + a { + color: red; + } + } + ``` + +* Fix an edge case with the `inject` feature ([#4407](https://github.com/evanw/esbuild/issues/4407)) + + This release fixes an edge case where esbuild's `inject` feature could not be used with arbitrary module namespace names exported using an `export {} from` statement with bundling disabled and a target environment where arbitrary module namespace names is unsupported. + + With the fix, the following `inject` file: + + ```js + import jquery from 'jquery'; + export { jquery as 'window.jQuery' }; + ``` + + Can now always be rewritten as this without esbuild sometimes incorrectly generating an error: + + ```js + export { default as 'window.jQuery' } from 'jquery'; + ``` + +* Attempt to improve API handling of huge metafiles ([#4329](https://github.com/evanw/esbuild/issues/4329), [#4415](https://github.com/evanw/esbuild/issues/4415)) + + This release contains a few changes that attempt to improve the behavior of esbuild's JavaScript API with huge metafiles (esbuild's name for the build metadata, formatted as a JSON object). The JavaScript API is designed to return the metafile JSON as a JavaScript object in memory, which makes it easy to access from within a JavaScript-based plugin. Multiple people have encountered issues where this API breaks down with a pathologically-large metafile. + + The primary issue is that V8 has an implementation-specific maximum string length, so using the `JSON.parse` API with large enough strings is impossible. This release will now attempt to use a fallback JavaScript-based JSON parser that operates directly on the UTF8-encoded JSON bytes instead of using `JSON.parse` when the JSON metafile is too big to fit in a JavaScript string. The new fallback path has not yet been heavily-tested. The metafile will also now be generated with whitespace removed if the bundle is significantly large, which will reduce the size of the metafile JSON slightly. + + However, hitting this case is potentially a sign that something else is wrong. Ideally you wouldn't be building something so enormous that the build metadata can't even fit inside a JavaScript string. You may want to consider optimizing your project, or breaking up your project into multiple parts that are built independently. Another option could potentially be to use esbuild's command-line API instead of its JavaScript API, which is more efficient (although of course then you can't use JavaScript plugins, so it may not be an option). + ## 0.27.3 * Preserve URL fragments in data URLs ([#4370](https://github.com/evanw/esbuild/issues/4370)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/cmd/esbuild/service.go new/esbuild-0.27.4/cmd/esbuild/service.go --- old/esbuild-0.27.3/cmd/esbuild/service.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/cmd/esbuild/service.go 2026-03-12 15:12:56.000000000 +0100 @@ -660,7 +660,7 @@ response["outputFiles"] = encodeOutputFiles(result.OutputFiles) } if options.Metafile { - response["metafile"] = result.Metafile + response["metafile"] = []byte(result.Metafile) } if options.MangleCache != nil { response["mangleCache"] = result.MangleCache diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/cmd/esbuild/version.go new/esbuild-0.27.4/cmd/esbuild/version.go --- old/esbuild-0.27.3/cmd/esbuild/version.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/cmd/esbuild/version.go 2026-03-12 15:12:56.000000000 +0100 @@ -1,3 +1,3 @@ package main -const esbuildVersion = "0.27.3" +const esbuildVersion = "0.27.4" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/bundler/bundler.go new/esbuild-0.27.4/internal/bundler/bundler.go --- old/esbuild-0.27.3/internal/bundler/bundler.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/bundler/bundler.go 2026-03-12 15:12:56.000000000 +0100 @@ -2411,6 +2411,11 @@ } } + // Automatically minify the metafile JSON if the bundle is really big + if len(s.results) > 256 { + s.options.MetafileFormat = config.MinifiedMetafile + } + // Now that all files have been scanned, process the final file import records for sourceIndex, result := range s.results { if !result.ok { @@ -2423,7 +2428,9 @@ // Begin the metadata chunk if s.options.NeedsMetafile { sb.Write(helpers.QuoteForJSON(result.file.inputFile.Source.PrettyPaths.Select(s.options.MetafilePathStyle), s.options.ASCIIOnly)) - sb.WriteString(fmt.Sprintf(": {\n \"bytes\": %d,\n \"imports\": [", len(result.file.inputFile.Source.Contents))) + sb.WriteString(fmt.Sprintf( + s.options.MetafileFormat.MaybeRemoveWhitespace(": {\n \"bytes\": %d,\n \"imports\": ["), + len(result.file.inputFile.Source.Contents))) } // Don't try to resolve paths if we're not bundling @@ -2439,17 +2446,17 @@ if s.options.NeedsMetafile { if with := record.AssertOrWith; with != nil && with.Keyword == ast.WithKeyword && len(with.Entries) > 0 { data := strings.Builder{} - data.WriteString(",\n \"with\": {") + data.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace(",\n \"with\": {")) for i, entry := range with.Entries { if i > 0 { data.WriteByte(',') } - data.WriteString("\n ") + data.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) data.Write(helpers.QuoteForJSON(helpers.UTF16ToString(entry.Key), s.options.ASCIIOnly)) - data.WriteString(": ") + data.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace(": ")) data.Write(helpers.QuoteForJSON(helpers.UTF16ToString(entry.Value), s.options.ASCIIOnly)) } - data.WriteString("\n }") + data.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n }")) metafileWith = data.String() } } @@ -2460,11 +2467,12 @@ if s.options.NeedsMetafile { if isFirstImport { isFirstImport = false - sb.WriteString("\n ") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } else { - sb.WriteString(",\n ") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace(",\n ")) } - sb.WriteString(fmt.Sprintf("{\n \"path\": %s,\n \"kind\": %s,\n \"external\": true%s\n }", + sb.WriteString(fmt.Sprintf( + s.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"path\": %s,\n \"kind\": %s,\n \"external\": true%s\n }"), helpers.QuoteForJSON(record.Path.Text, s.options.ASCIIOnly), helpers.QuoteForJSON(record.Kind.StringForMetafile(), s.options.ASCIIOnly), metafileWith)) @@ -2497,11 +2505,12 @@ if s.options.NeedsMetafile { if isFirstImport { isFirstImport = false - sb.WriteString("\n ") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } else { - sb.WriteString(",\n ") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace(",\n ")) } - sb.WriteString(fmt.Sprintf("{\n \"path\": %s,\n \"kind\": %s,\n \"original\": %s%s\n }", + sb.WriteString(fmt.Sprintf( + s.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"path\": %s,\n \"kind\": %s,\n \"original\": %s%s\n }"), helpers.QuoteForJSON(otherFile.inputFile.Source.PrettyPaths.Select(s.options.MetafilePathStyle), s.options.ASCIIOnly), helpers.QuoteForJSON(record.Kind.StringForMetafile(), s.options.ASCIIOnly), helpers.QuoteForJSON(record.Path.Text, s.options.ASCIIOnly), @@ -2673,7 +2682,7 @@ // End the metadata chunk if s.options.NeedsMetafile { if !isFirstImport { - sb.WriteString("\n ") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } if repr, ok := result.file.inputFile.Repr.(*graph.JSRepr); ok && (repr.AST.ExportsKind == js_ast.ExportsCommonJS || repr.AST.ExportsKind == js_ast.ExportsESM) { @@ -2681,24 +2690,25 @@ if repr.AST.ExportsKind == js_ast.ExportsESM { format = "esm" } - sb.WriteString(fmt.Sprintf("],\n \"format\": %q", format)) + sb.WriteString(fmt.Sprintf(s.options.MetafileFormat.MaybeRemoveWhitespace("],\n \"format\": %q"), format)) } else { sb.WriteString("]") } if attrs := result.file.inputFile.Source.KeyPath.ImportAttributes.DecodeIntoArray(); len(attrs) > 0 { - sb.WriteString(",\n \"with\": {") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace(",\n \"with\": {")) for i, attr := range attrs { if i > 0 { sb.WriteByte(',') } - sb.WriteString(fmt.Sprintf("\n %s: %s", + sb.WriteString(fmt.Sprintf( + s.options.MetafileFormat.MaybeRemoveWhitespace("\n %s: %s"), helpers.QuoteForJSON(attr.Key, s.options.ASCIIOnly), helpers.QuoteForJSON(attr.Value, s.options.ASCIIOnly), )) } - sb.WriteString("\n }") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n }")) } - sb.WriteString("\n }") + sb.WriteString(s.options.MetafileFormat.MaybeRemoveWhitespace("\n }")) } result.file.jsonMetadataChunk = sb.String() @@ -2767,17 +2777,19 @@ // Optionally add metadata about the file var jsonMetadataChunk string if s.options.NeedsMetafile { - inputs := fmt.Sprintf("{\n %s: {\n \"bytesInOutput\": %d\n }\n }", + inputs := fmt.Sprintf( + s.options.MetafileFormat.MaybeRemoveWhitespace("{\n %s: {\n \"bytesInOutput\": %d\n }\n }"), helpers.QuoteForJSON(result.file.inputFile.Source.PrettyPaths.Select(s.options.MetafilePathStyle), s.options.ASCIIOnly), len(bytes), ) entryPointJSON := "" if isEntryPoint { - entryPointJSON = fmt.Sprintf("\"entryPoint\": %s,\n ", + entryPointJSON = fmt.Sprintf( + s.options.MetafileFormat.MaybeRemoveWhitespace("\"entryPoint\": %s,\n "), helpers.QuoteForJSON(result.file.inputFile.Source.PrettyPaths.Select(s.options.MetafilePathStyle), s.options.ASCIIOnly)) } jsonMetadataChunk = fmt.Sprintf( - "{\n \"imports\": [],\n \"exports\": [],\n %s\"inputs\": %s,\n \"bytes\": %d\n }", + s.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"imports\": [],\n \"exports\": [],\n %s\"inputs\": %s,\n \"bytes\": %d\n }"), entryPointJSON, inputs, len(bytes), @@ -3073,7 +3085,7 @@ var metafileJSON string if options.NeedsMetafile { timer.Begin("Generate metadata JSON") - metafileJSON = b.generateMetadataJSON(outputFiles, allReachableFiles, options.ASCIIOnly) + metafileJSON = b.generateMetadataJSON(outputFiles, allReachableFiles, &options) timer.End("Generate metadata JSON") } @@ -3261,9 +3273,9 @@ } } -func (b *Bundle) generateMetadataJSON(results []graph.OutputFile, allReachableFiles []uint32, asciiOnly bool) string { +func (b *Bundle) generateMetadataJSON(results []graph.OutputFile, allReachableFiles []uint32, options *config.Options) string { sb := strings.Builder{} - sb.WriteString("{\n \"inputs\": {") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace("{\n \"inputs\": {")) // Write inputs isFirst := true @@ -3274,15 +3286,15 @@ if file := &b.files[sourceIndex]; len(file.jsonMetadataChunk) > 0 { if isFirst { isFirst = false - sb.WriteString("\n ") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } else { - sb.WriteString(",\n ") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace(",\n ")) } sb.WriteString(file.jsonMetadataChunk) } } - sb.WriteString("\n },\n \"outputs\": {") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace("\n },\n \"outputs\": {")) // Write outputs isFirst = true @@ -3297,17 +3309,18 @@ } if isFirst { isFirst = false - sb.WriteString("\n ") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } else { - sb.WriteString(",\n ") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace(",\n ")) } pathMap[path] = struct{}{} - sb.WriteString(fmt.Sprintf("%s: ", helpers.QuoteForJSON(path, asciiOnly))) + sb.WriteString(fmt.Sprintf(options.MetafileFormat.MaybeRemoveWhitespace("%s: "), helpers.QuoteForJSON(path, options.ASCIIOnly))) sb.WriteString(result.JSONMetadataChunk) } } - sb.WriteString("\n }\n}\n") + sb.WriteString(options.MetafileFormat.MaybeRemoveWhitespace("\n }\n}")) + sb.WriteByte('\n') return sb.String() } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/bundler_tests/bundler_default_test.go new/esbuild-0.27.4/internal/bundler_tests/bundler_default_test.go --- old/esbuild-0.27.3/internal/bundler_tests/bundler_default_test.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/bundler_tests/bundler_default_test.go 2026-03-12 15:12:56.000000000 +0100 @@ -9110,7 +9110,7 @@ UnsupportedJSFeatures: compat.ArbitraryModuleNamespaceNames, }, expectedCompileLog: `entry.js: ERROR: Using the string "not ok" as an export name is not supported in the configured target environment -entry.js: ERROR: Using the string "same name" as an export name is not supported in the configured target environment +entry.js: ERROR: Using the string "same name" as an import name is not supported in the configured target environment entry.js: ERROR: Using the string "name 1" as an import name is not supported in the configured target environment entry.js: ERROR: Using the string "name 2" as an export name is not supported in the configured target environment entry.js: ERROR: Using the string "name space" as an export name is not supported in the configured target environment @@ -9228,6 +9228,26 @@ AbsOutputFile: "/out.js", InjectPaths: []string{"/inject.js"}, UnsupportedJSFeatures: compat.ArbitraryModuleNamespaceNames, + }, + }) +} + +func TestInjectWithStringReExportNameNoBundle(t *testing.T) { + default_suite.expectBundled(t, bundled{ + files: map[string]string{ + "/entry.js": ` + console.log(test) + `, + "/inject.js": ` + export { fn as "console.log" } from 'pkg' + `, + }, + entryPaths: []string{"/entry.js"}, + options: config.Options{ + Mode: config.ModePassThrough, + AbsOutputFile: "/out.js", + InjectPaths: []string{"/inject.js"}, + UnsupportedJSFeatures: compat.ArbitraryModuleNamespaceNames, }, }) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/bundler_tests/snapshots/snapshots_default.txt new/esbuild-0.27.4/internal/bundler_tests/snapshots/snapshots_default.txt --- old/esbuild-0.27.3/internal/bundler_tests/snapshots/snapshots_default.txt 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/bundler_tests/snapshots/snapshots_default.txt 2026-03-12 15:12:56.000000000 +0100 @@ -2250,6 +2250,12 @@ fn(test); ================================================================================ +TestInjectWithStringReExportNameNoBundle +---------- /out.js ---------- +import { fn } from "pkg"; +fn(test); + +================================================================================ TestJSXAutomaticImportsCommonJS ---------- /out.js ---------- // custom-react.js diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/config/config.go new/esbuild-0.27.4/internal/config/config.go --- old/esbuild-0.27.3/internal/config/config.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/config/config.go 2026-03-12 15:12:56.000000000 +0100 @@ -495,6 +495,9 @@ // If true, make sure to generate a single file that can be written to stdout WriteToStdout bool + // Large bundles minify the metafile JSON to reduce its size + MetafileFormat MetafileFormat + OmitRuntimeForTests bool OmitJSXRuntimeForTests bool ASCIIOnly bool @@ -869,3 +872,30 @@ } return } + +type MetafileFormat uint8 + +const ( + UnminifiedMetafile MetafileFormat = iota + MinifiedMetafile +) + +func (mf MetafileFormat) MaybeRemoveWhitespace(fmt string) string { + if mf == MinifiedMetafile { + resultLen := 0 + for i := 0; i < len(fmt); i++ { + if c := fmt[i]; c != ' ' && c != '\n' { + resultLen++ + } + } + var result strings.Builder + result.Grow(resultLen) + for i := 0; i < len(fmt); i++ { + if c := fmt[i]; c != ' ' && c != '\n' { + result.WriteByte(c) + } + } + return result.String() + } + return fmt +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/css_parser/css_parser_test.go new/esbuild-0.27.4/internal/css_parser/css_parser_test.go --- old/esbuild-0.27.3/internal/css_parser/css_parser_test.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/css_parser/css_parser_test.go 2026-03-12 15:12:56.000000000 +0100 @@ -2639,6 +2639,16 @@ expectPrintedMangle(t, "@media (a) and ((b) or (c)) { a { color: red } }", "@media (a) and ((b) or (c)) {\n a {\n color: red;\n }\n}\n", "") expectPrintedMangle(t, "@media (a) or ((b) and (c)) { a { color: red } }", "@media (a) or ((b) and (c)) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and (((a) and (b)) and (c)) { a { color: red } }", "@media screen and (a) and (b) and (c) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and (((a) or (b)) or (c)) { a { color: red } }", "@media screen and ((a) or (b) or (c)) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and ((a) and ((b) and (c))) { a { color: red } }", "@media screen and (a) and (b) and (c) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and ((a) or ((b) or (c))) { a { color: red } }", "@media screen and ((a) or (b) or (c)) {\n a {\n color: red;\n }\n}\n", "") + + expectPrintedMangle(t, "@media screen and (((a) and (b)) or (c)) { a { color: red } }", "@media screen and (((a) and (b)) or (c)) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and (((a) or (b)) and (c)) { a { color: red } }", "@media screen and ((a) or (b)) and (c) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and ((a) and ((b) or (c))) { a { color: red } }", "@media screen and (a) and ((b) or (c)) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media screen and ((a) or ((b) and (c))) { a { color: red } }", "@media screen and ((a) or ((b) and (c))) {\n a {\n color: red;\n }\n}\n", "") + expectPrintedMangle(t, "@media not (not (color)) { a { color: red } }", "@media (color) {\n a {\n color: red;\n }\n}\n", "") expectPrintedMangle(t, "@media not (not (not (color))) { a { color: red } }", "@media not (color) {\n a {\n color: red;\n }\n}\n", "") expectPrintedMangle(t, "@media not (not (not (not (color)))) { a { color: red } }", "@media (color) {\n a {\n color: red;\n }\n}\n", "") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/css_printer/css_printer.go new/esbuild-0.27.4/internal/css_printer/css_printer.go --- old/esbuild-0.27.3/internal/css_printer/css_printer.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/css_printer/css_printer.go 2026-03-12 15:12:56.000000000 +0100 @@ -51,6 +51,7 @@ AddSourceMappings bool LegalComments config.LegalComments NeedsMetafile bool + MetafileFormat config.MetafileFormat } type PrintResult struct { @@ -93,9 +94,10 @@ record := p.importRecords[importRecordIndex] external := "" if (record.Flags & ast.ShouldNotBeExternalInMetafile) == 0 { - external = ",\n \"external\": true" + external = p.options.MetafileFormat.MaybeRemoveWhitespace(",\n \"external\": true") } - p.jsonMetadataImports = append(p.jsonMetadataImports, fmt.Sprintf("\n {\n \"path\": %s,\n \"kind\": %s%s\n }", + p.jsonMetadataImports = append(p.jsonMetadataImports, fmt.Sprintf( + p.options.MetafileFormat.MaybeRemoveWhitespace("\n {\n \"path\": %s,\n \"kind\": %s%s\n }"), helpers.QuoteForJSON(record.Path.Text, p.options.ASCIIOnly), helpers.QuoteForJSON(record.Kind.StringForMetafile(), p.options.ASCIIOnly), external)) @@ -444,7 +446,11 @@ p.printIdent(q.Type, identNormal, 0) if q.AndOrNull.Data != nil { p.print(" and ") - p.printMediaQuery(q.AndOrNull, 0) + var flags mqFlags + if binary, ok := q.AndOrNull.Data.(*css_ast.MQBinary); ok && binary.Op == css_ast.MQBinaryOpOr { + flags = mqNeedsParens + } + p.printMediaQuery(q.AndOrNull, flags) } case *css_ast.MQNot: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/js_printer/js_printer.go new/esbuild-0.27.4/internal/js_printer/js_printer.go --- old/esbuild-0.27.3/internal/js_printer/js_printer.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/js_printer/js_printer.go 2026-03-12 15:12:56.000000000 +0100 @@ -3936,9 +3936,10 @@ if p.options.NeedsMetafile { external := "" if (record.Flags & ast.ShouldNotBeExternalInMetafile) == 0 { - external = ",\n \"external\": true" + external = p.options.MetafileFormat.MaybeRemoveWhitespace(",\n \"external\": true") } - p.jsonMetadataImports = append(p.jsonMetadataImports, fmt.Sprintf("\n {\n \"path\": %s,\n \"kind\": %s%s\n }", + p.jsonMetadataImports = append(p.jsonMetadataImports, fmt.Sprintf( + p.options.MetafileFormat.MaybeRemoveWhitespace("\n {\n \"path\": %s,\n \"kind\": %s%s\n }"), helpers.QuoteForJSON(record.Path.Text, p.options.ASCIIOnly), helpers.QuoteForJSON(importKind.StringForMetafile(), p.options.ASCIIOnly), external)) @@ -4942,6 +4943,7 @@ SourceMap config.SourceMap AddSourceMappings bool NeedsMetafile bool + MetafileFormat config.MetafileFormat } type RequireOrImportMeta struct { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/internal/linker/linker.go new/esbuild-0.27.4/internal/linker/linker.go --- old/esbuild-0.27.3/internal/linker/linker.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/internal/linker/linker.go 2026-03-12 15:12:56.000000000 +0100 @@ -706,7 +706,8 @@ AbsPath: c.fs.Join(c.options.AbsOutputDir, finalRelPathForLegalComments), Contents: chunk.externalLegalComments, JSONMetadataChunk: fmt.Sprintf( - "{\n \"imports\": [],\n \"exports\": [],\n \"inputs\": {},\n \"bytes\": %d\n }", len(chunk.externalLegalComments)), + c.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"imports\": [],\n \"exports\": [],\n \"inputs\": {},\n \"bytes\": %d\n }"), + len(chunk.externalLegalComments)), }) } @@ -744,7 +745,8 @@ AbsPath: c.fs.Join(c.options.AbsOutputDir, finalRelPathForSourceMap), Contents: outputSourceMap, JSONMetadataChunk: fmt.Sprintf( - "{\n \"imports\": [],\n \"exports\": [],\n \"inputs\": {},\n \"bytes\": %d\n }", len(outputSourceMap)), + c.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"imports\": [],\n \"exports\": [],\n \"inputs\": {},\n \"bytes\": %d\n }"), + len(outputSourceMap)), }) } } @@ -4467,10 +4469,7 @@ if c.options.UnsupportedJSFeatures.Has(compat.ArbitraryModuleNamespaceNames) { for _, item := range s.Items { - c.maybeForbidArbitraryModuleNamespaceIdentifier("export", sourceIndex, item.AliasLoc, item.Alias) - if item.AliasLoc != item.Name.Loc { - c.maybeForbidArbitraryModuleNamespaceIdentifier("import", sourceIndex, item.Name.Loc, item.OriginalName) - } + c.maybeForbidArbitraryModuleNamespaceIdentifier("import", sourceIndex, item.Name.Loc, item.OriginalName) } } @@ -4485,6 +4484,12 @@ ImportRecordIndex: s.ImportRecordIndex, IsSingleLine: s.IsSingleLine, } + } else if c.options.UnsupportedJSFeatures.Has(compat.ArbitraryModuleNamespaceNames) { + for _, item := range s.Items { + if item.AliasLoc != item.Name.Loc { + c.maybeForbidArbitraryModuleNamespaceIdentifier("export", sourceIndex, item.AliasLoc, item.Alias) + } + } } // Make sure these don't end up in the wrapper closure @@ -4965,6 +4970,7 @@ RequireOrImportMetaForSource: c.requireOrImportMetaForSource, MangledProps: c.mangledProps, NeedsMetafile: c.options.NeedsMetafile, + MetafileFormat: c.options.MetafileFormat, } tree := repr.AST tree.Directives = nil // This is handled elsewhere @@ -4975,7 +4981,8 @@ } if file.InputFile.Loader == config.LoaderFile { - result.JSONMetadataImports = append(result.JSONMetadataImports, fmt.Sprintf("\n {\n \"path\": %s,\n \"kind\": \"file-loader\"\n }", + result.JSONMetadataImports = append(result.JSONMetadataImports, fmt.Sprintf( + c.options.MetafileFormat.MaybeRemoveWhitespace("\n {\n \"path\": %s,\n \"kind\": \"file-loader\"\n }"), helpers.QuoteForJSON(file.InputFile.UniqueKeyForAdditionalFile, c.options.ASCIIOnly))) } @@ -5627,6 +5634,7 @@ MinifySyntax: c.options.MinifySyntax, LineLimit: c.options.LineLimit, NeedsMetafile: c.options.NeedsMetafile, + MetafileFormat: c.options.MetafileFormat, } crossChunkImportRecords := make([]ast.ImportRecord, len(chunk.crossChunkImports)) for i, chunkImport := range chunk.crossChunkImports { @@ -5742,7 +5750,7 @@ if c.options.NeedsMetafile { // Print imports isFirstMeta := true - jMeta.AddString("{\n \"imports\": [") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"imports\": [")) for _, json := range jsonMetadataImports { if isFirstMeta { isFirstMeta = false @@ -5762,11 +5770,11 @@ } } if !isFirstMeta { - jMeta.AddString("\n ") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } // Print exports - jMeta.AddString("],\n \"exports\": [") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("],\n \"exports\": [")) var aliases []string if c.options.OutputFormat.KeepESMImportExportSyntax() { if chunk.isEntryPoint { @@ -5794,21 +5802,22 @@ } else { jMeta.AddString(",") } - jMeta.AddString(fmt.Sprintf("\n %s", + jMeta.AddString(fmt.Sprintf( + c.options.MetafileFormat.MaybeRemoveWhitespace("\n %s"), helpers.QuoteForJSON(alias, c.options.ASCIIOnly))) } if !isFirstMeta { - jMeta.AddString("\n ") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } - jMeta.AddString("],\n") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("],\n")) if chunk.isEntryPoint { entryPoint := c.graph.Files[chunk.sourceIndex].InputFile.Source.PrettyPaths.Select(c.options.MetafilePathStyle) - jMeta.AddString(fmt.Sprintf(" \"entryPoint\": %s,\n", helpers.QuoteForJSON(entryPoint, c.options.ASCIIOnly))) + jMeta.AddString(fmt.Sprintf(c.options.MetafileFormat.MaybeRemoveWhitespace(" \"entryPoint\": %s,\n"), helpers.QuoteForJSON(entryPoint, c.options.ASCIIOnly))) } if chunkRepr.hasCSSChunk { - jMeta.AddString(fmt.Sprintf(" \"cssBundle\": %s,\n", helpers.QuoteForJSON(c.chunks[chunkRepr.cssChunkIndex].uniqueKey, c.options.ASCIIOnly))) + jMeta.AddString(fmt.Sprintf(c.options.MetafileFormat.MaybeRemoveWhitespace(" \"cssBundle\": %s,\n"), helpers.QuoteForJSON(c.chunks[chunkRepr.cssChunkIndex].uniqueKey, c.options.ASCIIOnly))) } - jMeta.AddString(" \"inputs\": {") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace(" \"inputs\": {")) } // Concatenate the generated JavaScript chunks together @@ -5969,14 +5978,15 @@ for _, output := range pieces[i] { count += c.accurateFinalByteCount(output, finalRelDir) } - jMeta.AddString(fmt.Sprintf("\n %s: {\n \"bytesInOutput\": %d\n %s}", + jMeta.AddString(fmt.Sprintf( + c.options.MetafileFormat.MaybeRemoveWhitespace("\n %s: {\n \"bytesInOutput\": %d\n %s}"), helpers.QuoteForJSON(c.graph.Files[sourceIndex].InputFile.Source.PrettyPaths.Select(c.options.MetafilePathStyle), c.options.ASCIIOnly), count, c.generateExtraDataForFileJS(sourceIndex))) } if len(metaOrder) > 0 { - jMeta.AddString("\n ") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } - jMeta.AddString(fmt.Sprintf("},\n \"bytes\": %d\n }", finalOutputSize)) + jMeta.AddString(fmt.Sprintf(c.options.MetafileFormat.MaybeRemoveWhitespace("},\n \"bytes\": %d\n }"), finalOutputSize)) return jMeta } } @@ -6232,6 +6242,7 @@ SourceMap: c.options.SourceMap, UnsupportedFeatures: c.options.UnsupportedCSSFeatures, NeedsMetafile: c.options.NeedsMetafile, + MetafileFormat: c.options.MetafileFormat, LocalNames: c.mangledProps, } @@ -6288,6 +6299,7 @@ LineLimit: c.options.LineLimit, ASCIIOnly: c.options.ASCIIOnly, NeedsMetafile: c.options.NeedsMetafile, + MetafileFormat: c.options.MetafileFormat, }) jsonMetadataImports = result.JSONMetadataImports if len(result.CSS) > 0 { @@ -6302,7 +6314,7 @@ jMeta := helpers.Joiner{} if c.options.NeedsMetafile { isFirstMeta := true - jMeta.AddString("{\n \"imports\": [") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("{\n \"imports\": [")) for _, json := range jsonMetadataImports { if isFirstMeta { isFirstMeta = false @@ -6322,7 +6334,7 @@ } } if !isFirstMeta { - jMeta.AddString("\n ") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } if chunk.isEntryPoint { file := &c.graph.Files[chunk.sourceIndex] @@ -6331,13 +6343,14 @@ // importing CSS into JavaScript. We want this to be a 1:1 relationship // and there is already an output file for the JavaScript entry point. if _, ok := file.InputFile.Repr.(*graph.CSSRepr); ok { - jMeta.AddString(fmt.Sprintf("],\n \"entryPoint\": %s,\n \"inputs\": {", + jMeta.AddString(fmt.Sprintf( + c.options.MetafileFormat.MaybeRemoveWhitespace("],\n \"entryPoint\": %s,\n \"inputs\": {"), helpers.QuoteForJSON(file.InputFile.Source.PrettyPaths.Select(c.options.MetafilePathStyle), c.options.ASCIIOnly))) } else { - jMeta.AddString("],\n \"inputs\": {") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("],\n \"inputs\": {")) } } else { - jMeta.AddString("],\n \"inputs\": {") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("],\n \"inputs\": {")) } } @@ -6440,14 +6453,15 @@ } else { jMeta.AddString(",") } - jMeta.AddString(fmt.Sprintf("\n %s: {\n \"bytesInOutput\": %d\n }", + jMeta.AddString(fmt.Sprintf( + c.options.MetafileFormat.MaybeRemoveWhitespace("\n %s: {\n \"bytesInOutput\": %d\n }"), helpers.QuoteForJSON(c.graph.Files[compileResult.sourceIndex.GetIndex()].InputFile.Source.PrettyPaths.Select(c.options.MetafilePathStyle), c.options.ASCIIOnly), c.accurateFinalByteCount(pieces[i], finalRelDir))) } if len(compileResults) > 0 { - jMeta.AddString("\n ") + jMeta.AddString(c.options.MetafileFormat.MaybeRemoveWhitespace("\n ")) } - jMeta.AddString(fmt.Sprintf("},\n \"bytes\": %d\n }", finalOutputSize)) + jMeta.AddString(fmt.Sprintf(c.options.MetafileFormat.MaybeRemoveWhitespace("},\n \"bytes\": %d\n }"), finalOutputSize)) return jMeta } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/lib/shared/common.ts new/esbuild-0.27.4/lib/shared/common.ts --- old/esbuild-0.27.3/lib/shared/common.ts 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/lib/shared/common.ts 2026-03-12 15:12:56.000000000 +0100 @@ -1,5 +1,6 @@ import type * as types from "./types" import * as protocol from "./stdio_protocol" +import { JSON_parse } from "./uint8array_json_parser" declare const ESBUILD_VERSION: string @@ -952,7 +953,7 @@ const originalErrors = result.errors.slice() const originalWarnings = result.warnings.slice() if (response!.outputFiles) result.outputFiles = response!.outputFiles.map(convertOutputFiles) - if (response!.metafile) result.metafile = JSON.parse(response!.metafile) + if (response!.metafile) result.metafile = parseJSON(response!.metafile) if (response!.mangleCache) result.mangleCache = response!.mangleCache if (response!.writeToStdout !== void 0) console.log(protocol.decodeUTF8(response!.writeToStdout).replace(/\n$/, '')) runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => { @@ -1858,3 +1859,20 @@ if (regexp.flags) result = `(?${regexp.flags})${result}` return result } + +function parseJSON(bytes: Uint8Array): any { + let text: string + try { + // This may fail in V8 with the error "Cannot create a string longer than + // 0x1fffffe8 characters". Other JS engines may have similar limitations. + text = protocol.decodeUTF8(bytes) + } catch { + // In that case, we attempt to parse the JSON ourselves directly from the + // Uint8Array. This bypasses the string length limit as we no longer need + // to construct a string that's the length of the input. However, doing + // this is likely significantly slower (perhaps around ~4x slower?), so we + // only do it if we have to. + return JSON_parse(bytes) + } + return JSON.parse(text) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/lib/shared/stdio_protocol.ts new/esbuild-0.27.4/lib/shared/stdio_protocol.ts --- old/esbuild-0.27.3/lib/shared/stdio_protocol.ts 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/lib/shared/stdio_protocol.ts 2026-03-12 15:12:56.000000000 +0100 @@ -51,7 +51,7 @@ errors: types.Message[] warnings: types.Message[] outputFiles?: BuildOutputFile[] - metafile?: string + metafile?: Uint8Array mangleCache?: Record<string, string | false> writeToStdout?: Uint8Array } @@ -445,10 +445,12 @@ `) export function readUInt32LE(buffer: Uint8Array, offset: number): number { - return buffer[offset++] | + return ( + buffer[offset++] | (buffer[offset++] << 8) | (buffer[offset++] << 16) | (buffer[offset++] << 24) + ) >>> 0 } function writeUInt32LE(buffer: Uint8Array, value: number, offset: number): void { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/lib/shared/uint8array_json_parser.ts new/esbuild-0.27.4/lib/shared/uint8array_json_parser.ts --- old/esbuild-0.27.3/lib/shared/uint8array_json_parser.ts 1970-01-01 01:00:00.000000000 +0100 +++ new/esbuild-0.27.4/lib/shared/uint8array_json_parser.ts 2026-03-12 15:12:56.000000000 +0100 @@ -0,0 +1,415 @@ +const enum State { + TopLevel, + Array, + Object, +} + +const enum Char { + // Punctuation + Newline = 0x0A, + Space = 0x20, + Quote = 0x22, + Plus = 0x2B, + Comma = 0x2C, + Minus = 0x2D, + Dot = 0x2E, + Slash = 0x2F, + Colon = 0x3A, + OpenBracket = 0x5B, + Backslash = 0x5C, + CloseBracket = 0x5D, + OpenBrace = 0x7B, + CloseBrace = 0x7D, + + // Numbers + Digit0 = 0x30, + Digit1 = 0x31, + Digit2 = 0x32, + Digit3 = 0x33, + Digit4 = 0x34, + Digit5 = 0x35, + Digit6 = 0x36, + Digit7 = 0x37, + Digit8 = 0x38, + Digit9 = 0x39, + + // Uppercase letters + UpperA = 0x41, + UpperE = 0x45, + UpperF = 0x46, + + // Lowercase letters + LowerA = 0x61, + LowerB = 0x62, + LowerE = 0x65, + LowerF = 0x66, + LowerL = 0x6C, + LowerN = 0x6E, + LowerR = 0x72, + LowerS = 0x73, + LowerT = 0x74, + LowerU = 0x75, +} + +const fromCharCode = String.fromCharCode + +function throwSyntaxError(bytes: Uint8Array, index: number, message?: string): void { + const c = bytes[index] + let line = 1 + let column = 0 + + for (let i = 0; i < index; i++) { + if (bytes[i] === Char.Newline) { + line++ + column = 0 + } else { + column++ + } + } + + throw new SyntaxError( + message ? message : + index === bytes.length ? 'Unexpected end of input while parsing JSON' : + c >= 0x20 && c <= 0x7E ? `Unexpected character ${fromCharCode(c)} in JSON at position ${index} (line ${line}, column ${column})` : + `Unexpected byte 0x${c.toString(16)} in JSON at position ${index} (line ${line}, column ${column})`) +} + +export function JSON_parse(bytes: Uint8Array): any { + if (!(bytes instanceof Uint8Array)) { + throw new Error(`JSON input must be a Uint8Array`) + } + + const propertyStack: (string | null)[] = [] + const objectStack: any[] = [] + const stateStack: State[] = [] + const length = bytes.length + let property: string | null = null + let state = State.TopLevel + let object: any + let i = 0 + + while (i < length) { + let c = bytes[i++] + + // Skip whitespace + if (c <= Char.Space) { + continue + } + + let value: any + + // Validate state inside objects + if (state === State.Object && property === null && c !== Char.Quote && c !== Char.CloseBrace) { + throwSyntaxError(bytes, --i) + } + + switch (c) { + // True + case Char.LowerT: { + if (bytes[i++] !== Char.LowerR || bytes[i++] !== Char.LowerU || bytes[i++] !== Char.LowerE) { + throwSyntaxError(bytes, --i) + } + + value = true + break + } + + // False + case Char.LowerF: { + if (bytes[i++] !== Char.LowerA || bytes[i++] !== Char.LowerL || bytes[i++] !== Char.LowerS || bytes[i++] !== Char.LowerE) { + throwSyntaxError(bytes, --i) + } + + value = false + break + } + + // Null + case Char.LowerN: { + if (bytes[i++] !== Char.LowerU || bytes[i++] !== Char.LowerL || bytes[i++] !== Char.LowerL) { + throwSyntaxError(bytes, --i) + } + + value = null + break + } + + // Number begin + case Char.Minus: + case Char.Dot: + case Char.Digit0: + case Char.Digit1: + case Char.Digit2: + case Char.Digit3: + case Char.Digit4: + case Char.Digit5: + case Char.Digit6: + case Char.Digit7: + case Char.Digit8: + case Char.Digit9: { + let index = i + value = fromCharCode(c) + c = bytes[i] + + // Scan over the rest of the number + while (true) { + switch (c) { + case Char.Plus: + case Char.Minus: + case Char.Dot: + case Char.Digit0: + case Char.Digit1: + case Char.Digit2: + case Char.Digit3: + case Char.Digit4: + case Char.Digit5: + case Char.Digit6: + case Char.Digit7: + case Char.Digit8: + case Char.Digit9: + case Char.LowerE: + case Char.UpperE: { + value += fromCharCode(c) + c = bytes[++i] + continue + } + } + + // Number end + break + } + + // Convert the string to a number + value = +value + + // Validate the number + if (isNaN(value)) { + throwSyntaxError(bytes, --index, 'Invalid number') + } + + break + } + + // String begin + case Char.Quote: { + value = '' + + while (true) { + if (i >= length) { + throwSyntaxError(bytes, length) + } + + c = bytes[i++] + + // String end + if (c === Char.Quote) { + break + } + + // Escape sequence + else if (c === Char.Backslash) { + switch (bytes[i++]) { + // Normal escape sequence + case Char.Quote: value += '\"'; break + case Char.Slash: value += '\/'; break + case Char.Backslash: value += '\\'; break + case Char.LowerB: value += '\b'; break + case Char.LowerF: value += '\f'; break + case Char.LowerN: value += '\n'; break + case Char.LowerR: value += '\r'; break + case Char.LowerT: value += '\t'; break + + // Unicode escape sequence + case Char.LowerU: { + let code = 0 + for (let j = 0; j < 4; j++) { + c = bytes[i++] + code <<= 4 + if (c >= Char.Digit0 && c <= Char.Digit9) code |= c - Char.Digit0 + else if (c >= Char.LowerA && c <= Char.LowerF) code |= c + (10 - Char.LowerA) + else if (c >= Char.UpperA && c <= Char.UpperF) code |= c + (10 - Char.UpperA) + else throwSyntaxError(bytes, --i) + } + value += fromCharCode(code) + break + } + + // Invalid escape sequence + default: throwSyntaxError(bytes, --i); break + } + } + + // ASCII text + else if (c <= 0x7F) { + value += fromCharCode(c) + } + + // 2-byte UTF-8 sequence + else if ((c & 0xE0) === 0xC0) { + value += fromCharCode(((c & 0x1F) << 6) | (bytes[i++] & 0x3F)) + } + + // 3-byte UTF-8 sequence + else if ((c & 0xF0) === 0xE0) { + value += fromCharCode(((c & 0x0F) << 12) | ((bytes[i++] & 0x3F) << 6) | (bytes[i++] & 0x3F)) + } + + // 4-byte UTF-8 sequence + else if ((c & 0xF8) == 0xF0) { + let codePoint = ((c & 0x07) << 18) | ((bytes[i++] & 0x3F) << 12) | ((bytes[i++] & 0x3F) << 6) | (bytes[i++] & 0x3F) + if (codePoint > 0xFFFF) { + codePoint -= 0x10000 + value += fromCharCode(((codePoint >> 10) & 0x3FF) | 0xD800) + codePoint = 0xDC00 | (codePoint & 0x3FF) + } + value += fromCharCode(codePoint) + } + } + + // Force V8's rope representation to be flattened to compact the string and avoid running out of memory + value[0] + break + } + + // Array begin + case Char.OpenBracket: { + value = [] + + // Push the stack + propertyStack.push(property) + objectStack.push(object) + stateStack.push(state) + + // Enter the array + property = null + object = value + state = State.Array + continue + } + + // Object begin + case Char.OpenBrace: { + value = {} + + // Push the stack + propertyStack.push(property) + objectStack.push(object) + stateStack.push(state) + + // Enter the object + property = null + object = value + state = State.Object + continue + } + + // Array end + case Char.CloseBracket: { + if (state !== State.Array) { + throwSyntaxError(bytes, --i) + } + + // Leave the array + value = object + + // Pop the stack + property = propertyStack.pop() as string | null + object = objectStack.pop() + state = stateStack.pop() as State + break + } + + // Object end + case Char.CloseBrace: { + if (state !== State.Object) { + throwSyntaxError(bytes, --i) + } + + // Leave the object + value = object + + // Pop the stack + property = propertyStack.pop() as string | null + object = objectStack.pop() + state = stateStack.pop() as State + break + } + + default: { + throwSyntaxError(bytes, --i) + } + } + + c = bytes[i] + + // Skip whitespace + while (c <= Char.Space) { + c = bytes[++i] + } + + switch (state) { + case State.TopLevel: { + // Expect the end of the input + if (i === length) { + return value + } + + break + } + + case State.Array: { + object.push(value) + + // Check for more values + if (c === Char.Comma) { + i++ + continue + } + + // Expect the end of the array + if (c === Char.CloseBracket) { + continue + } + + break + } + + case State.Object: { + // Property + if (property === null) { + property = value + + // Expect a colon + if (c === Char.Colon) { + i++ + continue + } + } + + // Value + else { + object[property] = value + property = null + + // Check for more values + if (c === Char.Comma) { + i++ + continue + } + + // Expect the end of the object + if (c === Char.CloseBrace) { + continue + } + } + + break + } + } + + // It's an error if we get here + break + } + + throwSyntaxError(bytes, i) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/aix-ppc64/package.json new/esbuild-0.27.4/npm/@esbuild/aix-ppc64/package.json --- old/esbuild-0.27.3/npm/@esbuild/aix-ppc64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/aix-ppc64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/aix-ppc64", - "version": "0.27.3", + "version": "0.27.4", "description": "The IBM AIX PowerPC 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/android-arm/package.json new/esbuild-0.27.4/npm/@esbuild/android-arm/package.json --- old/esbuild-0.27.3/npm/@esbuild/android-arm/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/android-arm/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/android-arm", - "version": "0.27.3", + "version": "0.27.4", "description": "A WebAssembly shim for esbuild on Android ARM.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/android-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/android-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/android-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/android-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/android-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Android ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/android-x64/package.json new/esbuild-0.27.4/npm/@esbuild/android-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/android-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/android-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/android-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "A WebAssembly shim for esbuild on Android x64.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/darwin-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/darwin-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/darwin-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/darwin-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/darwin-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The macOS ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/darwin-x64/package.json new/esbuild-0.27.4/npm/@esbuild/darwin-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/darwin-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/darwin-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/darwin-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The macOS 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/freebsd-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/freebsd-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/freebsd-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/freebsd-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/freebsd-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The FreeBSD ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/freebsd-x64/package.json new/esbuild-0.27.4/npm/@esbuild/freebsd-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/freebsd-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/freebsd-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/freebsd-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The FreeBSD 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-arm/package.json new/esbuild-0.27.4/npm/@esbuild/linux-arm/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-arm/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-arm/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-arm", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux ARM binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/linux-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-ia32/package.json new/esbuild-0.27.4/npm/@esbuild/linux-ia32/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-ia32/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-ia32/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-ia32", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux 32-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-loong64/package.json new/esbuild-0.27.4/npm/@esbuild/linux-loong64/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-loong64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-loong64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-loong64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux LoongArch 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-mips64el/package.json new/esbuild-0.27.4/npm/@esbuild/linux-mips64el/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-mips64el/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-mips64el/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-mips64el", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux MIPS 64-bit Little Endian binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-ppc64/package.json new/esbuild-0.27.4/npm/@esbuild/linux-ppc64/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-ppc64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-ppc64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-ppc64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux PowerPC 64-bit Little Endian binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-riscv64/package.json new/esbuild-0.27.4/npm/@esbuild/linux-riscv64/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-riscv64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-riscv64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-riscv64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux RISC-V 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-s390x/package.json new/esbuild-0.27.4/npm/@esbuild/linux-s390x/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-s390x/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-s390x/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-s390x", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux IBM Z 64-bit Big Endian binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/linux-x64/package.json new/esbuild-0.27.4/npm/@esbuild/linux-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/linux-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/linux-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Linux 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/netbsd-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/netbsd-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/netbsd-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/netbsd-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/netbsd-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The NetBSD ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/netbsd-x64/package.json new/esbuild-0.27.4/npm/@esbuild/netbsd-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/netbsd-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/netbsd-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/netbsd-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The NetBSD AMD64 binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/openbsd-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/openbsd-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/openbsd-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/openbsd-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/openbsd-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The OpenBSD ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/openbsd-x64/package.json new/esbuild-0.27.4/npm/@esbuild/openbsd-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/openbsd-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/openbsd-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/openbsd-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The OpenBSD 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/openharmony-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/openharmony-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/openharmony-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/openharmony-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/openharmony-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "A WebAssembly shim for esbuild on OpenHarmony ARM64.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/sunos-x64/package.json new/esbuild-0.27.4/npm/@esbuild/sunos-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/sunos-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/sunos-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/sunos-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The illumos 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/wasi-preview1/package.json new/esbuild-0.27.4/npm/@esbuild/wasi-preview1/package.json --- old/esbuild-0.27.3/npm/@esbuild/wasi-preview1/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/wasi-preview1/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/wasi-preview1", - "version": "0.27.3", + "version": "0.27.4", "description": "The WASI (WebAssembly System Interface) preview 1 binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/win32-arm64/package.json new/esbuild-0.27.4/npm/@esbuild/win32-arm64/package.json --- old/esbuild-0.27.3/npm/@esbuild/win32-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/win32-arm64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/win32-arm64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Windows ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/win32-ia32/package.json new/esbuild-0.27.4/npm/@esbuild/win32-ia32/package.json --- old/esbuild-0.27.3/npm/@esbuild/win32-ia32/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/win32-ia32/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/win32-ia32", - "version": "0.27.3", + "version": "0.27.4", "description": "The Windows 32-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/@esbuild/win32-x64/package.json new/esbuild-0.27.4/npm/@esbuild/win32-x64/package.json --- old/esbuild-0.27.3/npm/@esbuild/win32-x64/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/@esbuild/win32-x64/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/win32-x64", - "version": "0.27.3", + "version": "0.27.4", "description": "The Windows 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/esbuild/package.json new/esbuild-0.27.4/npm/esbuild/package.json --- old/esbuild-0.27.3/npm/esbuild/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/esbuild/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "esbuild", - "version": "0.27.3", + "version": "0.27.4", "description": "An extremely fast JavaScript and CSS bundler and minifier.", "repository": { "type": "git", @@ -18,32 +18,32 @@ "esbuild": "bin/esbuild" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" }, "license": "MIT" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/npm/esbuild-wasm/package.json new/esbuild-0.27.4/npm/esbuild-wasm/package.json --- old/esbuild-0.27.3/npm/esbuild-wasm/package.json 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/npm/esbuild-wasm/package.json 2026-03-12 15:12:56.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "esbuild-wasm", - "version": "0.27.3", + "version": "0.27.4", "description": "The cross-platform WebAssembly binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/pkg/api/api_impl.go new/esbuild-0.27.4/pkg/api/api_impl.go --- old/esbuild-0.27.3/pkg/api/api_impl.go 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/pkg/api/api_impl.go 2026-03-12 15:12:56.000000000 +0100 @@ -169,7 +169,7 @@ case LegalCommentsExternal: return config.LegalCommentsExternalWithoutComment default: - panic("Invalid source map") + panic("Invalid legal comments") } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.3/version.txt new/esbuild-0.27.4/version.txt --- old/esbuild-0.27.3/version.txt 2026-02-05 22:52:09.000000000 +0100 +++ new/esbuild-0.27.4/version.txt 2026-03-12 15:12:56.000000000 +0100 @@ -1 +1 @@ -0.27.3 +0.27.4
