-
Lower
for await
loops (#1930)This release lowers
for await
loops to the equivalentfor
loop containingawait
when esbuild is configured such thatfor await
loops are unsupported. This transform still requires at least generator functions to be supported since esbuild's lowering ofawait
currently relies on generators. This new transformation is mostly modeled after what the TypeScript compiler does. Here's an example:async function f() { for await (let x of y) x() }
The code above will now become the following code with
--target=es2017
(omitting the code for the__forAwait
helper function):async function f() { try { for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) { let x = temp.value; x(); } } catch (temp) { error = [temp]; } finally { try { more && (temp = iter.return) && await temp.call(iter); } finally { if (error) throw error[0]; } } }
-
Automatically fix invalid
supported
configurations (#2497)The
--target=
setting lets you tell esbuild to target a specific version of one or more JavaScript runtimes such aschrome80,node14
and esbuild will restrict its output to only those features supported by all targeted JavaScript runtimes. More recently, esbuild introduced the--supported:
setting that lets you override which features are supported on a per-feature basis. However, this now lets you configure nonsensical things such as--supported:async-await=false --supported:async-generator=true
. Previously doing this could result in esbuild building successfully but producing invalid output.Starting with this release, esbuild will now attempt to automatically fix nonsensical feature override configurations by introducing more overrides until the configuration makes sense. So now the configuration from previous example will be changed such that
async-await=false
impliesasync-generator=false
. The full list of implications that were introduced is below:-
async-await=false
implies:async-generator=false
for-await=false
top-level-await=false
-
generator=false
implies:async-generator=false
-
object-accessors=false
implies:class-private-accessor=false
class-private-static-accessor=false
-
class-field=false
implies:class-private-field=false
-
class-static-field=false
implies:class-private-static-field=false
-
class=false
implies:class-field=false
class-private-accessor=false
class-private-brand-check=false
class-private-field=false
class-private-method=false
class-private-static-accessor=false
class-private-static-field=false
class-private-static-method=false
class-static-blocks=false
class-static-field=false
-
-
Implement a small minification improvement (#2496)
Some people write code that contains a label with an immediate break such as
x: break x
. Previously this code was not removed during minification but it will now be removed during minification starting with this release. -
Fix installing esbuild via Yarn with
enableScripts: false
configured (#2457)If esbuild is installed with Yarn with the
enableScripts: false
setting configured, then Yarn will not "unplug" theesbuild
package (i.e. it will keep the entire package inside a.zip
file). This messes with esbuild's library code that extracts the platform-specific binary executable because that code copies the binary executable into the esbuild package directory, and Yarn's.zip
file system shim doesn't let you write to a directory inside of a.zip
file. This release fixes this problem by writing to thenode_modules/.cache/esbuild
directory instead in this case. So you should now be able to use esbuild with Yarn whenenableScripts: false
is configured.This fix was contributed by @jonaskuske.