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-02-25 21:10:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/esbuild (Old) and /work/SRC/openSUSE:Factory/.esbuild.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "esbuild" Wed Feb 25 21:10:52 2026 rev:20 rq:1334917 version:0.27.3 Changes: -------- --- /work/SRC/openSUSE:Factory/esbuild/esbuild.changes 2026-01-19 18:40:52.868950246 +0100 +++ /work/SRC/openSUSE:Factory/.esbuild.new.1977/esbuild.changes 2026-02-25 21:11:20.240067494 +0100 @@ -1,0 +2,9 @@ +Wed Feb 25 07:17:39 UTC 2026 - Avindra Goolcharan <[email protected]> + +- update to 0.27.3: + * Preserve URL fragments in data URLs (#4370) + * Parse and print CSS @scope rules (#4322) + * Fix a minification bug with lowering of for await (#4378, #4385) + * Update the Go compiler from v1.25.5 to v1.25.7 (#4383, #4388) + +------------------------------------------------------------------- Old: ---- esbuild-0.27.2.tar.gz New: ---- esbuild-0.27.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ esbuild.spec ++++++ --- /var/tmp/diff_new_pack.4s1GcZ/_old 2026-02-25 21:11:20.744088306 +0100 +++ /var/tmp/diff_new_pack.4s1GcZ/_new 2026-02-25 21:11:20.744088306 +0100 @@ -24,7 +24,7 @@ %global tag v%{version} %global extractdir0 esbuild-%{version} Name: esbuild -Version: 0.27.2 +Version: 0.27.3 Release: 0 Summary: A JavaScript bundler written for speed License: MIT ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.4s1GcZ/_old 2026-02-25 21:11:20.788090123 +0100 +++ /var/tmp/diff_new_pack.4s1GcZ/_new 2026-02-25 21:11:20.792090287 +0100 @@ -1,6 +1,6 @@ -mtime: 1768778776 -commit: 6d3deea53d3800dcc56ccb1bef7fa7e0e803ace2e7f264190788e646e9e368d2 +mtime: 1772003968 +commit: 857bb2499ad7e712a526b7aefa7a8c66e9973dbc985022a44d0f5807e709f8ec url: https://src.opensuse.org/javascript/esbuild.git -revision: 6d3deea53d3800dcc56ccb1bef7fa7e0e803ace2e7f264190788e646e9e368d2 +revision: 857bb2499ad7e712a526b7aefa7a8c66e9973dbc985022a44d0f5807e709f8ec 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-02-25 08:20:09.000000000 +0100 @@ -0,0 +1 @@ +.osc ++++++ esbuild-0.27.2.tar.gz -> esbuild-0.27.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/CHANGELOG.md new/esbuild-0.27.3/CHANGELOG.md --- old/esbuild-0.27.2/CHANGELOG.md 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/CHANGELOG.md 2026-02-05 22:52:09.000000000 +0100 @@ -1,5 +1,85 @@ # Changelog +## 0.27.3 + +* Preserve URL fragments in data URLs ([#4370](https://github.com/evanw/esbuild/issues/4370)) + + Consider the following HTML, CSS, and SVG: + + * `index.html`: + + ```html + <!DOCTYPE html> + <html> + <head><link rel="stylesheet" href="icons.css"></head> + <body><div class="triangle"></div></body> + </html> + ``` + + * `icons.css`: + + ```css + .triangle { + width: 10px; + height: 10px; + background: currentColor; + clip-path: url(./triangle.svg#x); + } + ``` + + * `triangle.svg`: + + ```xml + <svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <clipPath id="x"> + <path d="M0 0H10V10Z"/> + </clipPath> + </defs> + </svg> + ``` + + The CSS uses a URL fragment (the `#x`) to reference the `clipPath` element in the SVG file. Previously esbuild's CSS bundler didn't preserve the URL fragment when bundling the SVG using the `dataurl` loader, which broke the bundled CSS. With this release, esbuild will now preserve the URL fragment in the bundled CSS: + + ```css + /* icons.css */ + .triangle { + width: 10px; + height: 10px; + background: currentColor; + clip-path: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="x"><path d="M0 0H10V10Z"/></clipPath></defs></svg>#x'); + } + ``` + +* Parse and print CSS `@scope` rules ([#4322](https://github.com/evanw/esbuild/issues/4322)) + + This release includes dedicated support for parsing `@scope` rules in CSS. These rules include optional "start" and "end" selector lists. One important consequence of this is that the local/global status of names in selector lists is now respected, which improves the correctness of esbuild's support for [CSS modules](https://esbuild.github.io/content-types/#local-css). Minification of selectors inside `@scope` rules has also improved slightly. + + Here's an example: + + ```css + /* Original code */ + @scope (:global(.foo)) to (:local(.bar)) { + .bar { + color: red; + } + } + + /* Old output (with --loader=local-css --minify) */ + @scope (:global(.foo)) to (:local(.bar)){.o{color:red}} + + /* New output (with --loader=local-css --minify) */ + @scope(.foo)to (.o){.o{color:red}} + ``` + +* Fix a minification bug with lowering of `for await` ([#4378](https://github.com/evanw/esbuild/pull/4378), [#4385](https://github.com/evanw/esbuild/pull/4385)) + + This release fixes a bug where the minifier would incorrectly strip the variable in the automatically-generated `catch` clause of lowered `for await` loops. The code that generated the loop previously failed to mark the internal variable references as used. + +* Update the Go compiler from v1.25.5 to v1.25.7 ([#4383](https://github.com/evanw/esbuild/issues/4383), [#4388](https://github.com/evanw/esbuild/pull/4388)) + + This PR was contributed by [@MikeWillCook](https://github.com/MikeWillCook). + ## 0.27.2 * Allow import path specifiers starting with `#/` ([#4361](https://github.com/evanw/esbuild/pull/4361)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/cmd/esbuild/version.go new/esbuild-0.27.3/cmd/esbuild/version.go --- old/esbuild-0.27.2/cmd/esbuild/version.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/cmd/esbuild/version.go 2026-02-05 22:52:09.000000000 +0100 @@ -1,3 +1,3 @@ package main -const esbuildVersion = "0.27.2" +const esbuildVersion = "0.27.3" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/compat-table/package-lock.json new/esbuild-0.27.3/compat-table/package-lock.json --- old/esbuild-0.27.2/compat-table/package-lock.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/compat-table/package-lock.json 2026-02-05 22:52:09.000000000 +0100 @@ -5,16 +5,17 @@ "packages": { "": { "dependencies": { - "@mdn/browser-compat-data": "^7.1.20", + "@mdn/browser-compat-data": "7.3.0", "@types/caniuse-lite": "1.0.1", "@types/node": "25.0.2", - "caniuse-lite": "^1.0.30001754" + "caniuse-lite": "1.0.30001768" } }, "node_modules/@mdn/browser-compat-data": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-7.1.20.tgz", - "integrity": "sha512-ICINlHmfC/D1XSeo4vFRILo/ZTcNF5GSqht6G1vFECqfzJijuRDSr4b+TrvIJpGDjsu7FchP5Ffx4+03WlUe3g==" + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-7.3.0.tgz", + "integrity": "sha512-B7X53zLkrQOVNzsWg4d+iE5vbrreOYB9H/2Ikeit9LPb3tqRNRsEAxysQduFLODBJBSgFGr2FkJLq7tMQkqLZQ==", + "license": "CC0-1.0" }, "node_modules/@types/caniuse-lite": { "version": "1.0.1", @@ -30,9 +31,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "version": "1.0.30001768", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001768.tgz", + "integrity": "sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==", "funding": [ { "type": "opencollective", @@ -46,7 +47,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/undici-types": { "version": "7.16.0", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/compat-table/package.json new/esbuild-0.27.3/compat-table/package.json --- old/esbuild-0.27.2/compat-table/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/compat-table/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,12 +1,11 @@ { "githubDependencies": { - "kangax/compat-table": "70d05d4de500f81e5612aafdee014e1a8419fa75", - "williamkapke/node-compat-table": "4a9a0ac491c12eb2e70b70126cd9486100c28e12" + "compat-table/compat-table": "f12538fe11c48c4fd35d6cdc7789653e10871b90" }, "dependencies": { - "@mdn/browser-compat-data": "^7.1.20", + "@mdn/browser-compat-data": "7.3.0", "@types/caniuse-lite": "1.0.1", "@types/node": "25.0.2", - "caniuse-lite": "^1.0.30001754" + "caniuse-lite": "1.0.30001768" } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/compat-table/src/compat-table.ts new/esbuild-0.27.3/compat-table/src/compat-table.ts --- old/esbuild-0.27.2/compat-table/src/compat-table.ts 1970-01-01 01:00:00.000000000 +0100 +++ new/esbuild-0.27.3/compat-table/src/compat-table.ts 2026-02-05 22:52:09.000000000 +0100 @@ -0,0 +1,197 @@ +// This file processes the data contained in https://github.com/kangax/compat-table + +import fs = require('fs') +import path = require('path') + +import es5 = require('../repos/compat-table/compat-table/data-es5.js') +import es6 = require('../repos/compat-table/compat-table/data-es6.js') +import stage1to3 = require('../repos/compat-table/compat-table/data-esnext.js') +import stage4 = require('../repos/compat-table/compat-table/data-es2016plus.js') +import environments = require('../repos/compat-table/compat-table/environments.json') +import parseEnvsVersions = require('../repos/compat-table/compat-table/build-utils/parse-envs-versions.js') +import interpolateAllResults = require('../repos/compat-table/compat-table/build-utils/interpolate-all-results.js') +import { Engine, JSFeature, SupportMap } from './index' + +interpolateAllResults(es5.tests, environments) +interpolateAllResults(es6.tests, environments) +interpolateAllResults(stage1to3.tests, environments) +interpolateAllResults(stage4.tests, environments) + +const features: Record<string, JSFeature> = { + // ES5 features + 'Object/array literal extensions: Getter accessors': 'ObjectAccessors', + 'Object/array literal extensions: Setter accessors': 'ObjectAccessors', + + // ES6 features + 'arrow functions': 'Arrow', + 'class': 'Class', + 'const': 'ConstAndLet', + 'default function parameters': 'DefaultArgument', + 'destructuring, assignment': 'Destructuring', + 'destructuring, declarations': 'Destructuring', + 'destructuring, parameters': 'Destructuring', + 'for..of loops': 'ForOf', + 'function "name" property: isn\'t writable, is configurable': 'FunctionNameConfigurable', + 'generators': 'Generator', + 'let': 'ConstAndLet', + 'new.target': 'NewTarget', + 'object literal extensions': 'ObjectExtensions', + 'RegExp "y" and "u" flags': 'RegexpStickyAndUnicodeFlags', + 'rest parameters': 'RestArgument', + 'spread syntax for iterable objects': 'ArraySpread', + 'template literals': 'TemplateLiteral', + 'Unicode code point escapes': 'UnicodeEscapes', + + // >ES6 features + 'async functions': 'AsyncAwait', + 'Asynchronous Iterators: async generators': 'AsyncGenerator', + 'Asynchronous Iterators: for-await-of loops': 'ForAwait', + 'BigInt: basic functionality': 'Bigint', + 'exponentiation (**) operator': 'ExponentOperator', + 'Hashbang Grammar': 'Hashbang', + 'Logical Assignment': 'LogicalAssignment', + 'nested rest destructuring, declarations': 'NestedRestBinding', + 'nested rest destructuring, parameters': 'NestedRestBinding', + 'nullish coalescing operator (??)': 'NullishCoalescing', + 'object rest/spread properties': 'ObjectRestSpread', + 'optional catch binding': 'OptionalCatchBinding', + 'optional chaining operator (?.)': 'OptionalChain', + 'RegExp Lookbehind Assertions': 'RegexpLookbehindAssertions', + 'RegExp named capture groups': 'RegexpNamedCaptureGroups', + 'RegExp Unicode Property Escapes': 'RegexpUnicodePropertyEscapes', + 's (dotAll) flag for regular expressions': 'RegexpDotAllFlag', + 'Explicit Resource Management': 'Using', + + // Public fields + 'instance class fields: computed instance class fields': 'ClassField', + 'instance class fields: public instance class fields': 'ClassField', + 'static class fields: computed static class fields': 'ClassStaticField', + 'static class fields: public static class fields': 'ClassStaticField', + + // Private fields + 'instance class fields: optional deep private instance class fields access': 'ClassPrivateField', + 'instance class fields: optional private instance class fields access': 'ClassPrivateField', + 'instance class fields: private instance class fields basic support': 'ClassPrivateField', + 'instance class fields: private instance class fields initializers': 'ClassPrivateField', + 'static class fields: private static class fields': 'ClassPrivateStaticField', + + // Private methods + 'private class methods: private accessor properties': 'ClassPrivateAccessor', + 'private class methods: private instance methods': 'ClassPrivateMethod', + 'private class methods: private static accessor properties': 'ClassPrivateStaticAccessor', + 'private class methods: private static methods': 'ClassPrivateStaticMethod', + + // Private "in" + 'Ergonomic brand checks for private fields': 'ClassPrivateBrandCheck', +} + +const environmentToEngine: Record<string, Engine> = { + // The JavaScript standard + 'es': 'ES', + + // Common JavaScript runtimes + 'chrome': 'Chrome', + 'edge': 'Edge', + 'firefox': 'Firefox', + 'ie': 'IE', + 'ios': 'IOS', + 'node': 'Node', + 'opera': 'Opera', + 'safari': 'Safari', + + // Uncommon JavaScript runtimes + 'deno': 'Deno', + 'hermes': 'Hermes', + 'rhino': 'Rhino', +} + +const subtestsToSkip: Record<string, boolean> = { + // Safari supposedly doesn't throw an error for duplicate identifiers in + // a function parameter list. The failing test case looks like this: + // + // var f = function f([id, id]) { return id } + // + // However, this code will cause a compile error with esbuild so it's not + // possible to encounter this issue when running esbuild-generated code in + // Safari. I'm ignoring this test since Safari's destructuring otherwise + // works fine so destructuring shouldn't be forbidden when building for + // Safari. + 'destructuring, parameters: duplicate identifier': true, +} + +const getValueOfTest = (value: boolean | { val: boolean }): boolean => { + // Handle values like this: + // + // { + // val: true, + // note_id: "ff-shorthand-methods", + // ... + // } + // + if (typeof value === 'object' && value !== null) { + return value.val === true + } + + // String values such as "flagged" are considered to be false + return value === true +} + +interface Test { + name: string + res: Record<string, boolean | { val: boolean }> + subtests?: { name: string, res: Record<string, boolean | { val: boolean }> }[] +} + +const updateMap = (map: SupportMap<JSFeature>, feature: JSFeature, engine: Engine, version: string, testName: string, passed: boolean): void => { + const engines = map[feature] || (map[feature] = {}) + const versions = engines[engine] || (engines[engine] = {}) + const support = versions[version] || (versions[version] = {}) + if (passed) { + support.passed = (support.passed || 0) + 1 + } else { + support.failed ||= new Set + support.failed.add(testName) + } +} + +const mergeIndividualTestResults = (map: SupportMap<JSFeature>, feature: JSFeature, testName: string, res: Record<string, boolean | { val: boolean }>): void => { + const environments = parseEnvsVersions(res) + for (const environment in environments) { + const engine = environmentToEngine[environment] + if (engine) { + for (const parsed of environments[environment]) { + const version = parsed.version.join('.') + if (/^\d+(?:\.\d+(?:\.\d+)?)?$/.test(version)) { + updateMap(map, feature, engine, version, testName, getValueOfTest(res[parsed.id])) + } + } + } + } +} + +const mergeAllTestResults = (map: SupportMap<JSFeature>, tests: Test[]): void => { + for (const test of tests) { + const feature = features[test.name] + if (feature) { + if (test.subtests) { + for (const subtest of test.subtests) { + const fullName = `${test.name}: ${subtest.name}` + if (subtestsToSkip[fullName]) continue + mergeIndividualTestResults(map, feature, fullName, subtest.res) + } + } else { + mergeIndividualTestResults(map, feature, test.name, test.res) + } + } else if (test.subtests) { + for (const subtest of test.subtests) { + const fullName = `${test.name}: ${subtest.name}` + if (subtestsToSkip[fullName]) continue + const feature = features[fullName] + if (feature) mergeIndividualTestResults(map, feature, fullName, subtest.res) + } + } + } +} + +export const js: SupportMap<JSFeature> = {} as SupportMap<JSFeature> +mergeAllTestResults(js, [...es5.tests, ...es6.tests, ...stage4.tests, ...stage1to3.tests]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/compat-table/src/index.ts new/esbuild-0.27.3/compat-table/src/index.ts --- old/esbuild-0.27.2/compat-table/src/index.ts 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/compat-table/src/index.ts 2026-02-05 22:52:09.000000000 +0100 @@ -335,11 +335,11 @@ // These dependencies are not published on npm and are instead pulled from GitHub (but pinned to a specific commit) installGitHubDependencies() -import('./kangax').then(kangax => { +import('./compat-table').then(compatTable => { const js: SupportMap<JSFeature> = {} as SupportMap<JSFeature> for (const feature in jsFeatures) js[feature as JSFeature] = {} - mergeSupportMaps(js, kangax.js) + mergeSupportMaps(js, compatTable.js) mergeSupportMaps(js, caniuse.js) mergeSupportMaps(js, mdn.js) @@ -564,8 +564,9 @@ mergePrefixMaps(cssPrefix, caniuse.cssPrefix) mergePrefixMaps(cssPrefix, mdn.cssPrefix) -// MDN data is wrong here, Firefox 127 still has gradient interpolation rendering bugs: https://bugzilla.mozilla.org/show_bug.cgi?id=1904106 -css.GradientInterpolation.Firefox = {} +// MDN data is wrong here, Firefox still had gradient interpolation rendering +// bugs until version 137: https://bugzilla.mozilla.org/show_bug.cgi?id=1904106 +css.GradientInterpolation.Firefox = { 137: { force: true } } const [cssVersionRanges] = supportMapToVersionRanges(css) generateTableForCSS(cssVersionRanges, cssPrefix) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/compat-table/src/kangax.ts new/esbuild-0.27.3/compat-table/src/kangax.ts --- old/esbuild-0.27.2/compat-table/src/kangax.ts 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/compat-table/src/kangax.ts 1970-01-01 01:00:00.000000000 +0100 @@ -1,257 +0,0 @@ -// This file processes the data contained in https://github.com/kangax/compat-table - -import fs = require('fs') -import path = require('path') - -import es5 = require('../repos/kangax/compat-table/data-es5.js') -import es6 = require('../repos/kangax/compat-table/data-es6.js') -import stage1to3 = require('../repos/kangax/compat-table/data-esnext.js') -import stage4 = require('../repos/kangax/compat-table/data-es2016plus.js') -import environments = require('../repos/kangax/compat-table/environments.json') -import parseEnvsVersions = require('../repos/kangax/compat-table/build-utils/parse-envs-versions.js') -import interpolateAllResults = require('../repos/kangax/compat-table/build-utils/interpolate-all-results.js') -import { Engine, JSFeature, SupportMap } from './index' - -interpolateAllResults(es5.tests, environments) -interpolateAllResults(es6.tests, environments) -interpolateAllResults(stage1to3.tests, environments) -interpolateAllResults(stage4.tests, environments) - -const features: Record<string, JSFeature> = { - // ES5 features - 'Object/array literal extensions: Getter accessors': 'ObjectAccessors', - 'Object/array literal extensions: Setter accessors': 'ObjectAccessors', - - // ES6 features - 'arrow functions': 'Arrow', - 'class': 'Class', - 'const': 'ConstAndLet', - 'default function parameters': 'DefaultArgument', - 'destructuring, assignment': 'Destructuring', - 'destructuring, declarations': 'Destructuring', - 'destructuring, parameters': 'Destructuring', - 'for..of loops': 'ForOf', - 'function "name" property: isn\'t writable, is configurable': 'FunctionNameConfigurable', - 'generators': 'Generator', - 'let': 'ConstAndLet', - 'new.target': 'NewTarget', - 'object literal extensions': 'ObjectExtensions', - 'RegExp "y" and "u" flags': 'RegexpStickyAndUnicodeFlags', - 'rest parameters': 'RestArgument', - 'spread syntax for iterable objects': 'ArraySpread', - 'template literals': 'TemplateLiteral', - 'Unicode code point escapes': 'UnicodeEscapes', - - // >ES6 features - 'async functions': 'AsyncAwait', - 'Asynchronous Iterators: async generators': 'AsyncGenerator', - 'Asynchronous Iterators: for-await-of loops': 'ForAwait', - 'BigInt: basic functionality': 'Bigint', - 'exponentiation (**) operator': 'ExponentOperator', - 'Hashbang Grammar': 'Hashbang', - 'Logical Assignment': 'LogicalAssignment', - 'nested rest destructuring, declarations': 'NestedRestBinding', - 'nested rest destructuring, parameters': 'NestedRestBinding', - 'nullish coalescing operator (??)': 'NullishCoalescing', - 'object rest/spread properties': 'ObjectRestSpread', - 'optional catch binding': 'OptionalCatchBinding', - 'optional chaining operator (?.)': 'OptionalChain', - 'RegExp Lookbehind Assertions': 'RegexpLookbehindAssertions', - 'RegExp named capture groups': 'RegexpNamedCaptureGroups', - 'RegExp Unicode Property Escapes': 'RegexpUnicodePropertyEscapes', - 's (dotAll) flag for regular expressions': 'RegexpDotAllFlag', - - // Public fields - 'instance class fields: computed instance class fields': 'ClassField', - 'instance class fields: public instance class fields': 'ClassField', - 'static class fields: computed static class fields': 'ClassStaticField', - 'static class fields: public static class fields': 'ClassStaticField', - - // Private fields - 'instance class fields: optional deep private instance class fields access': 'ClassPrivateField', - 'instance class fields: optional private instance class fields access': 'ClassPrivateField', - 'instance class fields: private instance class fields basic support': 'ClassPrivateField', - 'instance class fields: private instance class fields initializers': 'ClassPrivateField', - 'static class fields: private static class fields': 'ClassPrivateStaticField', - - // Private methods - 'private class methods: private accessor properties': 'ClassPrivateAccessor', - 'private class methods: private instance methods': 'ClassPrivateMethod', - 'private class methods: private static accessor properties': 'ClassPrivateStaticAccessor', - 'private class methods: private static methods': 'ClassPrivateStaticMethod', - - // Private "in" - 'Ergonomic brand checks for private fields': 'ClassPrivateBrandCheck', -} - -const environmentToEngine: Record<string, Engine> = { - // The JavaScript standard - 'es': 'ES', - - // Common JavaScript runtimes - 'chrome': 'Chrome', - 'edge': 'Edge', - 'firefox': 'Firefox', - 'ie': 'IE', - 'ios': 'IOS', - 'node': 'Node', - 'opera': 'Opera', - 'safari': 'Safari', - - // Uncommon JavaScript runtimes - 'deno': 'Deno', - 'hermes': 'Hermes', - 'rhino': 'Rhino', -} - -const subtestsToSkip: Record<string, boolean> = { - // Safari supposedly doesn't throw an error for duplicate identifiers in - // a function parameter list. The failing test case looks like this: - // - // var f = function f([id, id]) { return id } - // - // However, this code will cause a compile error with esbuild so it's not - // possible to encounter this issue when running esbuild-generated code in - // Safari. I'm ignoring this test since Safari's destructuring otherwise - // works fine so destructuring shouldn't be forbidden when building for - // Safari. - 'destructuring, parameters: duplicate identifier': true, -} - -const getValueOfTest = (value: boolean | { val: boolean }): boolean => { - // Handle values like this: - // - // { - // val: true, - // note_id: "ff-shorthand-methods", - // ... - // } - // - if (typeof value === 'object' && value !== null) { - return value.val === true - } - - // String values such as "flagged" are considered to be false - return value === true -} - -interface Test { - name: string - res: Record<string, boolean | { val: boolean }> - subtests?: { name: string, res: Record<string, boolean | { val: boolean }> }[] -} - -const updateMap = (map: SupportMap<JSFeature>, feature: JSFeature, engine: Engine, version: string, testName: string, passed: boolean): void => { - const engines = map[feature] || (map[feature] = {}) - const versions = engines[engine] || (engines[engine] = {}) - const support = versions[version] || (versions[version] = {}) - if (passed) { - support.passed = (support.passed || 0) + 1 - } else { - support.failed ||= new Set - support.failed.add(testName) - } -} - -const mergeIndividualTestResults = (map: SupportMap<JSFeature>, feature: JSFeature, testName: string, res: Record<string, boolean | { val: boolean }>, omit: Engine[]): void => { - const environments = parseEnvsVersions(res) - for (const environment in environments) { - const engine = environmentToEngine[environment] - if (engine && omit.indexOf(engine) < 0) { - for (const parsed of environments[environment]) { - const version = parsed.version.join('.') - if (/^\d+(?:\.\d+(?:\.\d+)?)?$/.test(version)) { - updateMap(map, feature, engine, version, testName, getValueOfTest(res[parsed.id])) - } - } - } - } -} - -const mergeAllTestResults = (map: SupportMap<JSFeature>, tests: Test[], { omit = [] }: { omit?: Engine[] } = {}): void => { - for (const test of tests) { - const feature = features[test.name] - if (feature) { - if (test.subtests) { - for (const subtest of test.subtests) { - const fullName = `${test.name}: ${subtest.name}` - if (subtestsToSkip[fullName]) continue - mergeIndividualTestResults(map, feature, fullName, subtest.res, omit) - } - } else { - mergeIndividualTestResults(map, feature, test.name, test.res, omit) - } - } else if (test.subtests) { - for (const subtest of test.subtests) { - const fullName = `${test.name}: ${subtest.name}` - if (subtestsToSkip[fullName]) continue - const feature = features[fullName] - if (feature) mergeIndividualTestResults(map, feature, fullName, subtest.res, omit) - } - } - } -} - -// Node compatibility data is handled separately because the data source -// https://github.com/williamkapke/node-compat-table is (for now at least) -// more up to date than https://github.com/kangax/compat-table. -const reformatNodeCompatTable = (): Test[] => { - const nodeCompatTableDir = path.join(__dirname, 'repos/williamkapke/node-compat-table/results/v8') - const testMap: Record<string, Test> = {} - const subtestMap: Record<string, Test> = {} - const tests: Test[] = [] - - // Format the data like the kangax table - for (const entry of fs.readdirSync(nodeCompatTableDir)) { - // Note: this omits data for the "0.x.y" releases because the data isn't clean - const match = /^([1-9]\d*\.\d+\.\d+)\.json$/.exec(entry) - if (match) { - const version = 'node' + match[1].replace(/\./g, '_') - const jsonPath = path.join(nodeCompatTableDir, entry) - const json = JSON.parse(fs.readFileSync(jsonPath, 'utf8')) - - for (const key in json) { - if (key.startsWith('ES')) { - const object = json[key] - - for (const key in object) { - const testResult = object[key] - const split = key.replace('<code>', '').replace('</code>', '').split('›') - - if (split.length === 2) { - let test = testMap[split[1]] - if (!test) { - test = testMap[split[1]] = { name: split[1], res: {} } - tests.push(test) - } - test.res[version] = testResult - } - - else if (split.length === 3) { - const subtestKey = `${split[1]}: ${split[2]}` - let subtest = subtestMap[subtestKey] - if (!subtest) { - let test = testMap[split[1]] - if (!test) { - test = testMap[split[1]] = { name: split[1], res: {} } - tests.push(test) - } - subtest = subtestMap[subtestKey] = { name: split[2], res: {} } - test.subtests ||= [] - test.subtests.push(subtest) - } - subtest.res[version] = testResult - } - } - } - } - } - } - - return tests -} - -export const js: SupportMap<JSFeature> = {} as SupportMap<JSFeature> - -mergeAllTestResults(js, [...es5.tests, ...es6.tests, ...stage4.tests, ...stage1to3.tests], { omit: ['Node'] }) -mergeAllTestResults(js, reformatNodeCompatTable()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/go.version new/esbuild-0.27.3/go.version --- old/esbuild-0.27.2/go.version 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/go.version 2026-02-05 22:52:09.000000000 +0100 @@ -1 +1 @@ -1.25.5 +1.25.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/bundler/bundler.go new/esbuild-0.27.3/internal/bundler/bundler.go --- old/esbuild-0.27.2/internal/bundler/bundler.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/bundler/bundler.go 2026-02-05 22:52:09.000000000 +0100 @@ -380,6 +380,10 @@ case config.LoaderDataURL: mimeType := guessMimeType(ext, source.Contents) url := helpers.EncodeStringAsShortestDataURL(mimeType, source.Contents) + if strings.HasPrefix(source.KeyPath.IgnoredSuffix, "#") { + // Preserve URL fragments as they are meaningful in CSS + url += source.KeyPath.IgnoredSuffix + } expr := js_ast.Expr{Data: &js_ast.EString{Value: helpers.StringToUTF16(url)}} ast := js_parser.LazyExportAST(args.log, source, js_parser.OptionsFromConfig(&args.options), expr, nil) ast.URLForCSS = url diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/bundler_tests/bundler_loader_test.go new/esbuild-0.27.3/internal/bundler_tests/bundler_loader_test.go --- old/esbuild-0.27.2/internal/bundler_tests/bundler_loader_test.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/bundler_tests/bundler_loader_test.go 2026-02-05 22:52:09.000000000 +0100 @@ -1905,3 +1905,29 @@ }, }) } + +// See: https://github.com/evanw/esbuild/issues/4370 +func TestLoaderDataURLHashSuffixIssue4370(t *testing.T) { + loader_suite.expectBundled(t, bundled{ + files: map[string]string{ + "/icons.css": ` + .triangle { + width: 10px; + height: 10px; + background: currentColor; + clip-path: url(./triangle.svg#x); + } + `, + "/triangle.svg": `<svg xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="x"><path d="M0 0H10V10Z"/></clipPath></defs></svg>`, + }, + entryPaths: []string{"/icons.css"}, + options: config.Options{ + Mode: config.ModeBundle, + AbsOutputDir: "/out/", + ExtensionToLoader: map[string]config.Loader{ + ".css": config.LoaderCSS, + ".svg": config.LoaderDataURL, + }, + }, + }) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/bundler_tests/bundler_lower_test.go new/esbuild-0.27.3/internal/bundler_tests/bundler_lower_test.go --- old/esbuild-0.27.2/internal/bundler_tests/bundler_lower_test.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/bundler_tests/bundler_lower_test.go 2026-02-05 22:52:09.000000000 +0100 @@ -3115,6 +3115,7 @@ }) } +// https://github.com/evanw/esbuild/issues/3768 func TestJavaScriptDecoratorsBundleIssue3768(t *testing.T) { lower_suite.expectBundled(t, bundled{ files: map[string]string{ @@ -3142,3 +3143,23 @@ }, }) } + +// https://github.com/evanw/esbuild/issues/4378 +func TestForAwaitWithOptionalCatchIssue4378(t *testing.T) { + lower_suite.expectBundled(t, bundled{ + files: map[string]string{ + "/entry.js": ` + async function test(b) { + for await (const a of b) a() + } + `, + }, + entryPaths: []string{"/entry.js"}, + options: config.Options{ + Mode: config.ModePassThrough, + AbsOutputFile: "/out.js", + UnsupportedJSFeatures: compat.ForAwait, + MinifySyntax: true, + }, + }) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/bundler_tests/snapshots/snapshots_loader.txt new/esbuild-0.27.3/internal/bundler_tests/snapshots/snapshots_loader.txt --- old/esbuild-0.27.2/internal/bundler_tests/snapshots/snapshots_loader.txt 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/bundler_tests/snapshots/snapshots_loader.txt 2026-02-05 22:52:09.000000000 +0100 @@ -627,6 +627,17 @@ }; ================================================================================ +TestLoaderDataURLHashSuffixIssue4370 +---------- /out/icons.css ---------- +/* icons.css */ +.triangle { + width: 10px; + height: 10px; + background: currentColor; + clip-path: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="x"><path d="M0 0H10V10Z"/></clipPath></defs></svg>#x'); +} + +================================================================================ TestLoaderDataURLTextCSS ---------- /out/entry.css ---------- /* <data:text/css,body{color:%72%65%64}> */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/bundler_tests/snapshots/snapshots_lower.txt new/esbuild-0.27.3/internal/bundler_tests/snapshots/snapshots_lower.txt --- old/esbuild-0.27.2/internal/bundler_tests/snapshots/snapshots_lower.txt 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/bundler_tests/snapshots/snapshots_lower.txt 2026-02-05 22:52:09.000000000 +0100 @@ -17,6 +17,27 @@ _e = new WeakMap(); ================================================================================ +TestForAwaitWithOptionalCatchIssue4378 +---------- /out.js ---------- +async function test(b) { + try { + for (var iter = __forAwait(b), more, temp, error; more = !(temp = await iter.next()).done; more = !1) { + const a = temp.value; + a(); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && await temp.call(iter); + } finally { + if (error) + throw error[0]; + } + } +} + +================================================================================ TestJavaScriptAutoAccessorES2021 ---------- /out/js-define.js ---------- var _a, _b, _one, __two, _Foo_instances, two_get, two_set, _a2, _four, __five, _Foo_static, five_get, five_set, _b2; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/compat/css_table.go new/esbuild-0.27.3/internal/compat/css_table.go --- old/esbuild-0.27.2/internal/compat/css_table.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/compat/css_table.go 2026-02-05 22:52:09.000000000 +0100 @@ -66,11 +66,12 @@ Safari: {{start: v{12, 1, 0}}}, }, GradientInterpolation: { - Chrome: {{start: v{111, 0, 0}}}, - Edge: {{start: v{111, 0, 0}}}, - IOS: {{start: v{16, 2, 0}}}, - Opera: {{start: v{97, 0, 0}}}, - Safari: {{start: v{16, 2, 0}}}, + Chrome: {{start: v{111, 0, 0}}}, + Edge: {{start: v{111, 0, 0}}}, + Firefox: {{start: v{137, 0, 0}}}, + IOS: {{start: v{16, 2, 0}}}, + Opera: {{start: v{97, 0, 0}}}, + Safari: {{start: v{16, 2, 0}}}, }, GradientMidpoints: { Chrome: {{start: v{40, 0, 0}}}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/compat/js_table.go new/esbuild-0.27.3/internal/compat/js_table.go --- old/esbuild-0.27.2/internal/compat/js_table.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/compat/js_table.go 2026-02-05 22:52:09.000000000 +0100 @@ -326,7 +326,7 @@ ES: {{start: v{2022, 0, 0}}}, Firefox: {{start: v{90, 0, 0}}}, IOS: {{start: v{15, 0, 0}}}, - Node: {{start: v{16, 4, 0}}}, + Node: {{start: v{16, 9, 0}}}, Opera: {{start: v{77, 0, 0}}}, Safari: {{start: v{15, 0, 0}}}, }, @@ -592,7 +592,7 @@ Firefox: {{start: v{67, 0, 0}}}, Hermes: {{start: v{0, 7, 0}}}, IOS: {{start: v{13, 4, 0}}}, - Node: {{start: v{12, 5, 0}}}, + Node: {{start: v{12, 0, 0}}}, Opera: {{start: v{62, 0, 0}}}, Rhino: {{start: v{1, 7, 15}}}, Safari: {{start: v{13, 1, 0}}}, @@ -757,7 +757,7 @@ Firefox: {{start: v{74, 0, 0}}}, Hermes: {{start: v{0, 12, 0}}}, IOS: {{start: v{13, 4, 0}}}, - Node: {{start: v{16, 1, 0}}}, + Node: {{start: v{16, 9, 0}}}, Opera: {{start: v{77, 0, 0}}}, Safari: {{start: v{13, 1, 0}}}, }, @@ -838,7 +838,7 @@ // Note: The latest version of "Hermes" failed 8 tests including: RegExp Unicode Property Escapes: Unicode 11 // Note: The latest version of "IE" failed 8 tests including: RegExp Unicode Property Escapes: Unicode 11 // Note: The latest version of "IOS" failed this test: RegExp Unicode Property Escapes: Unicode 17.0 - // Note: The latest version of "Node" failed this test: RegExp Unicode Property Escapes: Unicode 17.0 + // Note: The latest version of "Node" failed 2 tests including: RegExp Unicode Property Escapes: Unicode 16.0 // Note: The latest version of "Rhino" failed 9 tests including: RegExp Unicode Property Escapes: Unicode 11 // Note: The latest version of "Safari" failed this test: RegExp Unicode Property Escapes: Unicode 17.0 ES: {{start: v{2018, 0, 0}}}, @@ -867,7 +867,7 @@ ES: {{start: v{2015, 0, 0}}}, Firefox: {{start: v{53, 0, 0}}}, IOS: {{start: v{13, 0, 0}}}, - Node: {{start: v{10, 0, 0}}}, + Node: {{start: v{8, 10, 0}}}, Opera: {{start: v{49, 0, 0}}}, Safari: {{start: v{13, 0, 0}}}, }, @@ -909,7 +909,15 @@ Rhino: {{start: v{1, 7, 15}}}, Safari: {{start: v{9, 0, 0}}}, }, - Using: {}, + Using: { + // Note: The latest version of "IE" failed 7 tests including: Explicit Resource Management: AsyncDisposableStack + // Note: The latest version of "IOS" failed 7 tests including: Explicit Resource Management: AsyncDisposableStack + // Note: The latest version of "Safari" failed 7 tests including: Explicit Resource Management: AsyncDisposableStack + Chrome: {{start: v{143, 0, 0}}}, + Edge: {{start: v{143, 0, 0}}}, + Firefox: {{start: v{147, 0, 0}}}, + Node: {{start: v{25, 0, 0}}}, + }, } // Return all features that are not available in at least one environment diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/css_ast/css_ast.go new/esbuild-0.27.3/internal/css_ast/css_ast.go --- old/esbuild-0.27.2/internal/css_ast/css_ast.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/css_ast/css_ast.go 2026-02-05 22:52:09.000000000 +0100 @@ -1106,6 +1106,26 @@ return cmp } +type RAtScope struct { + Start []ComplexSelector + End []ComplexSelector + Rules []Rule + CloseBraceLoc logger.Loc +} + +func (a *RAtScope) Equal(rule R, check *CrossFileEqualityCheck) bool { + b, ok := rule.(*RAtScope) + return ok && ComplexSelectorsEqual(a.Start, b.Start, check) && ComplexSelectorsEqual(a.End, b.End, check) && RulesEqual(a.Rules, b.Rules, check) +} + +func (r *RAtScope) Hash() (uint32, bool) { + hash := uint32(11) + hash = HashComplexSelectors(hash, r.Start) + hash = HashComplexSelectors(hash, r.End) + hash = HashRules(hash, r.Rules) + return hash, true +} + type ComplexSelector struct { Selectors []CompoundSelector } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/css_parser/css_decls_gradient.go new/esbuild-0.27.3/internal/css_parser/css_decls_gradient.go --- old/esbuild-0.27.2/internal/css_parser/css_decls_gradient.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/css_parser/css_decls_gradient.go 2026-02-05 22:52:09.000000000 +0100 @@ -707,25 +707,6 @@ stop.v0, stop.v1, stop.v2 = premultiply(v0, v1, v2, stop.alpha, colorSpace) } - // Duplicate the endpoints if they should wrap around to themselves - if hueMethod == longerHue && colorSpace.isPolar() && len(colorStops) > 0 { - if first := colorStops[0]; len(first.positionTerms) == 1 { - if first.positionTerms[0].value.Value() < 0 { - colorStops[0].positionTerms[0].value = helpers.NewF64(0) - } else if first.positionTerms[0].value.Value() > 0 { - first.midpoint = nil - first.positionTerms = []valueWithUnit{{value: helpers.NewF64(0), unit: first.positionTerms[0].unit}} - colorStops = append([]parsedColorStop{first}, colorStops...) - } - } - if last := colorStops[len(colorStops)-1]; len(last.positionTerms) == 1 { - if last.positionTerms[0].unit != "%" || last.positionTerms[0].value.Value() < 100 { - last.positionTerms = []valueWithUnit{{value: helpers.NewF64(100), unit: "%"}} - colorStops = append(colorStops, last) - } - } - } - var newColorStops []colorStop var generateColorStops func( int, parsedColorStop, parsedColorStop, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/css_parser/css_parser.go new/esbuild-0.27.3/internal/css_parser/css_parser.go --- old/esbuild-0.27.2/internal/css_parser/css_parser.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/css_parser/css_parser.go 2026-02-05 22:52:09.000000000 +0100 @@ -1507,6 +1507,8 @@ } else { p.anonLayerCount++ } + + // Parse the block for this rule var rules []css_ast.Rule if context.isDeclarationList { rules = p.parseListOfDeclarations(listOfDeclarationsOpts{ @@ -1517,6 +1519,7 @@ parseSelectors: true, }) } + if len(names) != 1 { p.anonLayerCount-- } @@ -1565,12 +1568,12 @@ if !p.expect(css_lexer.TOpenBrace) { break } - var rules []css_ast.Rule // Push the "@media" conditions p.enclosingAtMedia = append(p.enclosingAtMedia, queries) // Parse the block for this rule + var rules []css_ast.Rule if context.isDeclarationList { rules = p.parseListOfDeclarations(listOfDeclarationsOpts{ canInlineNoOpNesting: context.canInlineNoOpNesting, @@ -1591,6 +1594,57 @@ return css_ast.Rule{Loc: atRange.Loc, Data: &css_ast.RAtMedia{Queries: queries, Rules: rules, CloseBraceLoc: closeBraceLoc}} + case "scope": + var ok bool + + // Parse the start limit + var start []css_ast.ComplexSelector + p.eat(css_lexer.TWhitespace) + if p.eat(css_lexer.TOpenParen) { + if start, ok = p.parseSelectorList(parseSelectorOpts{stopOnCloseParen: true}); !ok || !p.expect(css_lexer.TCloseParen) { + break + } + p.eat(css_lexer.TWhitespace) + } + + // Parse the end limit + var end []css_ast.ComplexSelector + if strings.EqualFold(p.decoded(), "to") && p.eat(css_lexer.TIdent) { + p.eat(css_lexer.TWhitespace) + if !p.expect(css_lexer.TOpenParen) { + break + } + if end, ok = p.parseSelectorList(parseSelectorOpts{stopOnCloseParen: true}); !ok || !p.expect(css_lexer.TCloseParen) { + break + } + } + p.eat(css_lexer.TWhitespace) + + // Expect a block after the query + matchingLoc := p.current().Range.Loc + if !p.expect(css_lexer.TOpenBrace) { + break + } + + // Parse the block for this rule + var rules []css_ast.Rule + if context.isDeclarationList { + rules = p.parseListOfDeclarations(listOfDeclarationsOpts{ + canInlineNoOpNesting: context.canInlineNoOpNesting, + }) + } else { + rules = p.parseListOfRules(ruleContext{ + parseSelectors: true, + }) + } + + closeBraceLoc := p.current().Range.Loc + if !p.expectWithMatchingLoc(css_lexer.TCloseBrace, matchingLoc) { + closeBraceLoc = logger.Loc{} + } + + return css_ast.Rule{Loc: atRange.Loc, Data: &css_ast.RAtScope{Start: start, End: end, Rules: rules, CloseBraceLoc: closeBraceLoc}} + default: if kind == atRuleUnknown && lowerAtToken == "namespace" { // CSS namespaces are a weird feature that appears to only really be @@ -1614,6 +1668,7 @@ } // Parse an unknown prelude + p.index = preludeStart prelude: for { switch p.current().Kind { @@ -1679,9 +1734,9 @@ // Parse known rules whose blocks consist of whatever the current context is matchingLoc := p.current().Range.Loc p.expect(css_lexer.TOpenBrace) - var rules []css_ast.Rule // Parse the block for this rule + var rules []css_ast.Rule if context.isDeclarationList { rules = p.parseListOfDeclarations(listOfDeclarationsOpts{ canInlineNoOpNesting: context.canInlineNoOpNesting, @@ -1699,7 +1754,7 @@ // Handle local names for "@container" if len(prelude) >= 1 && lowerAtToken == "container" { - if t := &prelude[0]; t.Kind == css_lexer.TIdent && strings.ToLower(t.Text) != "not" { + if t := &prelude[0]; t.Kind == css_lexer.TIdent && !strings.EqualFold(t.Text, "not") { t.Kind = css_lexer.TSymbol t.PayloadIndex = p.symbolForName(t.Loc, t.Text).Ref.InnerIndex } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/css_parser/css_parser_test.go new/esbuild-0.27.3/internal/css_parser/css_parser_test.go --- old/esbuild-0.27.2/internal/css_parser/css_parser_test.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/css_parser/css_parser_test.go 2026-02-05 22:52:09.000000000 +0100 @@ -2741,6 +2741,23 @@ expectPrintedLowerMangle(t, "@media not (2px >= width >= 1px) { a { color: red } }", "@media not ((max-width: 2px) and (min-width: 1px)) {\n a {\n color: red;\n }\n}\n", "") } +func TestAtScope(t *testing.T) { + expectPrinted(t, "@scope { div { color: red } }", "@scope {\n div {\n color: red;\n }\n}\n", "") + expectPrinted(t, "@scope (a) { div { color: red } }", "@scope (a) {\n div {\n color: red;\n }\n}\n", "") + expectPrinted(t, "@scope to (a) { div { color: red } }", "@scope to (a) {\n div {\n color: red;\n }\n}\n", "") + expectPrinted(t, "@scope(a)to (b){ div { color: red } }", "@scope (a) to (b) {\n div {\n color: red;\n }\n}\n", "") + expectPrinted(t, "@scope (a>*) to (~b) { div { color: red } }", "@scope (a > *) to (~ b) {\n div {\n color: red;\n }\n}\n", "") + expectPrinted(t, "@scope (a,b) to (c,d) { div { color: red } }", "@scope (a, b) to (c, d) {\n div {\n color: red;\n }\n}\n", "") + + expectPrinted(t, "@scope a { div { color: red } }", "@scope a {\n div {\n color: red;\n }\n}\n", "<stdin>: WARNING: Expected \"{\" but found \"a\"\n") + expectPrinted(t, "@scope to a { div { color: red } }", "@scope to a {\n div {\n color: red;\n }\n}\n", "<stdin>: WARNING: Expected \"(\" but found \"a\"\n") + expectPrinted(t, "@scope (a) to b { div { color: red } }", "@scope (a) to b {\n div {\n color: red;\n }\n}\n", "<stdin>: WARNING: Expected \"(\" but found \"b\"\n") + + warning := "<stdin>: WARNING: Unexpected \"{\"\n<stdin>: WARNING: Expected \")\" to go with \"(\"\n<stdin>: NOTE: The unbalanced \"(\" is here:\n" + expectPrinted(t, "@scope (a { div { color: red } }", "@scope (a { div { color: red } }) {\n}\n", warning) + expectPrinted(t, "@scope to (a { div { color: red } }", "@scope to (a { div { color: red } }) {\n}\n", warning) +} + func TestFontWeight(t *testing.T) { expectPrintedMangle(t, "a { font-weight: normal }", "a {\n font-weight: 400;\n}\n", "") expectPrintedMangle(t, "a { font-weight: bold }", "a {\n font-weight: 700;\n}\n", "") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/css_printer/css_printer.go new/esbuild-0.27.3/internal/css_printer/css_printer.go --- old/esbuild-0.27.2/internal/css_printer/css_printer.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/css_printer/css_printer.go 2026-02-05 22:52:09.000000000 +0100 @@ -377,6 +377,31 @@ } p.printRuleBlock(r.Rules, indent, r.CloseBraceLoc) + case *css_ast.RAtScope: + p.print("@scope") + if len(r.Start) > 0 { + if p.options.MinifyWhitespace { + p.print("(") + } else { + p.print(" (") + } + p.printComplexSelectors(r.Start, indent, layoutSingleLine) + p.print(")") + } + if len(r.End) > 0 { + if p.options.MinifyWhitespace { + p.print("to (") + } else { + p.print(" to (") + } + p.printComplexSelectors(r.End, indent, layoutSingleLine) + p.print(")") + } + if !p.options.MinifyWhitespace { + p.print(" ") + } + p.printRuleBlock(r.Rules, indent, r.CloseBraceLoc) + default: panic("Internal error") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/css_printer/css_printer_test.go new/esbuild-0.27.3/internal/css_printer/css_printer_test.go --- old/esbuild-0.27.2/internal/css_printer/css_printer_test.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/css_printer/css_printer_test.go 2026-02-05 22:52:09.000000000 +0100 @@ -376,6 +376,14 @@ expectPrintedMinify(t, "@media junk(1, 2, 3) {div{color:red}}", "@media junk(1,2,3){div{color:red}}") } +func TestAtScope(t *testing.T) { + expectPrinted(t, "@scope { div { color: red } }", "@scope {\n div {\n color: red;\n }\n}\n") + expectPrinted(t, "@scope (a, .b) to (c > *) { div { color: red } }", "@scope (a, .b) to (c > *) {\n div {\n color: red;\n }\n}\n") + + expectPrintedMinify(t, "@scope { div { color: red } }", "@scope{div{color:red}}") + expectPrintedMinify(t, "@scope (a, .b) to (c > *) { div { color: red } }", "@scope(a,.b)to (c>*){div{color:red}}") +} + func TestAtFontFace(t *testing.T) { expectPrinted(t, "@font-face { font-family: 'Open Sans'; src: url('OpenSans.woff') format('woff') }", "@font-face {\n font-family: \"Open Sans\";\n src: url(OpenSans.woff) format(\"woff\");\n}\n") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/internal/js_parser/js_parser_lower.go new/esbuild-0.27.3/internal/js_parser/js_parser_lower.go --- old/esbuild-0.27.2/internal/js_parser/js_parser_lower.go 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/internal/js_parser/js_parser_lower.go 2026-02-05 22:52:09.000000000 +0100 @@ -1097,6 +1097,11 @@ tempRef := p.generateTempRef(tempRefNoDeclare, "temp") errorRef := p.generateTempRef(tempRefNoDeclare, "error") + p.recordUsage(iterRef) + p.recordUsage(moreRef) + p.recordUsage(tempRef) + p.recordUsage(errorRef) + switch init := loop.Init.Data.(type) { case *js_ast.SLocal: if len(init.Decls) == 1 { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/npm/@esbuild/aix-ppc64/package.json new/esbuild-0.27.3/npm/@esbuild/aix-ppc64/package.json --- old/esbuild-0.27.2/npm/@esbuild/aix-ppc64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/aix-ppc64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/aix-ppc64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/android-arm/package.json new/esbuild-0.27.3/npm/@esbuild/android-arm/package.json --- old/esbuild-0.27.2/npm/@esbuild/android-arm/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/android-arm/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/android-arm", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/android-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/android-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/android-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/android-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/android-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/android-x64/package.json new/esbuild-0.27.3/npm/@esbuild/android-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/android-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/android-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/android-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/darwin-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/darwin-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/darwin-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/darwin-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/darwin-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/darwin-x64/package.json new/esbuild-0.27.3/npm/@esbuild/darwin-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/darwin-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/darwin-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/darwin-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/freebsd-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/freebsd-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/freebsd-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/freebsd-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/freebsd-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/freebsd-x64/package.json new/esbuild-0.27.3/npm/@esbuild/freebsd-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/freebsd-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/freebsd-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/freebsd-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-arm/package.json new/esbuild-0.27.3/npm/@esbuild/linux-arm/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-arm/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-arm/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-arm", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/linux-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-ia32/package.json new/esbuild-0.27.3/npm/@esbuild/linux-ia32/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-ia32/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-ia32/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-ia32", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-loong64/package.json new/esbuild-0.27.3/npm/@esbuild/linux-loong64/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-loong64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-loong64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-loong64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-mips64el/package.json new/esbuild-0.27.3/npm/@esbuild/linux-mips64el/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-mips64el/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-mips64el/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-mips64el", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-ppc64/package.json new/esbuild-0.27.3/npm/@esbuild/linux-ppc64/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-ppc64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-ppc64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-ppc64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-riscv64/package.json new/esbuild-0.27.3/npm/@esbuild/linux-riscv64/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-riscv64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-riscv64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-riscv64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-s390x/package.json new/esbuild-0.27.3/npm/@esbuild/linux-s390x/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-s390x/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-s390x/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-s390x", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/linux-x64/package.json new/esbuild-0.27.3/npm/@esbuild/linux-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/linux-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/linux-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/linux-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/netbsd-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/netbsd-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/netbsd-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/netbsd-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/netbsd-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/netbsd-x64/package.json new/esbuild-0.27.3/npm/@esbuild/netbsd-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/netbsd-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/netbsd-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/netbsd-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/openbsd-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/openbsd-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/openbsd-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/openbsd-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/openbsd-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/openbsd-x64/package.json new/esbuild-0.27.3/npm/@esbuild/openbsd-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/openbsd-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/openbsd-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/openbsd-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/openharmony-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/openharmony-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/openharmony-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/openharmony-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/openharmony-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/sunos-x64/package.json new/esbuild-0.27.3/npm/@esbuild/sunos-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/sunos-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/sunos-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/sunos-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/wasi-preview1/package.json new/esbuild-0.27.3/npm/@esbuild/wasi-preview1/package.json --- old/esbuild-0.27.2/npm/@esbuild/wasi-preview1/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/wasi-preview1/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/wasi-preview1", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/win32-arm64/package.json new/esbuild-0.27.3/npm/@esbuild/win32-arm64/package.json --- old/esbuild-0.27.2/npm/@esbuild/win32-arm64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/win32-arm64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/win32-arm64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/win32-ia32/package.json new/esbuild-0.27.3/npm/@esbuild/win32-ia32/package.json --- old/esbuild-0.27.2/npm/@esbuild/win32-ia32/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/win32-ia32/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/win32-ia32", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/@esbuild/win32-x64/package.json new/esbuild-0.27.3/npm/@esbuild/win32-x64/package.json --- old/esbuild-0.27.2/npm/@esbuild/win32-x64/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/@esbuild/win32-x64/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@esbuild/win32-x64", - "version": "0.27.2", + "version": "0.27.3", "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.2/npm/esbuild/package.json new/esbuild-0.27.3/npm/esbuild/package.json --- old/esbuild-0.27.2/npm/esbuild/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/esbuild/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "esbuild", - "version": "0.27.2", + "version": "0.27.3", "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.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@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" }, "license": "MIT" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/esbuild-0.27.2/npm/esbuild-wasm/package.json new/esbuild-0.27.3/npm/esbuild-wasm/package.json --- old/esbuild-0.27.2/npm/esbuild-wasm/package.json 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/npm/esbuild-wasm/package.json 2026-02-05 22:52:09.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "esbuild-wasm", - "version": "0.27.2", + "version": "0.27.3", "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.2/version.txt new/esbuild-0.27.3/version.txt --- old/esbuild-0.27.2/version.txt 2025-12-17 01:46:56.000000000 +0100 +++ new/esbuild-0.27.3/version.txt 2026-02-05 22:52:09.000000000 +0100 @@ -1 +1 @@ -0.27.2 +0.27.3
