Skip to content

v0.17.13

Compare
Choose a tag to compare
@github-actions github-actions released this 24 Mar 18:58
  • Work around an issue with NODE_PATH and Go's WebAssembly internals (#3001)

    Go's WebAssembly implementation returns EINVAL instead of ENOTDIR when using the readdir syscall on a file. This messes up esbuild's implementation of node's module resolution algorithm since encountering ENOTDIR causes esbuild to continue its search (since it's a normal condition) while other encountering other errors causes esbuild to fail with an I/O error (since it's an unexpected condition). You can encounter this issue in practice if you use node's legacy NODE_PATH feature to tell esbuild to resolve node modules in a custom directory that was not installed by npm. This release works around this problem by converting EINVAL into ENOTDIR for the readdir syscall.

  • Fix a minification bug with CSS @layer rules that have parsing errors (#3016)

    CSS at-rules require either a {} block or a semicolon at the end. Omitting both of these causes esbuild to treat the rule as an unknown at-rule. Previous releases of esbuild had a bug that incorrectly removed unknown at-rules without any children during minification if the at-rule token matched an at-rule that esbuild can handle. Specifically cssnano can generate @layer rules with parsing errors, and empty @layer rules cannot be removed because they have side effects (@layer didn't exist when esbuild's CSS support was added, so esbuild wasn't written to handle this). This release changes esbuild to no longer discard @layer rules with parsing errors when minifying (the rule @layer c has a parsing error):

    /* Original input */
    @layer a {
      @layer b {
        @layer c
      }
    }
    
    /* Old output (with --minify) */
    @layer a.b;
    
    /* New output (with --minify) */
    @layer a.b.c;
  • Unterminated strings in CSS are no longer an error

    The CSS specification provides rules for handling parsing errors. One of those rules is that user agents must close strings upon reaching the end of a line (i.e., before an unescaped line feed, carriage return or form feed character), but then drop the construct (declaration or rule) in which the string was found. For example:

    p {
      color: green;
      font-family: 'Courier New Times
      color: red;
      color: green;
    }

    ...would be treated the same as:

    p { color: green; color: green; }

    ...because the second declaration (from font-family to the semicolon after color: red) is invalid and is dropped.

    Previously using this CSS with esbuild failed to build due to a syntax error, even though the code can be interpreted by a browser. With this release, the code now produces a warning instead of an error, and esbuild prints the invalid CSS such that it stays invalid in the output:

    /* esbuild's new non-minified output: */
    p {
      color: green;
      font-family: 'Courier New Times
      color: red;
      color: green;
    }
    /* esbuild's new minified output: */
    p{font-family:'Courier New Times
    color: red;color:green}