Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.11.12->0.13.15^0.12.6->0.13.15Release Notes
evanw/esbuild
v0.13.15Compare Source
Fix
superin loweredasyncarrow functions (#1777)This release fixes an edge case that was missed when lowering
asyncarrow functions containingsuperproperty accesses for compile targets that don't supportasyncsuch as with--target=es6. The problem was that lowering transformsasyncarrow functions into generator function expressions that are then passed to an esbuild helper function called__asyncthat implements theasyncstate machine behavior. Since function expressions do not capturethisandsuperlike arrow functions do, this led to a mismatch in behavior which meant that the transform was incorrect. The fix is to introduce a helper function to forwardsuperaccess into the generator function expression body. Here's an example:Avoid merging certain CSS rules with different units (#1732)
This release no longer collapses
border-radius,margin,padding, andinsetrules when they have units with different levels of browser support. Collapsing multiple of these rules into a single rule is not equivalent if the browser supports one unit but not the other unit, since one rule would still have applied before the collapse but no longer applies after the collapse due to the whole rule being ignored. For example, Chrome 10 supports theremunit but not thevwunit, so the CSS code below should render with rounded corners in Chrome 10. However, esbuild previously merged everything into a single rule which would cause Chrome 10 to ignore the rule and not round the corners. This issue is now fixed:Notice how esbuild can still collapse rules together when they all share the same unit, even if the unit is one that doesn't have universal browser support such as the unit
Q. One subtlety is that esbuild now distinguishes between "safe" and "unsafe" units where safe units are old enough that they are guaranteed to work in any browser a user might reasonably use, such aspx. Safe units are allowed to be collapsed together even if there are multiple different units while multiple different unsafe units are not allowed to be collapsed together. Another detail is that esbuild no longer minifies zero lengths by removing the unit if the unit is unsafe (e.g.0reminto0) since that could cause a rendering difference if a previously-ignored rule is now no longer ignored due to the unit change. If you are curious, you can learn more about browser support levels for different CSS units in Mozilla's documentation about CSS length units.Avoid warning about ignored side-effect free imports for empty files (#1785)
When bundling, esbuild warns about bare imports such as
import "lodash-es"when the package has been marked as"sideEffects": falsein itspackage.jsonfile. This is because the only reason to use a bare import is because you are relying on the side effects of the import, but imports for packages marked as side-effect free are supposed to be removed. If the package indicates that it has no side effects, then this bare import is likely a bug.However, some people have packages just for TypeScript type definitions. These package can actually have a side effect as they can augment the type of the global object in TypeScript, even if they are marked with
"sideEffects": false. To avoid warning in this case, esbuild will now only issue this warning if the imported file is non-empty. If the file is empty, then it's irrelevant whether you import it or not so any import of that file does not indicate a bug. This fixes this case because.d.tsfiles typically end up being empty after esbuild parses them since they typically only contain type declarations.Attempt to fix packages broken due to the
node:prefix (#1760)Some people have started using the node-specific
node:path prefix in their packages. This prefix forces the following path to be interpreted as a node built-in module instead of a package on the file system. Sorequire("node:path")will always import node'spathmodule and never import npm'spathpackage.Adding the
node:prefix breaks that code with older node versions that don't understand thenode:prefix. This is a problem with the package, not with esbuild. The package should be adding a fallback if thenode:prefix isn't available. However, people still want to be able to use these packages with older node versions even though the code is broken. Now esbuild will automatically strip this prefix if it detects that the code will break in the configured target environment (as specified by--target=). Note that this only happens during bundling, since import paths are only examined during bundling.v0.13.14Compare Source
Fix dynamic
import()on node 12.20+ (#1772)When you use flags such as
--target=node12.20, esbuild uses that version number to see what features the target environment supports. This consults an internal table that stores which target environments are supported for each feature. For example,import(x)is changed intoPromise.resolve().then(() => require(x))if dynamicimportexpressions are unsupported.Previously esbuild's internal table only stored one version number, since features are rarely ever removed in newer versions of software. Either the target environment is before that version and the feature is unsupported, or the target environment is after that version and the feature is supported. This approach has work for all relevant features in all cases except for one: dynamic
importsupport in node. This feature is supported in node 12.20.0 up to but not including node 13.0.0, and then is also supported in node 13.2.0 up. The feature table implementation has been changed to store an array of potentially discontiguous version ranges instead of one version number.Up until now, esbuild used 13.2.0 as the lowest supported version number to avoid generating dynamic
importexpressions when targeting node versions that don't support it. But with this release, esbuild will now use the more accurate discontiguous version range in this case. This means dynamicimportexpressions can now be generated when targeting versions of node 12.20.0 up to but not including node 13.0.0.Avoid merging certain qualified rules in CSS (#1776)
A change was introduced in the previous release to merge adjacent CSS rules that have the same content:
However, that introduced a regression in cases where the browser considers one selector to be valid and the other selector to be invalid, such as in the following example:
Merging these two rules into one causes the browser to consider the entire merged rule to be invalid, which disables both rules. This is a change in behavior from the original code.
With this release, esbuild will now only merge adjacent duplicate rules together if they are known to work in all browsers (specifically, if they are known to work in IE 7 and up). Adjacent duplicate rules will no longer be merged in all other cases including modern pseudo-class selectors such as
:focus, HTML5 elements such asvideo, and combinators such asa + b.Minify syntax in the CSS
font,font-family, andfont-weightproperties (#1756)This release includes size reductions for CSS font syntax when minification is enabled:
Notice how
boldhas been changed to700and the quotes were removed around"Segoe UI"since it was safe to do so.This feature was contributed by @sapphi-red.
v0.13.13Compare Source
Add more information about skipping
"main"inpackage.json(#1754)Configuring
mainFields: []breaks most npm packages since it tells esbuild to ignore the"main"field inpackage.json, which most npm packages use to specify their entry point. This is not a bug with esbuild because esbuild is just doing what it was told to do. However, people may do this without understanding how npm packages work, and then be confused about why it doesn't work. This release now includes additional information in the error message:Fix a tree-shaking bug with
var exports(#1739)This release fixes a bug where a variable named
var exports = {}was incorrectly removed by tree-shaking (i.e. dead code elimination). Theexportsvariable is a special variable in CommonJS modules that is automatically provided by the CommonJS runtime. CommonJS modules are transformed into something like this before being run:So using
var exports = {}should have the same effect asexports = {}because the variableexportsshould already be defined. However, esbuild was incorrectly overwriting the definition of theexportsvariable with the one provided by CommonJS. This release merges the definitions together so both are included, which fixes the bug.Merge adjacent CSS selector rules with duplicate content (#1755)
With this release, esbuild will now merge adjacent selectors when minifying if they have the same content:
Shorten
top,right,bottom,leftCSS property intoinsetwhen it is supported (#1758)This release enables collapsing of
insetrelated properties:This minification rule is only enabled when
insetproperty is supported by the target environment. Make sure to set esbuild'stargetsetting correctly when minifying if the code will be running in an older environment (e.g. earlier than Chrome 87).This feature was contributed by @sapphi-red.
v0.13.12Compare Source
Implement initial support for simplifying
calc()expressions in CSS (#1607)This release includes basic simplification of
calc()expressions in CSS when minification is enabled. The approach mainly follows the official CSS specification, which means it should behave the way browsers behave: https://www.w3.org/TR/css-values-4/#calc-func. This is a basic implementation so there are probably somecalc()expressions that can be reduced by other tools but not by esbuild. This release mainly focuses on setting up the parsing infrastructure forcalc()expressions to make it straightforward to implement additional simplifications in the future. Here's an example of this new functionality:Expressions that can't be fully simplified will still be partially simplified into a reduced
calc()expression:Note that this transformation doesn't attempt to modify any expression containing a
var()CSS variable reference. These variable references can contain any number of tokens so it's not safe to move forward with a simplification assuming thatvar()is a single token. For example,calc(2px * var(--x) * 3)is not transformed intocalc(6px * var(--x))in casevar(--x)contains something like4 + 5px(calc(2px * 4 + 5px * 3)evaluates to23pxwhilecalc(6px * 4 + 5px)evaluates to29px).Fix a crash with a legal comment followed by an import (#1730)
Version 0.13.10 introduced parsing for CSS legal comments but caused a regression in the code that checks whether there are any rules that come before
@import. This is not desired because browsers ignore@importrules after other non-@importrules, so esbuild warns you when you do this. However, legal comments are modeled as rules in esbuild's internal AST even though they aren't actual CSS rules, and the code that performs this check wasn't updated. This release fixes the crash.v0.13.11Compare Source
Implement class static blocks (#1558)
This release adds support for a new upcoming JavaScript feature called class static blocks that lets you evaluate code inside of a class body. It looks like this:
This can be useful when you want to use
try/catchor access private#namefields during class initialization. Doing that without this feature is quite hacky and basically involves creating temporary static fields containing immediately-invoked functions and then deleting the fields after class initialization. Static blocks are much more ergonomic and avoid performance loss due todeletechanging the object shape.Static blocks are transformed for older browsers by moving the static block outside of the class body and into an immediately invoked arrow function after the class definition:
In case you're wondering, the additional
letvariable is to guard against the potential reassignment ofFooduring evaluation such as what happens below. The value ofthismust be bound to the original class, not to the current value ofFoo:Fix issues with
superproperty accessesCode containing
superproperty accesses may need to be transformed even when they are supported. For example, in ES6asyncmethods are unsupported whilesuperproperties are supported. Anasyncmethod containingsuperproperty accesses requires those uses ofsuperto be transformed (theasyncfunction is transformed into a nested generator function and thesuperkeyword cannot be used inside nested functions).Previously esbuild transformed
superproperty accesses into a function call that returned the corresponding property. However, this was incorrect for uses ofsuperthat write to the inherited setter since a function call is not a valid assignment target. This release fixes writing to asuperproperty:All known edge cases for assignment to a
superproperty should now be covered including destructuring assignment and using the unary assignment operators with BigInts.In addition, this release also fixes a bug where a
staticclass field containing asuperproperty access was not transformed when it was moved outside of the class body, which can happen whenstaticclass fields aren't supported.All known edge cases for
superinsidestaticclass fields should be handled including accessingsuperafter prototype reassignment of the enclosing class object.v0.13.10Compare Source
Implement legal comment preservation for CSS (#1539)
This release adds support for legal comments in CSS the same way they are already supported for JS. A legal comment is one that starts with
/*!or that contains the text@licenseor@preserve. These comments are preserved in output files by esbuild since that follows the intent of the original authors of the code. The specific behavior is controlled via--legal-comments=in the CLI andlegalCommentsin the JS API, which can be set to any of the following options:none: Do not preserve any legal commentsinline: Preserve all rule-level legal commentseof: Move all rule-level legal comments to the end of the filelinked: Move all rule-level legal comments to a.LEGAL.txtfile and link to them with a commentexternal: Move all rule-level legal comments to a.LEGAL.txtfile but to not link to themThe default behavior is
eofwhen bundling andinlineotherwise.Allow uppercase
es*targets (#1717)With this release, you can now use target names such as
ESNextinstead ofesnextas the target name in the CLI and JS API. This is important because people don't want to have to call.toLowerCase()on target strings from TypeScript'stsconfig.jsonfile before passing it to esbuild (TypeScript uses case-agnostic target names).This feature was contributed by @timse.
Update to Unicode 14.0.0
The character tables that determine which characters form valid JavaScript identifiers have been updated from Unicode version 13.0.0 to the newly release Unicode version 14.0.0. I'm not putting an example in the release notes because all of the new characters will likely just show up as little squares since fonts haven't been updated yet. But you can read https://www.unicode.org/versions/Unicode14.0.0/#Summary for more information about the changes.
v0.13.9Compare Source
Add support for
importsinpackage.json(#1691)This release adds basic support for the
importsfield inpackage.json. It behaves similarly to theexportsfield but only applies to import paths that start with#. Theimportsfield provides a way for a package to remap its own internal imports for itself, while theexportsfield provides a way for a package to remap its external exports for other packages. This is useful because theimportsfield respects the currently-configured conditions which means that the import mapping can change at run-time. For example:Now that esbuild supports this feature too, import paths starting with
#and any provided conditions will be respected when bundling:Fix using
npm rebuildwith theesbuildpackage (#1703)Version 0.13.4 accidentally introduced a regression in the install script where running
npm rebuildmultiple times could fail after the second time. The install script creates a copy of the binary executable usinglinkfollowed byrename. Usinglinkcreates a hard link which saves space on the file system, andrenameis used for safety since it atomically replaces the destination.However, the
renamesyscall has an edge case where it silently fails if the source and destination are both the same link. This meant that the install script would fail after being run twice in a row. With this release, the install script now deletes the source after callingrenamein case it has silently failed, so this issue should now be fixed. It should now be safe to usenpm rebuildwith theesbuildpackage.Fix invalid CSS minification of
border-radius(#1702)CSS minification does collapsing of
border-radiusrelated properties. For example:However, this only works for numeric tokens, not identifiers. For example:
Transforming this to
div{border-radius:inherit 1px 1px}, as was done in previous releases of esbuild, is an invalid transformation and results in incorrect CSS. This release of esbuild fixes this CSS transformation bug.v0.13.8Compare Source
Fix
superinside arrow function inside loweredasyncfunction (#1425)When an
asyncfunction is transformed into a regular function for target environments that don't supportasyncsuch as--target=es6, references tosuperinside that function must be transformed too since theasync-to-regular function transformation moves the function body into a nested function, so thesuperreferences are no longer syntactically valid. However, this transform didn't handle an edge case andsuperreferences inside of an arrow function were overlooked. This release fixes this bug:Remove the implicit
/after[dir]in entry names (#1661)The "entry names" feature lets you customize the way output file names are generated. The
[dir]and[name]placeholders are filled in with the directory name and file name of the corresponding entry point file, respectively.Previously
--entry-names=[dir]/[name]and--entry-names=[dir][name]behaved the same because the value used for[dir]always had an implicit trailing slash, since it represents a directory. However, some people want to be able to remove the file name with--entry-names=[dir]and the implicit trailing slash gets in the way.With this release, you can now use the
[dir]placeholder without an implicit trailing slash getting in the way. For example, the commandesbuild foo/bar/index.js --outbase=. --outdir=out --entry-names=[dir]previously generated the fileout/foo/bar/.jsbut will now generate the fileout/foo/bar.js.v0.13.7Compare Source
Minify CSS alpha values correctly (#1682)
When esbuild uses the
rgba()syntax for a color instead of the 8-character hex code (e.g. whentargetis set to Chrome 61 or earlier), the 0-to-255 integer alpha value must be printed as a floating-point fraction between 0 and 1. The fraction was only printed to three decimal places since that is the minimal number of decimal places required for all 256 different alpha values to be uniquely determined. However, using three decimal places does not necessarily result in the shortest result. For example,128 / 255is0.5019607843137255which is printed as".502"using three decimal places, but".5"is equivalent becauseround(0.5 * 255) == 128, so printing".5"would be better. With this release, esbuild will always use the minimal numeric representation for the alpha value:Match node's behavior for core module detection (#1680)
Node has a hard-coded list of core modules (e.g.
fs) that, when required, short-circuit the module resolution algorithm and instead return the corresponding internal core module object. When you pass--platform=nodeto esbuild, esbuild also implements this short-circuiting behavior and doesn't try to bundle these import paths. This was implemented in esbuild using the existingexternalfeature (e.g. essentially--external:fs). However, there is an edge case where esbuild'sexternalfeature behaved differently than node.Modules specified via esbuild's
externalfeature also cause all sub-paths to be excluded as well, so for example--external:fooexcludes bothfooandfoo/barfrom the bundle. However, node's core module check is only an exact equality check, so for examplefsis a core module and bypasses the module resolution algorithm butfs/foois not a core module and causes the module resolution algorithm to search the file system.This behavior can be used to load a module on the file system with the same name as one of node's core modules. For example,
require('fs/')will load the modulefsfrom the file system instead of loading node's corefsmodule. With this release, esbuild will now match node's behavior in this edge case. This means the external modules that are automatically added by--platform=nodenow behave subtly differently than--external:, which allows code that relies on this behavior to be bundled correctly.Fix WebAssembly builds on Go 1.17.2+ (#1684)
Go 1.17.2 introduces a change (specifically a fix for CVE-2021-38297) that causes Go's WebAssembly bootstrap script to throw an error when it's run in situations with many environment variables. One such situation is when the bootstrap script is run inside GitHub Actions. This change was introduced because the bootstrap script writes a copy of the environment variables into WebAssembly memory without any bounds checking, and writing more than 4096 bytes of data ends up writing past the end of the buffer and overwriting who-knows-what. So throwing an error in this situation is an improvement. However, this breaks esbuild which previously (at least seemingly) worked fine.
With this release, esbuild's WebAssembly bootstrap script that calls out to Go's WebAssembly bootstrap script will now delete all environment variables except for the ones that esbuild checks for, of which there are currently only four:
NO_COLOR,NODE_PATH,npm_config_user_agent, andWT_SESSION. This should avoid a crash when esbuild is built using Go 1.17.2+ and should reduce the likelihood of memory corruption when esbuild is built using Go 1.17.1 or earlier. This release also updates the Go version that esbuild ships with to version 1.17.2. Note that this problem only affects theesbuild-wasmpackage. Theesbuildpackage is not affected.See also:
v0.13.6Compare Source
Emit decorators for
declareclass fields (#1675)In version 3.7, TypeScript introduced the
declarekeyword for class fields that avoids generating any code for that field:However, it turns out that TypeScript still emits decorators for these omitted fields. With this release, esbuild will now do this too:
Experimental support for esbuild on NetBSD (#1624)
With this release, esbuild now has a published binary executable for NetBSD in the
esbuild-netbsd-64npm package, and esbuild's installer has been modified to attempt to use it when on NetBSD. Hopefully this makes installing esbuild via npm work on NetBSD. This change was contributed by @gdt.Disable the "esbuild was bundled" warning if
ESBUILD_BINARY_PATHis provided (#1678)The
ESBUILD_BINARY_PATHenvironment variable allows you to substitute an alternate binary executable for esbuild's JavaScript API. This is useful in certain cases such as when debugging esbuild. The JavaScript API has some code that throws an error if it detects that it was bundled before being run, since bundling prevents esbuild from being able to find the path to its binary executable. However, that error is unnecessary ifESBUILD_BINARY_PATHis present because an alternate path has been provided. This release disables the warning whenESBUILD_BINARY_PATHis present so that esbuild can be used when bundled as long as you also manually specifyESBUILD_BINARY_PATH.This change was contributed by @heypiotr.
Remove unused
catchbindings when minifying (#1660)With this release, esbuild will now remove unused
catchbindings when minifying:This takes advantage of the new optional catch binding syntax feature that was introduced in ES2019. This minification rule is only enabled when optional catch bindings are supported by the target environment. Specifically, it's not enabled when using
--target=es2018or older. Make sure to set esbuild'stargetsetting correctly when minifying if the code will be running in an older JavaScript environment.This change was contributed by @sapphi-red.
v0.13.5Compare Source
Improve watch mode accuracy (#1113)
Watch mode is enabled by
--watchand causes esbuild to become a long-running process that automatically rebuilds output files when input files are changed. It's implemented by recording all calls to esbuild's internal file system interface and then invalidating the build whenever these calls would return different values. For example, a call to esbuild's internalReadFile()function is considered to be different if either the presence of the file has changed (e.g. the file didn't exist before but now exists) or the presence of the file stayed the same but the content of the file has changed.Previously esbuild's watch mode operated at the
ReadFile()andReadDirectory()level. When esbuild checked whether a directory entry existed or not (e.g. whether a directory contains anode_modulessubdirectory or apackage.jsonfile), it calledReadDirectory()which then caused the build to depend on that directory's set of entries. This meant the build would be invalidated even if a new unrelated entry was added or removed, since that still changes the set of entries. This is problematic when using esbuild in environments that constantly create and destroy temporary directory entries in your project directory. In that case, esbuild's watch mode would constantly rebuild as the directory was constantly considered to be dirty.With this release, watch mode now operates at the
ReadFile()andReadDirectory().Get()level. So when esbuild checks whether a directory entry exists or not, the build should now only depend on the presence status for that one directory entry. This should avoid unnecessary rebuilds due to unrelated directory entries being added or removed. The log messages generated using--watchwill now also mention the specific directory entry whose presence status was changed if a build is invalidated for this reason.Note that this optimization does not apply to plugins using the
watchDirsreturn value because those paths are only specified at the directory level and do not describe individual directory entries. You can usewatchFilesorwatchDirson the individual entries inside the directory to get a similar effect instead.Disallow certain uses of
<in.mtsand.ctsfilesThe upcoming version 4.5 of TypeScript is introducing the
.mtsand.ctsextensions that turn into the.mjsand.cjsextensions when compiled. However, unlike the existing.tsand.tsxextensions, expressions that start with<are disallowed when they would be ambiguous depending on whether they are parsed in.tsor.tsxmode. The ambiguity is caused by the overlap between the syntax for JSX elements and the old deprecated syntax for type casts:.ts.tsx.mts/.cts<x>y<T>() => {}<x>y</x><T>() => {}</T><T extends>() => {}</T><T extends={0}>() => {}</T><T,>() => {}<T extends X>() => {}This release of esbuild introduces a syntax error for these ambiguous syntax constructs in
.mtsand.ctsfiles to match the new behavior of the TypeScript compiler.Do not remove empty
@keyframesrules (#1665)CSS minification in esbuild automatically removes empty CSS rules, since they have no effect. However, empty
@keyframesrules still trigger JavaScript animation events so it's incorrect to remove them. To demonstrate that empty@keyframesrules still have an effect, here is a bug report for Firefox where it was incorrectly not triggering JavaScript animation events for empty@keyframesrules: https://bugzilla.mozilla.org/show_bug.cgi?id=1004377.With this release, empty
@keyframesrules are now preserved during minification:This fix was contributed by @eelco.
Fix an incorrect duplicate label error (#1671)
When labeling a statement in JavaScript, the label must be unique within the enclosing statements since the label determines the jump target of any labeled
breakorcontinuestatement:However, an enclosing label with the same name is allowed as long as it's located in a different function body. Since
breakandcontinuestatements can't jump across function boundaries, the label is not ambiguous. This release fixes a bug where esbuild incorrectly treated this valid code as a syntax error:This fix was contributed by @nevkontakte.
v0.13.4Compare Source
Fix permission issues with the install script (#1642)
The
esbuildpackage contains a small JavaScript stub file that implements the CLI (command-line interface). Its only purpose is to spawn the binary esbuild executable as a child process and forward the command-line arguments to it.The install script contains an optimization that replaces this small JavaScript stub with the actual binary executable at install time to avoid the overhead of unnecessarily creating a new
nodeprocess. This optimization can't be done at package publish time because there is only oneesbuildpackage but there are many supported platforms, so the binary executable for the current platform must live outside of theesbuildpackage.However, the optimization was implemented with an unlink operation followed by a link operation. This means that if the first step fails, the package is left in a broken state since the JavaScript stub file is deleted but not yet replaced.
With this release, the optimization is now implemented with a link operation followed by a rename operation. This should always leave the package in a working state even if either step fails.
Add a fallback for
npm install esbuild --no-optional(#1647)The installation method for esbuild's platform-specific binary executable was recently changed in version 0.13.0. Before that version esbuild downloaded it in an install script, and after that version esbuild lets the package manager download it using the
optionalDependenciesfeature inpackage.json. This change was made because downloading the binary executable in an install script never really fully worked. The reasons are complex but basically there are a variety of edge cases where people people want to install esbuild in environments that they have customized such that downloading esbuild isn't possible. UsingoptionalDependenciesinstead lets the package manager deal with it instead, which should work fine in all cases (either that or your package manager has a bug, but that's not esbuild's problem).There is one case where this new installation method doesn't work: if you pass the
--no-optionalflag to npm to disable theoptionalDependenciesfeature. If you do this, you prevent esbuild from being installed. This is not a problem with esbuild because you are manually enabling a flag to change npm's behavior such that esbuild doesn't install correctly. However, people still want to do this.With this release, esbuild will now fall back to the old installation method if the new installation method fails. THIS MAY NOT WORK. The new
optionalDependenciesinstallation method is the only supported way to install esbuild with npm. The old downloading installation method was removed because it doesn't always work. The downloading method is only being provided to try to be helpful but it's not the supported installation method. If you pass--no-optionaland the download fails due to some environment customization you did, the recommended fix is to just remove the--no-optionalflag.Support the new
.mtsand.ctsTypeScript file extensionsThe upcoming version 4.5 of TypeScript has two new file extensions:
.mtsand.cts. Files with these extensions can be imported using the.mjsand.cjs, respectively. So the statementimport "./foo.mjs"in TypeScript can actually succeed even if the file./foo.mjsdoesn't exist on the file system as long as the file./foo.mtsdoes exist. The import path with the.mjsextension is automatically re-routed to the corresponding file with the.mtsextension at type-checking time by the TypeScript compiler. See the TypeScript 4.5 beta announcement for details.With this release, esbuild will also automatically rewrite
.mjsto.mtsand.cjsto.ctswhen resolving import paths to files on the file system. This should make it possible to bundle code written in this new style. In addition, the extensions.mtsand.ctsare now also considered valid TypeScript file extensions by default along with the.tsextension.Fix invalid CSS minification of
marginandpadding(#1657)CSS minification does collapsing of
marginandpaddingrelated properties. For example:However, while this works for the
autokeyword, it doesn't work for other keywords. For example:Transforming this to
div{margin:5px inherit inherit 5px}, as was done in previous releases of esbuild, is an invalid transformation and results in incorrect CSS. This release of esbuild fixes this CSS transformation bug.v0.13.3Compare Source
Support TypeScript type-only import/export specifiers (#1637)
This release adds support for a new TypeScript syntax feature in the upcoming version 4.5 of TypeScript. This feature lets you prefix individual imports and exports with the
typekeyword to indicate that they are types instead of values. This helps tools such as esbuild omit them from your source code, and is necessary because esbuild compiles files one-at-a-time and doesn't know at parse time which imports/exports are types and which are values. The new syntax looks like this:See microsoft/TypeScript#45998 for full details. From what I understand this is a purely ergonomic improvement since this was already previously possible using a type-only import/export statements like this:
This feature was contributed by @g-plane.
v0.13.2Compare Source
Fix
export {}statements with--tree-shaking=true(#1628)The new
--tree-shaking=trueoption allows you to force-enable tree shaking in cases where it wasn't previously possible. One such case is when bundling is disabled and there is no output format configured, in which case esbuild just preserves the format of whatever format the input code is in. Enabling tree shaking in this context caused a bug whereexport {}statements were stripped. This release fixes the bug soexport {}statements should now be preserved when you pass--tree-shaking=true. This bug only affected this new functionality and didn't affect existing scenarios.v0.13.1Compare Source
Fix
superin loweredasyncarrow functions (#1777)This release fixes an edge case that was missed when lowering
asyncarrow functions containingsuperproperty accesses for compile targets that don't supportasyncsuch as with--target=es6. The problem was that lowering transformsasyncarrow functions into generator function expressions that are then passed to an esbuild helper function called__asyncthat implements theasyncstate machine behavior. Since function expressions do not capturethisandsuperlike arrow functions do, this led to a mismatch in behavior which meant that the transform was incorrect. The fix is to introduce a helper function to forwardsuperaccess into the generator function expression body. Here's an example:Avoid merging certain CSS rules with different units (#1732)
This release no longer collapses
border-radius,margin,padding, andinsetrules when they have units with different levels of browser support. Collapsing multiple of these rules into a single rule is not equivalent if the browser supports one unit but not the other unit, since one rule would still have applied before the collapse but no longer applies after the collapse due to the whole rule being ignored. For example, Chrome 10 supports theremunit but not thevwunit, so the CSS code below should render with rounded corners in Chrome 10. However, esbuild previously merged everything into a single rule which would cause Chrome 10 to ignore the rule and not round the corners. This issue is now fixed:Notice how esbuild can still collapse rules together when they all share the same unit, even if the unit is one that doesn't have universal browser support such as the unit
Q. One subtlety is that esbuild now distinguishes between "safe" and "unsafe" units where safe units are old enough that they are guaranteed to work in any browser a user might reasonably use, such aspx. Safe units are allowed to be collapsed together even if there are multiple different units while multiple different unsafe units are not allowed to be collapsed together. Another detail is that esbuild no longer minifies zero lengths by removing the unit if the unit is unsafe (e.g.0reminto0) since that could cause a rendering difference if a previously-ignored rule is now no longer ignored due to the unit change. If you are curious, you can learn more about browser support levels for different CSS units in Mozilla's documentation about CSS length units.Avoid warning about ignored side-effect free imports for empty files (#1785)
When bundling, esbuild warns about bare imports such as
import "lodash-es"when the package has been marked as"sideEffects": falsein itspackage.jsonfile. This is because the only reason to use a bare import is because you are relying on the side effects of the import, but imports for packages marked as side-effect free are supposed to be removed. If the package indicates that it has no side effects, then this bare import is likely a bug.However, some people have packages just for TypeScript type definitions. These package can actually have a side effect as they can augment the type of the global object in TypeScript, even if they are marked with
"sideEffects": false. To avoid warning in this case, esbuild will now only issue this warning if the imported file is non-empty. If the file is empty, then it's irrelevant whether you import it or not so any import of that file does not indicate a bug. This fixes this case because.d.tsfiles typically end up being empty after esbuild parses them since they typically only contain type declarations.Attempt to fix packages broken due to the
node:prefix (#1760)Some people have started using the node-specific
node:path prefix in their packages. This prefix forces the following path to be interpreted as a node built-in module instead of a package on the file system. Sorequire("node:path")will always import node'spathmodule and never import npm'spathpackage.Adding the
node:prefix breaks that code with older node versions that don't understand thenode:prefix. This is a problem with the package, not with esbuild. The package should be adding a fallback if thenode:prefix isn't available. However, people still want to be able to use these packages with older node versions even though the code is broken. Now esbuild will automatically strip this prefix if it detects that the code will break in the configured target environment (as specified by--target=). Note that this only happens during bundling, since import paths are only examined during bundling.v0.13.0Compare Source
This release contains backwards-incompatible changes. Since esbuild is before version 1.0.0, these changes have been released as a new minor version to reflect this (as recommended by npm). You should either be pinning the exact version of
esbuildin yourpackage.jsonfile or be using a version range syntax that only accepts patch upgrades such as~0.12.0. See the documentation about semver for more information.Configuration
📅 Schedule: At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR has been generated by Renovate Bot.