-
Attempt to fix an install script issue on Ubuntu Linux (#1711)
There have been some reports of esbuild failing to install on Ubuntu Linux for a while now. I haven't been able to reproduce this myself due to lack of reproduction instructions until today, when I learned that the issue only happens when you install node from the Snap Store instead of downloading the official version of node.
The problem appears to be that when node is installed from the Snap Store, install scripts are run with stderr not being writable? This then appears to cause a problem for esbuild's install script when it uses
execFileSync
to validate that the esbuild binary is working correctly. This throws the errorEACCES: permission denied, write
even though this particular command never writes to stderr.Node's documentation says that stderr for
execFileSync
defaults to that of the parent process. Forcing it to'pipe'
instead appears to fix the issue, although I still don't fully understand what's happening or why. I'm publishing this small change regardless to see if it fixes this install script edge case. -
Avoid a syntax error due to
--mangle-props=.
andsuper()
(#1976)This release fixes an issue where passing
--mangle-props=.
(i.e. telling esbuild to mangle every single property) caused a syntax error with code like this:class Foo {} class Bar extends Foo { constructor() { super(); } }
The problem was that
constructor
was being renamed to another method, which then made it no longer a constructor, which meant thatsuper()
was now a syntax error. I have added a workaround that avoids renaming any property namedconstructor
so that esbuild doesn't generate a syntax error here.Despite this fix, I highly recommend not using
--mangle-props=.
because your code will almost certainly be broken. You will have to manually add every single property that you don't want mangled to--reserve-props=
which is an excessive maintenance burden (e.g. reserveparse
to useJSON.parse
). Instead I recommend using a common pattern for all properties you intend to be mangled that is unlikely to appear in the APIs you use such as "ends in an underscore." This is an opt-in approach instead of an opt-out approach. It also makes it obvious when reading the code which properties will be mangled and which ones won't be.