Update dependency esbuild to ^0.14.38 #8
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^0.14.25
->^0.14.38
Release Notes
evanw/esbuild
v0.14.38
Compare Source
Further fixes to TypeScript 4.7 instantiation expression parsing (#2201)
This release fixes some additional edge cases with parsing instantiation expressions from the upcoming version 4.7 of TypeScript. Previously it was allowed for an instantiation expression to precede a binary operator but with this release, that's no longer allowed. This was sometimes valid in the TypeScript 4.7 beta but is no longer allowed in the latest version of TypeScript 4.7. Fixing this also fixed a regression that was introduced by the previous release of esbuild:
a<b> == c<d>
a == c
a == c
a == c
a<b> in c<d>
a in c
a<b>>=c<d>
a >= c
a<b>=c<d>
a < b >= c
a = c
a < b >= c
a = c
a = c
a<b>>c<d>
a < b >> c
a < b >> c
a < b >> c
a < b >> c
a > c
a < b >> c
This table illustrates some of the more significant changes between all of these parsers. The most important part is that esbuild 0.14.38 now matches the behavior of the latest TypeScript compiler for all of these cases.
v0.14.37
Compare Source
Add support for TypeScript's
moduleSuffixes
field from TypeScript 4.7The upcoming version of TypeScript adds the
moduleSuffixes
field totsconfig.json
that introduces more rules to import path resolution. SettingmoduleSuffixes
to[".ios", ".native", ""]
will try to look at the the relative files./foo.ios.ts
,./foo.native.ts
, and finally./foo.ts
for an import path of./foo
. Note that the empty string""
inmoduleSuffixes
is necessary for TypeScript to also look-up./foo.ts
. This was announced in the TypeScript 4.7 beta blog post.Match the new ASI behavior from TypeScript nightly builds (#2188)
This release updates esbuild to match some very recent behavior changes in the TypeScript parser regarding automatic semicolon insertion. For more information, see TypeScript issues #48711 and #48654 (I'm not linking to them directly to avoid Dependabot linkback spam on these issues due to esbuild's popularity). The result is that the following TypeScript code is now considered valid TypeScript syntax:
This fix was contributed by @g-plane.
v0.14.36
Compare Source
Revert path metadata validation for now (#2177)
This release reverts the path metadata validation that was introduced in the previous release. This validation has uncovered a potential issue with how esbuild handles
onResolve
callbacks in plugins that will need to be fixed before path metadata validation is re-enabled.v0.14.35
Compare Source
Add support for parsing
typeof
on #private fields from TypeScript 4.7 (#2174)The upcoming version of TypeScript now lets you use
#private
fields intypeof
type expressions:https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/#typeof-on-private-fields
With this release, esbuild can now parse these new type expressions as well. This feature was contributed by @magic-akari.
Add Opera and IE to internal CSS feature support matrix (#2170)
Version 0.14.18 of esbuild added Opera and IE as available target environments, and added them to the internal JS feature support matrix. CSS feature support was overlooked, however. This release adds knowledge of Opera and IE to esbuild's internal CSS feature support matrix:
The fix for this issue was contributed by @sapphi-red.
Change TypeScript class field behavior when targeting ES2022
TypeScript 4.3 introduced a breaking change where class field behavior changes from assign semantics to define semantics when the
target
setting intsconfig.json
is set toESNext
. Specifically, the default value for TypeScript'suseDefineForClassFields
setting when unspecified istrue
if and only iftarget
isESNext
. TypeScript 4.6 introduced another change where this behavior now happens for bothESNext
andES2022
. Presumably this will be the case forES2023
and up as well. With this release, esbuild's behavior has also been changed to match. Now configuring esbuild with--target=es2022
will also cause TypeScript files to use the new class field behavior.Validate that path metadata returned by plugins is consistent
The plugin API assumes that all metadata for the same path returned by a plugin's
onResolve
callback is consistent. Previously this assumption was just assumed without any enforcement. Starting with this release, esbuild will now enforce this by generating a build error if this assumption is violated. The lack of validation has not been an issue (I have never heard of this being a problem), but it still seems like a good idea to enforce it. Here's a simple example of a plugin that generates inconsistentsideEffects
metadata:Since esbuild processes everything in parallel, the set of metadata that ends up being used for a given path is essentially random since it's whatever the task scheduler decides to schedule first. Thus if a plugin does not consistently provide the same metadata for a given path, subsequent builds may return different results. This new validation check prevents this problem.
Here's the new error message that's shown when this happens:
Suggest enabling a missing condition when
exports
map fails (#2163)This release adds another suggestion to the error message that happens when an
exports
map lookup fails if the failure could potentially be fixed by adding a missing condition. Here's what the new error message looks like (which now suggests--conditions=module
as a possible workaround):This particular package had an issue where it was using the Webpack-specific
module
condition without providing adefault
condition. It looks like the intent in this case was to use the standardimport
condition instead. This specific change wasn't suggested here because this error message is for package consumers, not package authors.v0.14.34
Compare Source
Something went wrong with the publishing script for the previous release. Publishing again.
v0.14.33
Compare Source
Fix a regression regarding
super
(#2158)This fixes a regression from the previous release regarding classes with a super class, a private member, and a static field in the scenario where the static field needs to be lowered but where private members are supported by the configured target environment. In this scenario, esbuild could incorrectly inject the instance field initializers that use
this
into the constructor before the call tosuper()
, which is invalid. This problem has now been fixed (notice thatthis
is now used aftersuper()
instead of before):During parsing, esbuild scans the class and makes certain decisions about the class such as whether to lower all static fields, whether to lower each private member, or whether calls to
super()
need to be tracked and adjusted. Previously esbuild made two passes through the class members to compute this information. However, with the newsuper()
call lowering logic added in the previous release, we now need three passes to capture the whole dependency chain for this case: 1) lowering static fields requires 2) lowering private members which requires 3) adjustingsuper()
calls.The reason lowering static fields requires lowering private members is because lowering static fields moves their initializers outside of the class body, where they can't access private members anymore. Consider this code:
We can't just lower static fields without also lowering private members, since that causes a syntax error:
And the reason lowering private members requires adjusting
super()
calls is because the injected private member initializers usethis
, which is only accessible aftersuper()
calls in the constructor.Fix an issue with
--keep-names
not keeping some names (#2149)This release fixes a regression with
--keep-names
from version 0.14.26. PR #2062 attempted to remove superfluous calls to the__name
helper function by omitting calls of the form__name(foo, "foo")
where the name of the symbol in the first argument is equal to the string in the second argument. This was assuming that the initializer for the symbol would automatically be assigned the expected.name
property by the JavaScript VM, which turned out to be an incorrect assumption. To fix the regression, this PR has been reverted.The assumption is true in many cases but isn't true when the initializer is moved into another automatically-generated variable, which can sometimes be necessary during the various syntax transformations that esbuild does. For example, consider the following code:
This code should print
Bar Foo
. With--keep-names --target=es6
that code is lowered by esbuild into the following code (omitting the helper function definitions for brevity):The injection of the automatically-generated
_Foo
variable is necessary to preserve the semantics of the capturedFoo
binding for methods defined within the class body, even when the definition needs to be moved outside of the class body during code transformation. Due to a JavaScript quirk, this binding is immutable and does not change even ifFoo
is later reassigned. The PR that was reverted was incorrectly removing the call to__name(Foo, "Foo")
, which turned out to be necessary after all in this case.Print some large integers using hexadecimal when minifying (#2162)
When
--minify
is active, esbuild will now use one fewer byte to represent certain large integers:This works because a hexadecimal representation can be shorter than a decimal representation starting at around 1012 and above.
This optimization made me realize that there's probably an opportunity to optimize printed numbers for smaller gzipped size instead of or in addition to just optimizing for minimal uncompressed byte count. The gzip algorithm does better with repetitive sequences, so for example
0xFFFFFFFF
is probably a better representation than4294967295
even though the byte counts are the same. As far as I know, no JavaScript minifier does this optimization yet. I don't know enough about how gzip works to know if this is a good idea or what the right metric for this might be.Add Linux ARM64 support for Deno (#2156)
This release adds Linux ARM64 support to esbuild's Deno API implementation, which allows esbuild to be used with Deno on a Raspberry Pi.
v0.14.32
Compare Source
Fix
super
usage in lowered private methods (#2039)Previously esbuild failed to transform
super
property accesses inside private methods in the case when private methods have to be lowered because the target environment doesn't support them. The generated code still contained thesuper
keyword even though the method was moved outside of the class body, which is a syntax error in JavaScript. This release fixes this transformation issue and now produces valid code:Because of this change, lowered
super
property accesses on instances were rewritten so that they can exist outside of the class body. This rewrite affects code generation for allsuper
property accesses on instances including those inside loweredasync
functions. The new approach is different but should be equivalent to the old approach:Fix some tree-shaking bugs regarding property side effects
This release fixes some cases where side effects in computed properties were not being handled correctly. Specifically primitives and private names as properties should not be considered to have side effects, and object literals as properties should be considered to have side effects:
Add the
wasmModule
option to theinitialize
JS API (#1093)The
initialize
JS API must be called when using esbuild in the browser to provide the WebAssembly module for esbuild to use. Previously the only way to do that was using thewasmURL
API option like this:With this release, you can now also initialize esbuild using a
WebAssembly.Module
instance using thewasmModule
API option instead. The example above is equivalent to the following code:This could be useful for environments where you want more control over how the WebAssembly download happens or where downloading the WebAssembly module is not possible.
v0.14.31
Compare Source
Add support for parsing "optional variance annotations" from TypeScript 4.7 (#2102)
The upcoming version of TypeScript now lets you specify
in
and/orout
on certain type parameters (specifically only on a type alias, an interface declaration, or a class declaration). These modifiers control type paramemter covariance and contravariance:With this release, esbuild can now parse these new type parameter modifiers. This feature was contributed by @magic-akari.
Improve support for
super()
constructor calls in nested locations (#2134)In JavaScript, derived classes must call
super()
somewhere in theconstructor
method before being able to accessthis
. Class public instance fields, class private instance fields, and TypeScript constructor parameter properties can all potentially cause code which usesthis
to be inserted into the constructor body, which must be inserted after thesuper()
call. To make these insertions straightforward to implement, the TypeScript compiler doesn't allow callingsuper()
somewhere other than in a root-level statement in the constructor body in these cases.Previously esbuild's class transformations only worked correctly when
super()
was called in a root-level statement in the constructor body, just like the TypeScript compiler. But with this release, esbuild should now generate correct code as long as the call tosuper()
appears anywhere in the constructor body:Add support for the new
@container
CSS rule (#2127)This release adds support for
@container
in CSS files. This means esbuild will now pretty-print and minify these rules better since it now better understands the internal structure of these rules:This was contributed by @yisibl.
Avoid CSS cascade-dependent keywords in the
font-family
property (#2135)In CSS,
initial
,inherit
, andunset
are CSS-wide keywords which means they have special behavior when they are specified as a property value. For example, whilefont-family: 'Arial'
(as a string) andfont-family: Arial
(as an identifier) are the same,font-family: 'inherit'
(as a string) uses the font family namedinherit
butfont-family: inherit
(as an identifier) inherits the font family from the parent element. This means esbuild must not unquote these CSS-wide keywords (anddefault
, which is also reserved) during minification to avoid changing the meaning of the minified CSS.The current draft of the new CSS Cascading and Inheritance Level 5 specification adds another concept called cascade-dependent keywords of which there are two:
revert
andrevert-layer
. This release of esbuild guards against unquoting these additional keywords as well to avoid accidentally breaking pages that use a font with the same name:This fix was contributed by @yisibl.
v0.14.30
Compare Source
Change the context of TypeScript parameter decorators (#2147)
While TypeScript parameter decorators are expressions, they are not evaluated where they exist in the code. They are moved to after the class declaration and evaluated there instead. Specifically this TypeScript code:
becomes this JavaScript code:
This has several consequences:
Whether
await
is allowed inside a decorator expression or not depends on whether the class declaration itself is in anasync
context or not. With this release, you can now useawait
inside a decorator expression when the class declaration is either inside anasync
function or is at the top-level of an ES module and top-level await is supported. Note that the TypeScript compiler currently has a bug regarding this edge case: Parameter decorators use incorrect async/await context, generated code has syntax error microsoft/TypeScript#48509.Also while TypeScript currently allows
await
to be used like this inasync
functions, it doesn't currently allowyield
to be used like this in generator functions. It's not yet clear whether this behavior withyield
is a bug or by design, so I haven't made any changes to esbuild's handling ofyield
inside decorator expressions in this release.Since the scope of a decorator expression is the scope enclosing the class declaration, they cannot access private identifiers. Previously this was incorrectly allowed but with this release, esbuild no longer allows this. Note that the TypeScript compiler currently has a bug regarding this edge case: Decorators broken with private fields, generated code has syntax error microsoft/TypeScript#48515.
Since the scope of a decorator expression is the scope enclosing the class declaration, identifiers inside parameter decorator expressions should never be resolved to a parameter of the enclosing method. Previously this could happen, which was a bug with esbuild. This bug no longer happens in this release.
Specifically previous versions of esbuild generated the following incorrect JavaScript (notice the use of
arg2
):This release now generates the following correct JavaScript (notice the use of
arg
):Fix some obscure edge cases with
super
property accessThis release fixes the following obscure problems with
super
when targeting an older JavaScript environment such as--target=es6
:The compiler could previously crash when a lowered
async
arrow function contained a class with a field initializer that used asuper
property access:The compiler could previously generate incorrect code when a lowered
async
method of a derived class contained a nested class with a computed class member involving asuper
property access on the derived class:The compiler could previously generate incorrect code when a default-exported class contained a
super
property access inside a lowered static private class field:v0.14.29
Compare Source
Fix a minification bug with a double-nested
if
inside a label followed byelse
(#2139)This fixes a minification bug that affects the edge case where
if
is followed byelse
and theif
contains a label that contains a nestedif
. Normally esbuild's AST printer automatically wraps the body of a single-statementif
in braces to avoid the "dangling else"if
/else
ambiguity common to C-like languages (where theelse
accidentally becomes associated with the innerif
instead of the outerif
). However, I was missing automatic wrapping of label statements, which did not have test coverage because they are a rarely-used feature. This release fixes the bug:Fix edge case regarding
baseUrl
andpaths
intsconfig.json
(#2119)In
tsconfig.json
, TypeScript forbids non-relative values insidepaths
ifbaseUrl
is not present, and esbuild does too. However, TypeScript checked this after the entiretsconfig.json
hierarchy was parsed while esbuild incorrectly checked this immediately when parsing the file containing thepaths
map. This caused incorrect warnings to be generated fortsconfig.json
files that specify abaseUrl
value and that inherit apaths
value from anextends
clause. Now esbuild will only check for non-relativepaths
values after the entire hierarchy has been parsed to avoid generating incorrect warnings.Better handle errors where the esbuild binary executable is corrupted or missing (#2129)
If the esbuild binary executable is corrupted or missing, previously there was one situation where esbuild's JavaScript API could hang instead of generating an error. This release changes esbuild's library code to generate an error instead in this case.
v0.14.28
Compare Source
Add support for some new CSS rules (#2115, #2116, #2117)
This release adds support for
@font-palette-values
,@counter-style
, and@font-feature-values
. This means esbuild will now pretty-print and minify these rules better since it now better understands the internal structure of these rules:Upgrade to Go 1.18.0 (#2105)
Binary executables for this version are now published with Go version 1.18.0. The Go release notes say that the linker generates smaller binaries and that on 64-bit ARM chips, compiled binaries run around 10% faster. On an M1 MacBook Pro, esbuild's benchmark runs approximately 8% faster than before and the binary executable is approximately 4% smaller than before.
This also fixes a regression from version 0.14.26 of esbuild where the browser builds of the
esbuild-wasm
package could fail to be bundled due to the use of built-in node libraries. The primary WebAssembly shim for Go 1.18.0 no longer uses built-in node libraries.v0.14.27
Compare Source
Avoid generating an enumerable
default
import for CommonJS files in Babel mode (#2097)Importing a CommonJS module into an ES module can be done in two different ways. In node mode the
default
import is always set tomodule.exports
, while in Babel mode thedefault
import passes through tomodule.exports.default
instead. Node mode is triggered when the importing file ends in.mjs
, hastype: "module"
in itspackage.json
file, or the imported module does not have a__esModule
marker.Previously esbuild always created the forwarding
default
import in Babel mode, even ifmodule.exports
had no property calleddefault
. This was problematic because the getter nameddefault
still showed up as a property on the imported namespace object, and could potentially interfere with code that iterated over the properties of the imported namespace object. With this release the getter nameddefault
will now only be added in Babel mode if thedefault
property exists at the time of the import.Fix a circular import edge case regarding ESM-to-CommonJS conversion (#1894, #2059)
This fixes a regression that was introduced in version 0.14.5 of esbuild. Ever since that version, esbuild now creates two separate export objects when you convert an ES module file into a CommonJS module: one for ES modules and one for CommonJS modules. The one for CommonJS modules is written to
module.exports
and exported from the file, and the one for ES modules is internal and can be accessed by bundling code that imports the entry point (for example, the entry point might import itself to be able to inspect its own exports).The reason for these two separate export objects is that CommonJS modules are supposed to see a special export called
__esModule
which indicates that the module used to be an ES module, while ES modules are not supposed to see any automatically-added export named__esModule
. This matters for real-world code both because people sometimes iterate over the properties of ES module export namespace objects and because some people write ES module code containing their own exports named__esModule
that they expect other ES module code to be able to read.However, this change to split exports into two separate objects broke ES module re-exports in the edge case where the imported module is involved in an import cycle. This happened because the CommonJS
module.exports
object was no longer mutated as exports were added. Instead it was being initialized at the end of the generated file after the import statements to other modules (which are converted intorequire()
calls). This release changesmodule.exports
initialization to happen earlier in the file and then double-writes further exports to both the ES module and CommonJS module export objects.This fix was contributed by @indutny.
v0.14.26
Compare Source
Fix a tree shaking regression regarding
var
declarations (#2080, #2085, #2098, #2099)Version 0.14.8 of esbuild enabled removal of duplicate function declarations when minification is enabled (see #610):
This transformation is safe because function declarations are "hoisted" in JavaScript, which means they are all done first before any other code is evaluted. This means the last function declaration will overwrite all previous function declarations with the same name.
However, this introduced an unintentional regression for
var
declarations in which all but the last declaration was dropped if tree-shaking was enabled. This only happens for top-levelvar
declarations that re-declare the same variable multiple times. This regression has now been fixed:This case now has test coverage.
Add support for parsing "instantiation expressions" from TypeScript 4.7 (#2038)
The upcoming version of TypeScript now lets you specify
<...>
type parameters on a JavaScript identifier without using a call expression:With this release, esbuild can now parse these new type annotations. This feature was contributed by @g-plane.
Avoid
new Function
in esbuild's library code (#2081)Some JavaScript environments such as Cloudflare Workers or Deno Deploy don't allow
new Function
because they disallow dynamic JavaScript evaluation. Previously esbuild's WebAssembly-based library used this to construct the WebAssembly worker function. With this release, the code is now inlined without usingnew Function
so it will be able to run even when this restriction is in place.Drop superfluous
__name()
calls (#2062)When the
--keep-names
option is specified, esbuild inserts calls to a__name
helper function to ensure that the.name
property on function and class objects remains consistent even if the function or class name is renamed to avoid a name collision or because name minification is enabled. With this release, esbuild will now try to omit these calls to the__name
helper function when the name of the function or class object was not renamed during the linking process after all:Notice how one of the calls to
__name
is now no longer printed. This change was contributed by @indutny.Configuration
📅 Schedule: At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by WhiteSource Renovate. View repository job log here.