-
Allow esbuild to be restarted in Deno (#1238)
The esbuild API for Deno has an extra function called
stop()
that doesn't exist in esbuild's API for node. This is because Deno doesn't provide a way to stop esbuild automatically, so callingstop()
is required to allow Deno to exit. However, once stopped the esbuild API could not be restarted.With this release, you can now continue to use esbuild after calling
stop()
. This will restart esbuild's API and means that you will need to callstop()
again for Deno to be able to exit. This feature was contributed by @lucacasonato. -
Fix code splitting edge case (#1252)
This release fixes an edge case where bundling with code splitting enabled generated incorrect code if multiple ESM entry points re-exported the same re-exported symbol from a CommonJS file. In this case the cross-chunk symbol dependency should be the variable that holds the return value from the
require()
call instead of the original ESM namedimport
clause item. When this bug occurred, the generated ESM code contained an export and import for a symbol that didn't exist, which caused a module initialization error. This case should now work correctly. -
Fix code generation with
declare
class fields (#1242)This fixes a bug with TypeScript code that uses
declare
on a class field and yourtsconfig.json
file has"useDefineForClassFields": true
. Fields marked asdeclare
should not be defined in the generated code, but they were incorrectly being declared asundefined
. These fields are now correctly omitted from the generated code. -
Annotate module wrapper functions in debug builds (#1236)
Sometimes esbuild needs to wrap certain modules in a function when bundling. This is done both for lazy evaluation and for CommonJS modules that use a top-level
return
statement. Previously these functions were all anonymous, so stack traces for errors thrown during initialization looked like this:Error: Electron failed to install correctly, please delete node_modules/electron and try installing again at getElectronPath (out.js:16:13) at out.js:19:21 at out.js:1:45 at out.js:24:3 at out.js:1:45 at out.js:29:3 at out.js:1:45 at Object.<anonymous> (out.js:33:1)
This release adds names to these anonymous functions when minification is disabled. The above stack trace now looks like this:
Error: Electron failed to install correctly, please delete node_modules/electron and try installing again at getElectronPath (out.js:19:15) at node_modules/electron/index.js (out.js:22:23) at __require (out.js:2:44) at src/base/window.js (out.js:29:5) at __require (out.js:2:44) at src/base/kiosk.js (out.js:36:5) at __require (out.js:2:44) at Object.<anonymous> (out.js:41:1)
This is similar to Webpack's development-mode behavior:
Error: Electron failed to install correctly, please delete node_modules/electron and try installing again at getElectronPath (out.js:23:11) at Object../node_modules/electron/index.js (out.js:27:18) at __webpack_require__ (out.js:96:41) at Object../src/base/window.js (out.js:49:1) at __webpack_require__ (out.js:96:41) at Object../src/base/kiosk.js (out.js:38:1) at __webpack_require__ (out.js:96:41) at out.js:109:1 at out.js:111:3 at Object.<anonymous> (out.js:113:12)
These descriptive function names will additionally be available when using a profiler such as the one included in the "Performance" tab in Chrome Developer Tools. Previously all functions were named
(anonymous)
which made it difficult to investigate performance issues during bundle initialization. -
Add CSS minification for more cases
The following CSS minification cases are now supported:
-
The CSS
margin
property family is now minified including combining themargin-top
,margin-right
,margin-bottom
, andmargin-left
properties into a singlemargin
property. -
The CSS
padding
property family is now minified including combining thepadding-top
,padding-right
,padding-bottom
, andpadding-left
properties into a singlepadding
property. -
The CSS
border-radius
property family is now minified including combining theborder-top-left-radius
,border-top-right-radius
,border-bottom-right-radius
, andborder-bottom-left-radius
properties into a singleborder-radius
property. -
The four special pseudo-elements
::before
,::after
,::first-line
, and::first-letter
are allowed to be parsed with one:
for legacy reasons, so the::
is now converted to:
for these pseudo-elements. -
Duplicate CSS rules are now deduplicated. Only the last rule is kept, since that's the only one that has any effect. This applies for both top-level rules and nested rules.
-
-
Preserve quotes around properties when minification is disabled (#1251)
Previously the parser did not distinguish between unquoted and quoted properties, since there is no semantic difference. However, some tools such as Google Closure Compiler with "advanced mode" enabled attach their own semantic meaning to quoted properties, and processing code intended for Google Closure Compiler's advanced mode with esbuild was changing those semantics. The distinction between unquoted and quoted properties is now made in the following cases:
import * as ns from 'external-pkg' console.log([ { x: 1, 'y': 2 }, { x() {}, 'y'() {} }, class { x = 1; 'y' = 2 }, class { x() {}; 'y'() {} }, { x: x, 'y': y } = z, [x.x, y['y']], [ns.x, ns['y']], ])
The parser will now preserve the quoted properties in these cases as long as
--minify-syntax
is not enabled. This does not mean that esbuild is officially supporting Google Closure Compiler's advanced mode, just that quoted properties are now preserved when the AST is pretty-printed. Google Closure Compiler's advanced mode accepts a language that shares syntax with JavaScript but that deviates from JavaScript semantics and there could potentially be other situations where preprocessing code intended for Google Closure Compiler's advanced mode with esbuild first causes it to break. If that happens, that is not a bug with esbuild.