v0.14.39
-
Fix code generation for
export default
and/* @__PURE__ */
call (#2203)The
/* @__PURE__ */
comment annotation can be added to function calls to indicate that they are side-effect free. These annotations are passed through into the output by esbuild since many JavaScript tools understand them. However, there was an edge case where printing this comment before a function call caused esbuild to fail to parenthesize a function literal because it thought it was no longer at the start of the expression. This problem has been fixed:// Original code export default /* @__PURE__ */ (function() { })() // Old output export default /* @__PURE__ */ function() { }(); // New output export default /* @__PURE__ */ (function() { })();
-
Preserve
...
before JSX child expressions (#2245)TypeScript 4.5 changed how JSX child expressions that start with
...
are emitted. Previously the...
was omitted but starting with TypeScript 4.5, the...
is now preserved instead. This release updates esbuild to match TypeScript's new output in this case:// Original code console.log(<a>{...b}</a>) // Old output console.log(/* @__PURE__ */ React.createElement("a", null, b)); // New output console.log(/* @__PURE__ */ React.createElement("a", null, ...b));
Note that this behavior is TypeScript-specific. Babel doesn't support the
...
token at all (it gives the error "Spread children are not supported in React"). -
Slightly adjust esbuild's handling of the
browser
field inpackage.json
(#2239)This release changes esbuild's interpretation of
browser
path remapping to fix a regression that was introduced in esbuild version 0.14.21. Browserify has a bug where it incorrectly matches package paths to relative paths in thebrowser
field, and esbuild replicates this bug for compatibility with Browserify. I have a set of tests that I use to verify that esbuild's replication of this Browserify is accurate here: https://github.com/evanw/package-json-browser-tests. However, I was missing a test case and esbuild's behavior diverges from Browserify in this case. This release now handles this edge case as well:-
entry.js
:require('pkg/sub')
-
node_modules/pkg/package.json
:{ "browser": { "./sub": "./sub/foo.js", "./sub/sub.js": "./sub/foo.js" } }
-
node_modules/pkg/sub/foo.js
:require('sub')
-
node_modules/sub/index.js
:console.log('works')
The import path
sub
inrequire('sub')
was previously matching the remapping"./sub/sub.js": "./sub/foo.js"
but with this release it should now no longer match that remapping. Nowrequire('sub')
will only match the remapping"./sub/sub": "./sub/foo.js"
(without the trailing.js
). Browserify apparently only matches without the.js
suffix here. -