Update @angular/build 20.3.11 → 21.1.0 (major)
Here is everything you need to know about this upgrade. Please take a good look at what changed and the test results before merging this pull request.
What changed?
✳️ @angular/build (20.3.11 → 21.1.0) · Repo · Changelog
Release Notes
21.1.0
@schematics/angular
Commit Description add browserMode option to jasmine-vitest schematic generate detailed migration report for refactor-jasmine-vitestadd MCP configuration file to new workspaces @angular/cli
@angular/build
Commit Description directly support ng-packagr in unit-test builder disable TestBed teardown during debugging in Vitest inject source-map-support for Vitest browser tests normalize roots to POSIX in test discovery for Windows compatibility resolve test files correctly on Windows when using non-C drives simplify SSL handling for ng servewith SSR (#31722)
21.0.6
@angular/ssr
Commit Description handle platform destruction during rendering
21.0.5
@schematics/angular
@angular/cli
Commit Description use narrower types for new MCP TS SDK compatibility @angular/build
Commit Description ensure correct project targeting during Vitest debugging
21.0.4
@schematics/angular
Commit Description improve VS Code background compilation start/end detection remove inlineSourcesfrom library tsconfig template@angular/build
@angular/ssr
Commit Description add leading slash to well-known non-Angular URLs propagate status code to redirect skip SSR processing for well-known non-Angular URLs like favicon.ico
21.0.3
@angular-devkit/build-angular
Commit Description conditionally provide Zone.js change detection in the built-in test main file @angular/build
Commit Description Add custom middleware for to present an Angular-tailored message Ensure disposal of close-javascript-transformer ensure locale base href retains leading slash (#32040) inject testing polyfills in Karma unit-test executor support NODE_EXTRA_CA_CERTS in SSR SSL plugin
21.0.2
@angular/cli
Commit Description update @modelcontextprotocol/sdkto v1.24.0@angular-devkit/schematics
Commit Description remove lazy imports in node tasks @angular/build
Commit Description add filename truncation to test discovery allow overriding Vitest coverage reportsDirectoryoption
21.0.1
@schematics/angular
@angular/cli
Commit Description ensure dependencies are resolved correctly for node modules directory check @angular/build
@angular/ssr
Commit Description handle X-Forwarded-PrefixandAPP_BASE_HREFin redirectsprevent redirect loop with encoded query parameters
21.0.0
@angular/cli
@schematics/angular
@angular-devkit/build-angular
Commit Description ensure vitest code coverage handles virtual files correctly expand jestandjest-environment-jsdomto allow version 30make zone.js optional in server and app-shell builders @angular/build
Commit Description add --list-tests flag to unit-test builder add 'filter' option to unit-test builder add browserViewportoption for vitest browser testsadd advanced coverage options to unit-test builder add reporter output file option for unit-test allow options for unit test reporters support .test.tsfiles by default in unit test builderadd --ui option for Vitest runner add defineoption to dev-serveradd temporary directory cleanup for Vitest executor add upfront dependency validation for unit-test runners add webcontainer support for Vitest browser provider allow globalsto be set to falseallow custom runner configuration file for unit-test allow unit-test progress option passthrough for building allow unit-test runner config with absolute path configure Vitest cache to use Angular cache correct Vitest builder watch mode execution correct Vitest coverage include handling for virtual files correct Vitest coverage reporting for test files correctly handle absolute paths and casing in test discovery direct check include file exists in unit-test discovery disable glob directory expansion when finding tests disable Vitest test isolation by default drop support for TypeScript 5.8 dynamically select Vitest DOM environment enhance Vitest config merging and validation enhance Vitest dependency externalization and pre-bundling enhance Vitest resolution for optimal package loading ensure ɵgetOrCreateAngularServerAppis always defined after errorsensure TestBed cleanup hooks are always registered ensure TestBed setup is robust in non-isolated Vitest ensure Vitest setup files are executed in order exclude .angular from coverage instrumentation externalize Angular dependencies in Vitest runner improve error handling in unit-test builder introduce vitest-base.config for test configuration normalize paths for Vitest runner output files prioritize string type for runnerConfig schema provide default excludes for vitest coverage relax requirement for files to be in TS compilation remove deprecated javascriptEnabledoption for Lessremove explicit test isolation configuration resolve browser provider packages using project resolver resolve PostCSS plugins relative to config file serve build assets and styles in vitest set coverage report directory to coverage/project-name show full aggregate errors from vitest simplify SSL handling for ng servewith SSR (#31723)support ESM PostCSS plugins update vitest to 4.0.6 and remove coverage workaround Breaking Changes
@angular/cli
- The
ngcommands will no longer automatically detect and usecnpmas the package manager. As an alternative use the.npmrcfile to ensure npm uses the cnpm registry.@angular/build
- TypeScript versions older than 5.9 are no longer supported.
- The
javascriptEnabledoption for Less is no longer supported. Projects relying on inline JavaScript within Less files will need to refactor their stylesheets to remove this dependency.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/code-frame (indirect, 7.27.1 → 7.28.6) · Repo · Changelog
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/generator (indirect, 7.28.3 → 7.28.6) · Repo · Changelog
Release Notes
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
👓 Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifier🐛 Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverse🏠 Internal
🏃♀️ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- Huáng Jùnliàng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- Nicolò Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/helper-validator-identifier (indirect, 7.27.1 → 7.28.5) · Repo · Changelog
Release Notes
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
👓 Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifier🐛 Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverse🏠 Internal
🏃♀️ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- Huáng Jùnliàng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- Nicolò Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/parser (indirect, 7.28.4 → 7.28.6) · Repo · Changelog
Release Notes
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
👓 Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifier🐛 Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverse🏠 Internal
🏃♀️ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- Huáng Jùnliàng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- Nicolò Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/template (indirect, 7.27.2 → 7.28.6) · Repo · Changelog
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/traverse (indirect, 7.28.4 → 7.28.6) · Repo · Changelog
Release Notes
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
👓 Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifier🐛 Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverse🏠 Internal
🏃♀️ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- Huáng Jùnliàng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- Nicolò Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @babel/types (indirect, 7.28.4 → 7.28.6) · Repo · Changelog
Release Notes
7.28.5
v7.28.5 (2025-10-23)
Thank you @CO0Ki3, @Olexandr88, and @youthfulhps for your first PRs!
👓 Spec Compliance
babel-parser
- #17446 Allow
Runtime Errors for Function Call Assignment Targets(@liuxingbaoyu)babel-helper-validator-identifier🐛 Bug Fix
babel-plugin-proposal-destructuring-privatebabel-parserbabel-plugin-proposal-discard-binding,babel-plugin-transform-destructuring
- #17519 fix:
restcorrectly returns plain array (@liuxingbaoyu)babel-helper-create-class-features-plugin,babel-helper-member-expression-to-functions,babel-plugin-transform-block-scoping,babel-plugin-transform-optional-chaining,babel-traverse,babel-typesbabel-traverse🏠 Internal
🏃♀️ Performance
babel-core
- #17490 Faster finding of locations in
buildCodeFrameError(@liuxingbaoyu)Committers: 8
- Babel Bot (@babel-bot)
- Byeongho Yoo (@youthfulhps)
- Huáng Jùnliàng (@JLHwung)
- Hyeon Dokko (@CO0Ki3)
- Nicolò Ribaudo (@nicolo-ribaudo)
- @Olexandr88
- @liuxingbaoyu
- fisker Cheung (@fisker)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @esbuild/aix-ppc64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/android-arm (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/android-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/android-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/darwin-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/darwin-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/freebsd-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/freebsd-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-arm (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-ia32 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-loong64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-mips64el (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-ppc64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-riscv64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-s390x (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/linux-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/netbsd-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/netbsd-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/openbsd-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/openbsd-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/openharmony-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/sunos-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/win32-arm64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/win32-ia32 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @esbuild/win32-x64 (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ @inquirer/confirm (indirect, 5.1.14 → 5.1.21) · Repo
Sorry, we couldn’t find anything useful about this release.
↗️ @inquirer/core (indirect, 10.3.0 → 10.3.2) · Repo
Sorry, we couldn’t find anything useful about this release.
↗️ @parcel/watcher (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-darwin-arm64 (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-darwin-x64 (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-linux-arm64-glibc (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-linux-arm64-musl (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-linux-x64-glibc (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-linux-x64-musl (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @parcel/watcher-win32-x64 (indirect, 2.5.1 → 2.5.4) · Repo
Release Notes
2.5.4
What's Changed
- patch: fix SEGV due to Static Initialization Order Fiasco bug by @alichtman in #208
- Resolve several BinSkim issues by @rzhao271 in #202
- upgrade detect-libc for better compatibility by @nicksrandall in #200
- Don't show error messages when checking if watchman is available by @aptinio in #198
- Add Meteor to list of users by @harryadel in #214
- Fix CI by @tmm1 in #213
- Fix more SIOF / SDOF issues by @alichtman in #216
- Resolve more BinSkim issues by @rzhao271 in #219
- Remove
D_FORTIFY_SOURCEflag by @bpasero in #223- Fix use of delete operators by @matttyson in #145
- Some minor fixes found doing code review by @bpasero in #222
- Reduce dependencies by switching to picomatch by @benmccann in #210
- Fix glob tests on windows by going back to
picomatch@2.3.1by @bpasero in #224- v2.5.2 by @bpasero in #225
- eng - update actions versions by @bpasero in #226
- v2.5.3 by @bpasero in #227
- Test on current versions of Node.js by @cclauss in #221
- eng - try to fix release script to publish new NPM version by @bpasero in #228
- v2.5.4 by @bpasero in #229
New Contributors
- @alichtman made their first contribution in #208
- @rzhao271 made their first contribution in #202
- @nicksrandall made their first contribution in #200
- @aptinio made their first contribution in #198
- @harryadel made their first contribution in #214
- @matttyson made their first contribution in #145
- @benmccann made their first contribution in #210
- @cclauss made their first contribution in #221
Full Changelog: v2.5.1...v2.5.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v2.5.4 (#229)eng - try to fix release script to publish new NPM version (#228)Test on current versions of Node.js (#221)v2.5.3 (#227)eng - update actions versions (#226)v2.5.2Fix `picomatch` usage on windows for glob matchingReduce dependencies by switching to picomatch (#210)vscode - some minor fixes found doing code review (#222)Fix use of delete operators (#145)Remove `D_FORTIFY_SOURCE` flag (#223)Resolve more BinSkim issues (#219)Fix more SIOF / SDOF issues (#216)Fix CI (#213)Add Meteor to list of users (#214)Don't show error messages when checking if watchman is available (#198)upgrade detect-libc (#200)Resolve several BinSkim issues (#202)patch: fix SEGV due to improper ordering of static destructors (#208)Enable c++17 on windows build
↗️ @rollup/rollup-android-arm-eabi (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-android-arm64 (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-darwin-arm64 (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-darwin-x64 (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-freebsd-arm64 (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-freebsd-x64 (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-arm-gnueabihf (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-arm-musleabihf (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-arm64-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-arm64-musl (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-loong64-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-ppc64-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-riscv64-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-riscv64-musl (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-s390x-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-x64-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-linux-x64-musl (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-openharmony-arm64 (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-win32-arm64-msvc (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-win32-ia32-msvc (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.55.0 (from changelog)
2026-01-05
Features
- Natively support ppc64 Linux Musl targets (#5997)
- Natively support loong64 Linux Musl targets (#5997)
- Natively support OpenBSD targets (#6224)
Bug Fixes
- Prevent some cycles when using top-level-await (#6221)
- Warn when generating cycling manual chunks (#6225)
Pull Requests
- #5997: Add support for ppc64 & loong64 musl linux (@fossdd)
- #6218: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6219: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6220: chore(deps): lock file maintenance (@renovate[bot])
- #6221: Handle TLA dynamic import cycles in chunkAssignment (@TrickyPi)
- #6222: Apply to adjust the description of the command-line parameter 'rollup… (@image-gif, @lukastaegert)
- #6223: Deduplicate CLI help file (@lukastaegert)
- #6224: OpenBSD support (@edshot99, @lukastaegert)
- #6225: Throw a warning for circular chunks (@TrickyPi)
- #6226: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6227: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6228: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6229: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-win32-x64-gnu (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ @rollup/rollup-win32-x64-msvc (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ esbuild (indirect, 0.25.9 → 0.27.2) · Repo · Changelog
Release Notes
0.27.2
Allow import path specifiers starting with
#/(#4361)Previously the specification for
package.jsondisallowed import path specifiers starting with#/, but this restriction has recently been relaxed and support for it is being added across the JavaScript ecosystem. One use case is using it for a wildcard pattern such as mapping#/*to./src/*(previously you had to use another character such as#_*instead, which was more confusing). There is some more context in nodejs/node#49182.This change was contributed by @hybrist.
Automatically add the
-webkit-maskprefix (#4357, #4358)This release automatically adds the
-webkit-vendor prefix for themaskCSS shorthand property:/* Original code */ main { mask: url(x.png) center/5rem no-repeat } /* Old output (with --target=chrome110) */ main { mask: url(x.png) center/5rem no-repeat; } /* New output (with --target=chrome110) */ main { -webkit-mask: url(x.png) center/5rem no-repeat; mask: url(x.png) center/5rem no-repeat; }This change was contributed by @BPJEnnova.
Additional minification of
switchstatements (#4176, #4359)This release contains additional minification patterns for reducing
switchstatements. Here is an example:// Original code switch (x) { case 0: foo() break case 1: default: bar() } // Old output (with --minify) switch(x){case 0:foo();break;case 1:default:bar()} // New output (with --minify) x===0?foo():bar();Forbid
usingdeclarations insideswitchclauses (#4323)This is a rare change to remove something that was previously possible. The Explicit Resource Management proposal introduced
usingdeclarations. These were previously allowed insidecaseanddefaultclauses inswitchstatements. This had well-defined semantics and was already widely implemented (by V8, SpiderMonkey, TypeScript, esbuild, and others). However, it was considered to be too confusing because of how scope works in switch statements, so it has been removed from the specification. This edge case will now be a syntax error. See tc39/proposal-explicit-resource-management#215 and rbuckton/ecma262#14 for details.Here is an example of code that is no longer allowed:
switch (mode) { case 'read': using readLock = db.read() return readAll(readLock) case 'write': using writeLock = db.write() return writeAll(writeLock) }That code will now have to be modified to look like this instead (note the additional
{and}block statements around each case body):switch (mode) { case 'read': { using readLock = db.read() return readAll(readLock) } case 'write': { using writeLock = db.write() return writeAll(writeLock) } }This is not being released in one of esbuild's breaking change releases since this feature hasn't been finalized yet, and esbuild always tracks the current state of the specification (so esbuild's previous behavior was arguably incorrect).
0.27.1
Fix bundler bug with
varnested insideif(#4348)This release fixes a bug with the bundler that happens when importing an ES module using
require(which causes it to be wrapped) and there's a top-levelvarinside anifstatement without being wrapped in a{ ... }block (and a few other conditions). The bundling transform needed to hoist thesevardeclarations outside of the lazy ES module wrapper for correctness. See the issue for details.Fix minifier bug with
forinsidetryinside label (#4351)This fixes an old regression from version v0.21.4. Some code was introduced to move the label inside the
trystatement to address a problem with transforming labeledfor awaitloops to avoid theawait(the transformation involves converting thefor awaitloop into aforloop and wrapping it in atrystatement). However, it introduces problems for cross-compiled JVM code that uses all three of these features heavily. This release restricts this transform to only apply toforloops that esbuild itself generates internally as part of thefor awaittransform. Here is an example of some affected code:// Original code d: { e: { try { while (1) { break d } } catch { break e; } } } // Old output (with --minify) a:try{e:for(;;)break a}catch{break e} // New output (with --minify) a:e:try{for(;;)break a}catch{break e}Inline IIFEs containing a single expression (#4354)
Previously inlining of IIFEs (immediately-invoked function expressions) only worked if the body contained a single
returnstatement. Now it should also work if the body contains a single expression statement instead:// Original code const foo = () => { const cb = () => { console.log(x()) } return cb() } // Old output (with --minify) const foo=()=>(()=>{console.log(x())})(); // New output (with --minify) const foo=()=>{console.log(x())};The minifier now strips empty
finallyclauses (#4353)This improvement means that
finallyclauses containing dead code can potentially cause the associatedtrystatement to be removed from the output entirely in minified builds:// Original code function foo(callback) { if (DEBUG) stack.push(callback.name); try { callback(); } finally { if (DEBUG) stack.pop(); } } // Old output (with --minify --define:DEBUG=false) function foo(a){try{a()}finally{}} // New output (with --minify --define:DEBUG=false) function foo(a){a()}Allow tree-shaking of the
SymbolconstructorWith this release, calling
Symbolis now considered to be side-effect free when the argument is known to be a primitive value. This means esbuild can now tree-shake module-level symbol variables:// Original code const a = Symbol('foo') const b = Symbol(bar) // Old output (with --tree-shaking=true) const a = Symbol("foo"); const b = Symbol(bar); // New output (with --tree-shaking=true) const b = Symbol(bar);
0.27.0
This release deliberately contains backwards-incompatible changes. To avoid automatically picking up releases like this, you should either be pinning the exact version of
esbuildin yourpackage.jsonfile (recommended) or be using a version range syntax that only accepts patch upgrades such as^0.26.0or~0.26.0. See npm's documentation about semver for more information.
Use
Uint8Array.fromBase64if available (#4286)With this release, esbuild's
binaryloader will now use the newUint8Array.fromBase64function unless it's unavailable in the configured target environment. If it's unavailable, esbuild's previous code for this will be used as a fallback. Note that this means you may now need to specifytargetwhen using this feature with Node (for example--target=node22) unless you're using Node v25+.Update the Go compiler from v1.23.12 to v1.25.4 (#4208, #4311)
This raises the operating system requirements for running esbuild:
- Linux: now requires a kernel version of 3.2 or later
- macOS: now requires macOS 12 (Monterey) or later
0.26.0
Enable trusted publishing (#4281)
GitHub and npm are recommending that maintainers for packages such as esbuild switch to trusted publishing. With this release, a VM on GitHub will now build and publish all of esbuild's packages to npm instead of me. In theory.
Unfortunately there isn't really a way to test that this works other than to do it live. So this release is that live test. Hopefully this release is uneventful and is exactly the same as the previous one (well, except for the green provenance attestation checkmark on npm that happens with trusted publishing).
0.25.12
Fix a minification regression with CSS media queries (#4315)
The previous release introduced support for parsing media queries which unintentionally introduced a regression with the removal of duplicate media rules during minification. Specifically the grammar for
@media <media-type> and <media-condition-without-or> { ... }was missing an equality check for the<media-condition-without-or>part, so rules with different suffix clauses in this position would incorrectly compare equal and be deduplicated. This release fixes the regression.Update the list of known JavaScript globals (#4310)
This release updates esbuild's internal list of known JavaScript globals. These are globals that are known to not have side-effects when the property is accessed. For example, accessing the global
Arrayproperty is considered to be side-effect free but accessing the globalscrollYproperty can trigger a layout, which is a side-effect. This is used by esbuild's tree-shaking to safely remove unused code that is known to be side-effect free. This update adds the following global properties:From ES2017:
AtomicsSharedArrayBufferFrom ES2020:
BigInt64ArrayBigUint64ArrayFrom ES2021:
FinalizationRegistryWeakRefFrom ES2025:
Float16ArrayIteratorNote that this does not indicate that constructing any of these objects is side-effect free, just that accessing the identifier is side-effect free. For example, this now allows esbuild to tree-shake classes that extend from
Iterator:// This can now be tree-shaken by esbuild: class ExampleIterator extends Iterator {}Add support for the new
@view-transitionCSS rule (#4313)With this release, esbuild now has improved support for pretty-printing and minifying the new
@view-transitionrule (which esbuild was previously unaware of):/* Original code */ @view-transition { navigation: auto; types: check; } /* Old output */ @view-transition { navigation: auto; types: check; } /* New output */ @view-transition { navigation: auto; types: check; }The new view transition feature provides a mechanism for creating animated transitions between documents in a multi-page app. You can read more about view transition rules here.
This change was contributed by @yisibl.
Trim CSS rules that will never match
The CSS minifier will now remove rules whose selectors contain
:is()and:where()as those selectors will never match. These selectors can currently be automatically generated by esbuild when you give esbuild nonsensical input such as the following:/* Original code */ div:before { color: green; &.foo { color: red; } } /* Old output (with --supported:nesting=false --minify) */ div:before{color:green}:is().foo{color:red} /* New output (with --supported:nesting=false --minify) */ div:before{color:green}This input is nonsensical because CSS nesting is (unfortunately) not supported inside of pseudo-elements such as
:before. Currently esbuild generates a rule containing:is()in this case when you tell esbuild to transform nested CSS into non-nested CSS. I think it's reasonable to do that as it sort of helps explain what's going on (or at least indicates that something is wrong in the output). It shouldn't be present in minified code, however, so this release now strips it out.
0.25.11
Add support for
with { type: 'bytes' }imports (#4292)The import bytes proposal has reached stage 2.7 in the TC39 process, which means that although it isn't quite recommended for implementation, it's generally approved and ready for validation. Furthermore it has already been implemented by Deno and Webpack. So with this release, esbuild will also add support for this. It behaves exactly the same as esbuild's existing
binaryloader. Here's an example:import data from './image.png' with { type: 'bytes' } const view = new DataView(data.buffer, 0, 24) const width = view.getInt32(16) const height = view.getInt32(20) console.log('size:', width + '\xD7' + height)Lower CSS media query range syntax (#3748, #4293)
With this release, esbuild will now transform CSS media query range syntax into equivalent syntax using
min-/max-prefixes for older browsers. For example, the following CSS:@media (640px <= width <= 960px) { main { display: flex; } }will be transformed like this with a target such as
--target=chrome100(or more specifically with--supported:media-range=falseif desired):@media (min-width: 640px) and (max-width: 960px) { main { display: flex; } }
0.25.10
Fix a panic in a minification edge case (#4287)
This release fixes a panic due to a null pointer that could happen when esbuild inlines a doubly-nested identity function and the final result is empty. It was fixed by emitting the value
undefinedin this case, which avoids the panic. This case must be rare since it hasn't come up until now. Here is an example of code that previously triggered the panic (which only happened when minifying):function identity(x) { return x } identity({ y: identity(123) })Fix
@supportsnested inside pseudo-element (#4265)When transforming nested CSS to non-nested CSS, esbuild is supposed to filter out pseudo-elements such as
::placeholderfor correctness. The CSS nesting specification says the following:The nesting selector cannot represent pseudo-elements (identical to the behavior of the ':is()' pseudo-class). We’d like to relax this restriction, but need to do so simultaneously for both ':is()' and '&', since they’re intentionally built on the same underlying mechanisms.
However, it seems like this behavior is different for nested at-rules such as
@supports, which do work with pseudo-elements. So this release modifies esbuild's behavior to now take that into account:/* Original code */ ::placeholder { color: red; body & { color: green } @supports (color: blue) { color: blue } } /* Old output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { { color: blue; } } /* New output (with --supported:nesting=false) */ ::placeholder { color: red; } body :is() { color: green; } @supports (color: blue) { ::placeholder { color: blue; } }
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 64 commits:
publish 0.27.2 to npmadditional tests for `switch` with `break`update release notesfix #4357: -webkit- prefix for mask shorthand (#4358)compat table: update `@types/node`compat table: fix a type error with the new typesfix `make compat-table` to install dependenciesrelease notes for #4361fix: allow subpath imports that start with `#/` (#4361)minify some switch statements to if-else statementfix #4176: improve switch statement partial-evalintroduce more helper methodsfix some extremely subtle switch minification bugsintroduce a helper methodfix #4359: prune empty `case` before a `default`fix #4323: forbid `using` inside `switch` clausesclose #4362, close #4363: update to go 1.25.5publish 0.27.1 to npmfix #4354: improve IIFE inlining for expressionsminify: move unused expr simplification laterfix #4353: remove empty `try`/`finally` clausesfix #4348: bundler bug with `var` inside `if`fix #4351: label + `try` + `for` minifier bugfix: deno release url wrong comment (#4326)calling `Symbol.for` with a primitive never throwsupdate `decorator-tests.js` snapshotcalling `Symbol` with a primitive will never throwpublish 0.27.0 to npmfix #4286: use `Uint8Array.fromBase64` if present (#4295)update go 1.25.3 => 1.25.4update go 1.23.12 => 1.25.3 (#4318)use a patched go compiler for release buildsdelete temporary `release.yml` workflowadd a temporary `release.yml` workflowfix `publish.yml`publish 0.26.0 to npmenable trusted publishing (#4319)some deno-related fixesadd a dummy `publish.yml`publish 0.25.12 to npmupdate release notesminify: remove css rules containing empty `:is()`add some additional known static methodsautomatically mark "RegExp.escape()" calls as puresimplify some call expression checksadd some additional known static methodsfix #4310: add `Iterator` and other known globalsfix: escape dev server breadcrumb hrefs properly (#4316)fix #4315: `@media` deduplication bug edge caseupdate release notesfeat: add CSS `@view-transition` (#4313)publish 0.25.11 to npmcss: also parse media queries in `@import` rulescss: some adjustments to `@import` parsingfix #3748, fix #4293: lower css media range syntaxcss: parse and print media queriesrun `make update-compat-table`fix #4292: support `with { type: bytes }`publish 0.25.10 to npmrefactor: use strings.Builder (#4290)run `make update-compat-table`fix #4287: marked the wrong issue as fixedfix #4286: minifier panic due to identity functionfix #4265: `@supports` nested inside `::pseudo`
↗️ lmdb (indirect, 3.4.2 → 3.4.4) · Repo
Commits
See the full diff on Github. The new version differs by 9 commits:
Update versionTry to skip big key testProperly update the range of free-list writes when loose pages will be returned to the free-listUpgrade LZ4, fix #343Add useBigIntExtension to encoder options to pass through, ref #345Merge pull request #328 from yonatansnir/fix/readme-open-syntaxUpdate versionAdd additional checks for zero-sized free-list entriesDefault to skipping metadata for standard ordered binary encoding, but start at the beginning for other key encodings, #339
↗️ msgpackr (indirect, 1.11.5 → 1.11.8) · Repo
Commits
See the full diff on Github. The new version differs by 2 commits:
↗️ piscina (indirect, 5.1.3 → 5.1.4) · Repo · Changelog
Release Notes
5.1.4
What's Changed
- [Backport v5] chore(docs): remove duplicated by @github-actions[bot] in #846
- [Backport v5] refactor: tweaks by @github-actions[bot] in #847
- [Backport v5] chore: pin actions by @github-actions[bot] in #849
- [Backport v5] chore(deps): Bump on-headers and compression in /docs by @github-actions[bot] in #855
- [Backport v5] refactor: TaskInfo by @github-actions[bot] in #859
- [Backport v5] refactor: small adjustments over WorkerInfo by @github-actions[bot] in #865
- chore(deps): Bump @napi-rs/nice from 1.0.4 to 1.1.1 by @github-actions[bot] in #883
- fix: add provenance by @github-actions[bot] in #885
- fix: fix taskDone duplicate listener by @github-actions[bot] in #896
- [Backport v5] chore(deps-dev): Bump tsx from 4.20.3 to 4.20.6 by @github-actions[bot] in #910
- [Backport v5] chore(deps): Bump actions/checkout from 4.3.0 to 5.0.0 by @github-actions[bot] in #912
- [Backport v5] chore(deps): Bump actions/stale from 9.1.0 to 10.1.0 by @github-actions[bot] in #911
- docs: add sponsors section by @github-actions[bot] in #917
- fix: standardize normalize calculation of stddev by @github-actions[bot] in #924
Full Changelog: v5.1.3...v5.1.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 19 commits:
chore(release): 5.1.4fix: standardize normalize calculation of stddev (#924)docs: add sponsors section (#917)chore(deps): Bump actions/stale from 9.1.0 to 10.1.0 (#911)chore(deps): Bump actions/checkout from 4.3.0 to 5.0.0 (#912)[Backport v5] chore(deps-dev): Bump tsx from 4.20.3 to 4.20.6 (#910)[Backport v5] fix: fix taskDone duplicate listener (#896)fix: add provenance (#885)chore(deps): Bump @napi-rs/nice from 1.0.4 to 1.1.1 (#883)chore: disable windows runs (#867)refactor: small adjustments over WorkerInfo (#865)refactor: TaskInfo (#859)chore: fix indentationchore(deps-dev): Bump @types/node from 24.0.13 to 24.0.15 (#856)chore: enhance benchmarks (#851)[Backport v5] chore(deps): Bump on-headers and compression in /docs (#855)chore: pin actions (#849)refactor: tweaks (#847)chore(docs): remove duplicated (#846)
↗️ rollup (indirect, 4.52.3 → 4.55.1) · Repo · Changelog
Release Notes
4.55.1
4.55.1
2026-01-05
Bug Fixes
- Fix artifact reference for OpenBSD (#6231)
Pull Requests
- #6231: Fix OpenBSD artifacts and ensure OIDC is working (@lukastaegert)
4.54.0
4.54.0
2025-12-20
Features
- Enable tree-shaking for
Symbol.hasInstance,Symbol.disposeandSymbol.asyncDisposeproperties if unused (#6046)Bug Fixes
- Ensure that well-known-Symbol-valued properties are not tree-shaken except in select cases (#6046)
- Ensure namespace properties are included when referenced only from a try-catch (#6216)
Pull Requests
- #6046: fix: correctly handle wellknown protocols (@cyyynthia, @lukastaegert)
- #6201: chore(deps): update dependency lru-cache to v11 (@renovate[bot], @lukastaegert)
- #6211: chore(deps): update msys2/setup-msys2 digest to 4f806de (@renovate[bot], @lukastaegert)
- #6212: chore(deps): update actions/cache action to v5 (@renovate[bot])
- #6213: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6214: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6215: chore(deps): lock file maintenance (@renovate[bot])
- #6216: fix: include namespace variable paths during try-catch deoptimization (@schwing)
4.53.5
4.53.5
2025-12-16
Bug Fixes
- Fix wrong semicolon insertion position when using JSX (#6206)
- Generate spec-compliant sourcemaps when sources content is excluded (#6196)
Pull Requests
4.53.4
4.53.4
2025-12-15
Bug Fixes
- Ensure
Symbol.disposeandSymbol.asyncDisposeproperties are never removed with(await) usingdeclarations. (#6209)Pull Requests
- #6185: chore(deps): update dependency @inquirer/prompts to v8 (@renovate[bot], @lukastaegert)
- #6186: fix(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6187: chore(deps): lock file maintenance (@renovate[bot])
- #6188: chore(deps): lock file maintenance minor/patch updates (@renovate[bot])
- #6190: Fix syntax error in manualChunks example (@jonnyeom)
- #6194: chore(deps): update actions/checkout action to v6 (@renovate[bot])
- #6195: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6202: fix(deps): update swc monorepo (major) (@renovate[bot])
- #6203: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6209: Do not tree-shake handlers for "using" (@lukastaegert)
4.53.3
4.53.3
2025-11-19
Bug Fixes
- Fix an error where too many modules where flagged for having an unused external import (#6182)
- Fix an error where an assignment was wrongly tree-shaken when mutating it (#6183)
Pull Requests
- #6171: Add test-install CI job to test packaging, installation and importing of rollup package (@antoninkriz, @lukastaegert)
- #6174: Re-enable TypeScript test (@lukastaegert)
- #6180: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6182: Tracing the importers chain for exported variables in external module (@TrickyPi, @lukastaegert)
- #6183: Check if left side is included when checking if assigning to an assignment has side effects (@lukastaegert)
4.53.2
4.53.2
2025-11-10
Bug Fixes
- Do not throw when using invalid escape sequences in template literals (#6177)
Pull Requests
4.53.1
4.53.1
2025-11-07
Bug Fixes
- Fix install script (#6172)
Pull Requests
4.53.0
4.53.0
2025-11-07
Features
- Improve rendering performance by caching generated variable names (#5947)
Pull Requests
- #5947: refactor: store safe variable names in cache for subsequent usage (@Aslemammad, @lukastaegert, @service account user)
- #6149: chore(deps): update dependency vite to v7.1.11 [security] (@renovate[bot], @service account user)
- #6151: fix(deps): update swc monorepo (major) (@renovate[bot], @service account user)
- #6152: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6153: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @service account user)
- #6155: Fix tests: Do not swallow warnings for multi-format tests (@lukastaegert, @service account user)
- #6159: chore(deps): update dependency eslint-plugin-unicorn to v62 (@renovate[bot])
- #6160: chore(deps): update github artifact actions (major) (@renovate[bot])
- #6161: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6164: chore(deps): update dependency @rollup/plugin-alias to v6 (@renovate[bot])
- #6165: chore(deps): update dependency @rollup/plugin-commonjs to v29 (@renovate[bot])
- #6166: fix(deps): update swc monorepo (major) (@renovate[bot], @lukastaegert)
- #6167: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
4.52.5
4.52.5
2025-10-18
Bug Fixes
- Always produce valid UUIDs as debugIds in sourcemaps (#6144)
Pull Requests
- #6135: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6140: chore(deps): update peter-evans/create-or-update-comment action to v5 (@renovate[bot])
- #6141: chore(deps): update peter-evans/find-comment action to v4 (@renovate[bot])
- #6142: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6143: chore: eslint enable concurrency option (@btea)
- #6144: fix: generation of debugIDs with invalid length (@pablomatiasgomez, @lukastaegert)
- #6146: chore(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
- #6147: chore(deps): update actions/setup-node action to v6 (@renovate[bot])
4.52.4
4.52.4
2025-10-03
Bug Fixes
- Fix an issue where the wrong branch of nullish coalescing was picked (#6133)
Pull Requests
- #6128: Enable npm OIDC publishing (@lukastaegert)
- #6133: Correct nullish coalescing branch resolution for symbol left value (@TrickyPi)
- #6134: fix(deps): lock file maintenance minor/patch updates (@renovate[bot], @lukastaegert)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ sass (indirect, 1.90.0 → 1.97.1) · Repo · Changelog
Release Notes
Too many releases to show here. View the full release notes.
↗️ undici (indirect, 7.16.0 → 7.18.0) · Repo
Release Notes
7.18.0
What's Changed
Full Changelog: v7.17.0...v7.18.0
7.17.0
What's Changed
- chore: extract infra and encoding methods by @Uzlopak in #4523
- ci: remove h2 by @Uzlopak in #4534
- ci: make nodejs-shared wf reusable, install binaryen for wasm-opt, test on node-nightly by @Uzlopak in #4535
- ci: fix nightly shared library case by @Uzlopak in #4543
- test: consume bodies of fetch responses to fix failing macos 20 ci by @Uzlopak in #4528
- docs: add Cache Interceptor example to README by @tawseefnabi in #4393
- test: remove node20 version check by @Uzlopak in #4544
- types: use MessagePort instance type in MessageEvent by @Renegade334 in #4546
- ci: set write permissions on job level by @Uzlopak in #4537
- lint: activate n/no-process-exit by @Uzlopak in #4548
- ci: run benchmarks on pull_requests and by pushing on specific branches only by @Uzlopak in #4536
- chore: activate n/prefer-node-protocol to enforce
'node:'prefix for requiring node built-ins by @Uzlopak in #4547- feat(H2): correct CONNECT behaviour by @metcoder95 in #4541
- test: fix plans by @Uzlopak in #4550
- feat: add runtime feature "detection" by @Uzlopak in #4545
- perf: use less promises in extractBody by @Uzlopak in #4458
- fix(proxy-agent): add missing return after callback-call by @Uzlopak in #4553
- fix: remove redundant line in retry-handler by @Uzlopak in #4554
- ci: add no-wasm-simd option by @Uzlopak in #4533
- fix: use lazyloaders for runtime feature detection by @Uzlopak in #4557
- fix: minor changes in dispatcher-base.js and types for Dispatcher by @Uzlopak in #4556
- http2: refactor and split tests of http2.js into multiple files by @Uzlopak in #4561
- fix: dns-interceptor test should await plan to complete by @Uzlopak in #4560
- chore: remove istanbul instructions by @Uzlopak in #4559
- fix: keep promise chains intact by @Uzlopak in #4558
- build(deps): bump wait-on from 8.0.5 to 9.0.1 in /benchmarks by @dependabot[bot] in #4567
- chore: remove tspl from eventsource by @Uzlopak in #4569
- chore: remove tspl from fetch by @Uzlopak in #4570
- feat: add getUpstream() method to BalancedPool by @mcollina in #4586
- fetch: handle invalid priority values properly by @Uzlopak in #4522
- ci: fix test coverage for codecov by @Uzlopak in #4520
- types: optional
statusinResponse.redirectby @gineika in #4591- docs: unix socket add-on by @FelixVaughan in #4587
- build(deps): bump codecov/codecov-action from 5.5.0 to 5.5.1 by @dependabot[bot] in #4601
- build(deps): bump hendrikmuhs/ccache-action from 1.2.18 to 1.2.19 by @dependabot[bot] in #4600
- build(deps): bump ossf/scorecard-action from 2.4.2 to 2.4.3 by @dependabot[bot] in #4603
- build(deps): bump actions/setup-node from 4.0.2 to 5.0.0 by @dependabot[bot] in #4604
- build(deps): bump actions/github-script from 7.0.1 to 8.0.0 by @dependabot[bot] in #4602
- build(deps): bump step-security/harden-runner from 2.13.0 to 2.13.1 by @dependabot[bot] in #4598
- build(deps): bump github/codeql-action from 3.30.0 to 3.30.5 by @dependabot[bot] in #4599
- build(deps): bump actions/dependency-review-action from 4.7.3 to 4.8.0 by @dependabot[bot] in #4597
- fix: cacheStores types and usage in README by @lucalooz in #4605
- Feat dns interceptor storage by @SuperOleg39 in #4589
- docs: add crawling best practices by @Uzlopak in #4590
- fix:
304 not modifiedreply upon revalidation did not update cache. by @daan944 in #4617- chore: use testcontext for test:infra by @Uzlopak in #4579
- fetch: improve regexes in data-uri.js by @Uzlopak in #4483
- perf: optimize validate http token by @PandaWorker in #4608
- test: improve long-lived-abort-controller test by @Uzlopak in #4621
- ci: add node.js 25 to test matrix by @shivarm in #4626
- chore: use testcontext for test/utils tests by @Uzlopak in #4577
- chore: remove tspl from websocket by @Uzlopak in #4568
- fix(ws) onSocketClose being called multiple times by @KhafraDev in #4632
- fix: prevent duplicate debug logs when multiple undici instances exist by @mcollina in #4630
- chore: use testcontext for busboy tests by @Uzlopak in #4572
- test: fix flaky http2-dispatcher test by @mcollina in #4633
- build(deps): bump uWebSockets.js from v20.52.0 to v20.54.0 in /benchmarks by @dependabot[bot] in #4635
- Run the gc() in long-lived-abort-controller test by @mcollina in #4638
- Do not destroy the HTTP2 stream twice in tests by @mcollina in #4637
- Fix http2-dispatcher test by @mcollina in #4640
- fix: fetch blob with range off-by-one error by @platypii in #4643
- fix: ensure HTTP/2 sends Content-Length for empty POST requests by @mcollina in #4613
- build(deps): bump uWebSockets.js from v20.54.0 to v20.55.0 in /benchmarks by @dependabot[bot] in #4645
- feat(#2458): WebSocket through HTTP/2 by @metcoder95 in #4540
- docs(README): correct the example code for the consumption of respons… by @tenkirin in #4658
- build(deps): bump github/codeql-action from 3.30.5 to 4.31.2 by @dependabot[bot] in #4653
- build(deps): bump fastify/github-action-merge-dependabot from 3.11.1 to 3.11.2 by @dependabot[bot] in #4655
- build(deps): bump actions/setup-node from 5.0.0 to 6.0.0 by @dependabot[bot] in #4652
- build(deps): bump actions/upload-artifact from 4.6.2 to 5.0.0 by @dependabot[bot] in #4651
- build(deps): bump actions/dependency-review-action from 4.8.0 to 4.8.1 by @dependabot[bot] in #4654
- don't freeze urlList for opaque filtered responses by @KhafraDev in #4656
- fix fd parsing unquoted attribute values by @KhafraDev in #4662
- build(deps): bump uWebSockets.js from v20.55.0 to v20.56.0 in /benchmarks by @dependabot[bot] in #4665
- feat(dispatcher/proxy-agent): new diagnostics event 'undici:proxy:connected' by @SuperOleg39 in #4659
- Feat/round robin pool by @FelixVaughan in #4650
- Formdata ignore epilogue preamble by @KhafraDev in #4672
- build(deps): bump actions/checkout from 5.0.0 to 6.0.0 by @dependabot[bot] in #4682
- fix: snapshot url exclusion by @FelixVaughan in #4670
- feat: support h2c over unix domain sockets by @chrros95 in #4690
- fix(docs): remove unused TypeScript example code block by @kerolloz in #4701
- feat: add deduplicate interceptor for request deduplication by @mcollina in #4679
- chore: use testcontext for mock tests by @Uzlopak in #4582
- fix(test): remove hardcoded folder name in client-error-stack-trace test by @mcollina in #4707
New Contributors
- @gineika made their first contribution in #4591
- @lucalooz made their first contribution in #4605
- @SuperOleg39 made their first contribution in #4589
- @daan944 made their first contribution in #4617
- @PandaWorker made their first contribution in #4608
- @platypii made their first contribution in #4643
- @tenkirin made their first contribution in #4658
- @kerolloz made their first contribution in #4701
Full Changelog: v7.16.0...v7.17.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ vite (indirect, 7.1.11 → 7.3.0) · Repo · Changelog
Release Notes
7.3.0
Please refer to CHANGELOG.md for details.
7.2.7
Please refer to CHANGELOG.md for details.
7.2.6
Please refer to CHANGELOG.md for details.
7.2.4
Please refer to CHANGELOG.md for details.
7.2.3
Please refer to CHANGELOG.md for details.
7.2.2
Please refer to CHANGELOG.md for details.
7.2.1
Please refer to CHANGELOG.md for details.
7.2.0
Please refer to CHANGELOG.md for details.
7.1.12
Please refer to CHANGELOG.md for details.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
↗️ watchpack (indirect, 2.4.4 → 2.5.0) · Repo
Commits
See the full diff on Github. The new version differs by 7 commits: