Skip to content

Commit 7835274

Browse files
committed
add an "es2022" target (#2012)
1 parent d40ff59 commit 7835274

File tree

7 files changed

+42
-3
lines changed

7 files changed

+42
-3
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
## Unreleased
44

5+
* Allow `es2022` as a target environment ([#2012](https://github.com/evanw/esbuild/issues/2012))
6+
7+
TypeScript recently [added support for `es2022`](https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/#target-es2022) as a compilation target so esbuild now supports this too. Support for this is preliminary as there is no published ES2022 specification yet (i.e. https://tc39.es/ecma262/2021/ exists but https://tc39.es/ecma262/2022/ is a 404 error). The meaning of esbuild's `es2022` target may change in the future when the specification is finalized. Right now I have made the `es2022` target enable support for the syntax-related [finished proposals](https://github.com/tc39/proposals/blob/main/finished-proposals.md) that are marked as `2022`:
8+
9+
* Class fields
10+
* Class private members
11+
* Class static blocks
12+
* Ergonomic class private member checks
13+
* Top-level await
14+
15+
I have also included the "arbitrary module namespace names" feature since I'm guessing it will end up in the ES2022 specification (this syntax feature was added to the specification without a proposal). TypeScript has [not added support for this yet](https://github.com/microsoft/TypeScript/issues/40594).
16+
517
* Match `define` to strings in index expressions ([#2050](https://github.com/evanw/esbuild/issues/2050))
618

719
With this release, configuring `--define:foo.bar=baz` now matches and replaces both `foo.bar` and `foo['bar']` expressions in the original source code. This is necessary for people who have enabled TypeScript's [`noPropertyAccessFromIndexSignature` feature](https://www.typescriptlang.org/tsconfig#noPropertyAccessFromIndexSignature), which prevents you from using normal property access syntax on a type with an index signature such as in the following code:

internal/compat/js_table.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ func (features JSFeature) Has(feature JSFeature) bool {
9898
var jsTable = map[JSFeature]map[Engine][]versionRange{
9999
ArbitraryModuleNamespaceNames: {
100100
Chrome: {{start: v{90, 0, 0}}},
101+
ES: {{start: v{2022, 0, 0}}},
101102
Firefox: {{start: v{87, 0, 0}}},
102103
Node: {{start: v{16, 0, 0}}},
103104
},
@@ -164,6 +165,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
164165
ClassField: {
165166
Chrome: {{start: v{73, 0, 0}}},
166167
Edge: {{start: v{79, 0, 0}}},
168+
ES: {{start: v{2022, 0, 0}}},
167169
Firefox: {{start: v{69, 0, 0}}},
168170
IOS: {{start: v{14, 0, 0}}},
169171
Node: {{start: v{12, 0, 0}}},
@@ -173,6 +175,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
173175
ClassPrivateAccessor: {
174176
Chrome: {{start: v{84, 0, 0}}},
175177
Edge: {{start: v{84, 0, 0}}},
178+
ES: {{start: v{2022, 0, 0}}},
176179
Firefox: {{start: v{90, 0, 0}}},
177180
IOS: {{start: v{15, 0, 0}}},
178181
Node: {{start: v{14, 6, 0}}},
@@ -182,6 +185,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
182185
ClassPrivateBrandCheck: {
183186
Chrome: {{start: v{91, 0, 0}}},
184187
Edge: {{start: v{91, 0, 0}}},
188+
ES: {{start: v{2022, 0, 0}}},
185189
Firefox: {{start: v{90, 0, 0}}},
186190
IOS: {{start: v{15, 0, 0}}},
187191
Node: {{start: v{16, 9, 0}}},
@@ -191,6 +195,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
191195
ClassPrivateField: {
192196
Chrome: {{start: v{84, 0, 0}}},
193197
Edge: {{start: v{84, 0, 0}}},
198+
ES: {{start: v{2022, 0, 0}}},
194199
Firefox: {{start: v{90, 0, 0}}},
195200
IOS: {{start: v{15, 0, 0}}},
196201
Node: {{start: v{14, 6, 0}}},
@@ -200,6 +205,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
200205
ClassPrivateMethod: {
201206
Chrome: {{start: v{84, 0, 0}}},
202207
Edge: {{start: v{84, 0, 0}}},
208+
ES: {{start: v{2022, 0, 0}}},
203209
Firefox: {{start: v{90, 0, 0}}},
204210
IOS: {{start: v{15, 0, 0}}},
205211
Node: {{start: v{14, 6, 0}}},
@@ -209,6 +215,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
209215
ClassPrivateStaticAccessor: {
210216
Chrome: {{start: v{84, 0, 0}}},
211217
Edge: {{start: v{84, 0, 0}}},
218+
ES: {{start: v{2022, 0, 0}}},
212219
Firefox: {{start: v{90, 0, 0}}},
213220
IOS: {{start: v{15, 0, 0}}},
214221
Node: {{start: v{14, 6, 0}}},
@@ -218,6 +225,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
218225
ClassPrivateStaticField: {
219226
Chrome: {{start: v{74, 0, 0}}},
220227
Edge: {{start: v{79, 0, 0}}},
228+
ES: {{start: v{2022, 0, 0}}},
221229
Firefox: {{start: v{90, 0, 0}}},
222230
IOS: {{start: v{15, 0, 0}}},
223231
Node: {{start: v{12, 0, 0}}},
@@ -227,6 +235,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
227235
ClassPrivateStaticMethod: {
228236
Chrome: {{start: v{84, 0, 0}}},
229237
Edge: {{start: v{84, 0, 0}}},
238+
ES: {{start: v{2022, 0, 0}}},
230239
Firefox: {{start: v{90, 0, 0}}},
231240
IOS: {{start: v{15, 0, 0}}},
232241
Node: {{start: v{14, 6, 0}}},
@@ -235,11 +244,13 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
235244
},
236245
ClassStaticBlocks: {
237246
Chrome: {{start: v{91, 0, 0}}},
247+
ES: {{start: v{2022, 0, 0}}},
238248
Node: {{start: v{16, 11, 0}}},
239249
},
240250
ClassStaticField: {
241251
Chrome: {{start: v{73, 0, 0}}},
242252
Edge: {{start: v{79, 0, 0}}},
253+
ES: {{start: v{2022, 0, 0}}},
243254
Firefox: {{start: v{75, 0, 0}}},
244255
IOS: {{start: v{15, 0, 0}}},
245256
Node: {{start: v{12, 0, 0}}},
@@ -483,6 +494,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
483494
TopLevelAwait: {
484495
Chrome: {{start: v{89, 0, 0}}},
485496
Edge: {{start: v{89, 0, 0}}},
497+
ES: {{start: v{2022, 0, 0}}},
486498
Firefox: {{start: v{89, 0, 0}}},
487499
Node: {{start: v{14, 8, 0}}},
488500
Safari: {{start: v{15, 0, 0}}},

internal/resolver/tsconfig_json.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ func ParseTSConfigJSON(
139139
constraints[compat.ES] = []int{2020}
140140
case "es2021":
141141
constraints[compat.ES] = []int{2021}
142+
case "es2022":
143+
constraints[compat.ES] = []int{2022}
142144
case "esnext":
143145
// Nothing to do in this case
144146
default:

pkg/api/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ const (
125125
ES2019
126126
ES2020
127127
ES2021
128+
ES2022
128129
)
129130

130131
type Loader uint8

pkg/api/api_impl.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@ func validateFeatures(log logger.Log, target Target, engines []Engine) (config.T
307307
constraints[compat.ES] = []int{2020}
308308
case ES2021:
309309
constraints[compat.ES] = []int{2021}
310+
case ES2022:
311+
constraints[compat.ES] = []int{2022}
310312
case ESNext:
311313
targetFromAPI = config.TargetWasConfiguredIncludingESNext
312314
case DefaultTarget:

pkg/cli/cli_impl.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,7 @@ func parseTargets(targets []string, arg string) (target api.Target, engines []ap
855855
"es2019": api.ES2019,
856856
"es2020": api.ES2020,
857857
"es2021": api.ES2021,
858+
"es2022": api.ES2022,
858859
}
859860

860861
validEngines := map[string]api.EngineName{

scripts/compat-table.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,19 @@ mergeVersions('NullishCoalescing', { es2020: true })
157157
mergeVersions('OptionalChain', { es2020: true })
158158
mergeVersions('TypeofExoticObjectIsObject', { es2020: true }) // https://github.com/tc39/ecma262/pull/1441
159159
mergeVersions('LogicalAssignment', { es2021: true })
160-
mergeVersions('TopLevelAwait', {})
161-
mergeVersions('ArbitraryModuleNamespaceNames', {})
160+
mergeVersions('ClassField', { es2022: true })
161+
mergeVersions('ClassPrivateAccessor', { es2022: true })
162+
mergeVersions('ClassPrivateBrandCheck', { es2022: true })
163+
mergeVersions('ClassPrivateField', { es2022: true })
164+
mergeVersions('ClassPrivateMethod', { es2022: true })
165+
mergeVersions('ClassPrivateStaticAccessor', { es2022: true })
166+
mergeVersions('ClassPrivateStaticField', { es2022: true })
167+
mergeVersions('ClassPrivateStaticMethod', { es2022: true })
168+
mergeVersions('ClassStaticBlocks', { es2022: true })
169+
mergeVersions('ClassStaticField', { es2022: true })
170+
mergeVersions('TopLevelAwait', { es2022: true })
171+
mergeVersions('ArbitraryModuleNamespaceNames', { es2022: true })
162172
mergeVersions('ImportAssertions', {})
163-
mergeVersions('ClassStaticBlocks', {})
164173

165174
// Manually copied from https://caniuse.com/?search=export%20*%20as
166175
mergeVersions('ExportStarAs', {

0 commit comments

Comments
 (0)