Skip to content

v0.14.39

Compare
Choose a tag to compare
@github-actions github-actions released this 11 May 21:56
  • 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 in package.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 the browser 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 in require('sub') was previously matching the remapping "./sub/sub.js": "./sub/foo.js" but with this release it should now no longer match that remapping. Now require('sub') will only match the remapping "./sub/sub": "./sub/foo.js" (without the trailing .js). Browserify apparently only matches without the .js suffix here.