-
Add support for lowering tagged template literals to ES5 (#297)
This release adds support for lowering tagged template literals such as
String.raw`\unicode`
to target environments that don't support them such as--target=es5
(non-tagged template literals were already supported). Each literal turns into a function call to a helper function:// Original code console.log(String.raw`\unicode`) // Lowered code console.log(String.raw(__template([void 0], ["\\unicode"])));
-
Change class field behavior to match TypeScript 4.3
TypeScript 4.3 includes a subtle breaking change that wasn't mentioned in the TypeScript 4.3 blog post: class fields will now be compiled with different semantics if
"target": "ESNext"
is present intsconfig.json
. Specifically in this caseuseDefineForClassFields
will default totrue
when not specified instead offalse
. This means class field behavior in TypeScript code will now match JavaScript instead of doing something else:class Base { set foo(value) { console.log('set', value) } } class Derived extends Base { foo = 123 } new Derived()
In TypeScript 4.2 and below, the TypeScript compiler would generate code that prints
set 123
whentsconfig.json
contains"target": "ESNext"
but in TypeScript 4.3, the TypeScript compiler will now generate code that doesn't print anything. This is the difference between "assign" semantics and "define" semantics. With this release, esbuild has been changed to follow the TypeScript 4.3 behavior. -
Avoid generating the character sequence
</script>
(#1322)If the output of esbuild is inlined into a
<script>...</script>
tag inside an HTML file, the character sequence</script>
inside the JavaScript code will accidentally cause the script tag to be terminated early. There are at least four such cases where this can happen:console.log('</script>') console.log(1</script>/.exec(x).length) console.log(String.raw`</script>`) // @license </script>
With this release, esbuild will now handle all of these cases and avoid generating the problematic character sequence:
console.log('<\/script>'); console.log(1< /script>/.exec(x).length); console.log(String.raw(__template(["<\/script>"], ["<\/script>"]))); // @license <\/script>
-
Change the triple-slash reference comment for Deno (#1325)
The comment in esbuild's JavaScript API implementation for Deno that references the TypeScript type declarations has been changed from
/// <reference path="./mod.d.ts" />
to/// <reference types="./mod.d.ts" />
. This comment was copied from Deno's documentation but apparently Deno's documentation was incorrect. The comment in esbuild's Deno bundle has been changed to reflect Deno's latest documentation.