esbuild 0.14.39
-
Fix code generation for
export defaultand/* @__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
browserfield inpackage.json(#2239)This release changes esbuild's interpretation of
browserpath 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 thebrowserfield, 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
subinrequire('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.jssuffix here. -