v0.18.2
-
Lower static blocks when static fields are lowered (#2800, #2950, #3025)
This release fixes a bug where esbuild incorrectly did not lower static class blocks when static class fields needed to be lowered. For example, the following code should print
1 2 3
but previously printed2 1 3
instead due to this bug:// Original code class Foo { static x = console.log(1) static { console.log(2) } static y = console.log(3) } // Old output (with --supported:class-static-field=false) class Foo { static { console.log(2); } } __publicField(Foo, "x", console.log(1)); __publicField(Foo, "y", console.log(3)); // New output (with --supported:class-static-field=false) class Foo { } __publicField(Foo, "x", console.log(1)); console.log(2); __publicField(Foo, "y", console.log(3));
-
Use static blocks to implement
--keep-names
on classes (#2389)This change fixes a bug where the
name
property could previously be incorrect within a class static context when using--keep-names
. The problem was that thename
property was being initialized after static blocks were run instead of before. This has been fixed by moving thename
property initializer into a static block at the top of the class body:// Original code if (typeof Foo === 'undefined') { let Foo = class { static test = this.name } console.log(Foo.test) } // Old output (with --keep-names) if (typeof Foo === "undefined") { let Foo2 = /* @__PURE__ */ __name(class { static test = this.name; }, "Foo"); console.log(Foo2.test); } // New output (with --keep-names) if (typeof Foo === "undefined") { let Foo2 = class { static { __name(this, "Foo"); } static test = this.name; }; console.log(Foo2.test); }
This change was somewhat involved, especially regarding what esbuild considers to be side-effect free. Some unused classes that weren't removed by tree shaking in previous versions of esbuild may now be tree-shaken. One example is classes with static private fields that are transformed by esbuild into code that doesn't use JavaScript's private field syntax. Previously esbuild's tree shaking analysis ran on the class after syntax lowering, but with this release it will run on the class before syntax lowering, meaning it should no longer be confused by class mutations resulting from automatically-generated syntax lowering code.