1// This file was automatically generated by "compat-table.js"
2
3package compat
4
5type Engine uint8
6
7const (
8	Chrome Engine = iota
9	Edge
10	ES
11	Firefox
12	IOS
13	Node
14	Safari
15)
16
17func (e Engine) String() string {
18	switch e {
19	case Chrome:
20		return "chrome"
21	case Edge:
22		return "edge"
23	case ES:
24		return "es"
25	case Firefox:
26		return "firefox"
27	case IOS:
28		return "ios"
29	case Node:
30		return "node"
31	case Safari:
32		return "safari"
33	}
34	return ""
35}
36
37type JSFeature uint64
38
39const (
40	ArbitraryModuleNamespaceNames JSFeature = 1 << iota
41	ArraySpread
42	Arrow
43	AsyncAwait
44	AsyncGenerator
45	BigInt
46	Class
47	ClassField
48	ClassPrivateAccessor
49	ClassPrivateBrandCheck
50	ClassPrivateField
51	ClassPrivateMethod
52	ClassPrivateStaticAccessor
53	ClassPrivateStaticField
54	ClassPrivateStaticMethod
55	ClassStaticBlocks
56	ClassStaticField
57	Const
58	DefaultArgument
59	Destructuring
60	DynamicImport
61	ExponentOperator
62	ExportStarAs
63	ForAwait
64	ForOf
65	Generator
66	Hashbang
67	ImportAssertions
68	ImportMeta
69	Let
70	LogicalAssignment
71	NestedRestBinding
72	NewTarget
73	NodeColonPrefixImport
74	NodeColonPrefixRequire
75	NullishCoalescing
76	ObjectAccessors
77	ObjectExtensions
78	ObjectRestSpread
79	OptionalCatchBinding
80	OptionalChain
81	RestArgument
82	TemplateLiteral
83	TopLevelAwait
84	UnicodeEscapes
85)
86
87func (features JSFeature) Has(feature JSFeature) bool {
88	return (features & feature) != 0
89}
90
91var jsTable = map[JSFeature]map[Engine][]versionRange{
92	ArbitraryModuleNamespaceNames: {
93		Chrome:  {{start: v{90, 0, 0}}},
94		Firefox: {{start: v{87, 0, 0}}},
95		Node:    {{start: v{16, 0, 0}}},
96	},
97	ArraySpread: {
98		Chrome:  {{start: v{46, 0, 0}}},
99		Edge:    {{start: v{13, 0, 0}}},
100		ES:      {{start: v{2015, 0, 0}}},
101		Firefox: {{start: v{36, 0, 0}}},
102		IOS:     {{start: v{10, 0, 0}}},
103		Node:    {{start: v{5, 0, 0}}},
104		Safari:  {{start: v{10, 0, 0}}},
105	},
106	Arrow: {
107		Chrome:  {{start: v{49, 0, 0}}},
108		Edge:    {{start: v{13, 0, 0}}},
109		ES:      {{start: v{2015, 0, 0}}},
110		Firefox: {{start: v{45, 0, 0}}},
111		IOS:     {{start: v{10, 0, 0}}},
112		Node:    {{start: v{6, 0, 0}}},
113		Safari:  {{start: v{10, 0, 0}}},
114	},
115	AsyncAwait: {
116		Chrome:  {{start: v{55, 0, 0}}},
117		Edge:    {{start: v{15, 0, 0}}},
118		ES:      {{start: v{2017, 0, 0}}},
119		Firefox: {{start: v{52, 0, 0}}},
120		IOS:     {{start: v{11, 0, 0}}},
121		Node:    {{start: v{7, 6, 0}}},
122		Safari:  {{start: v{11, 0, 0}}},
123	},
124	AsyncGenerator: {
125		Chrome:  {{start: v{63, 0, 0}}},
126		Edge:    {{start: v{79, 0, 0}}},
127		ES:      {{start: v{2018, 0, 0}}},
128		Firefox: {{start: v{57, 0, 0}}},
129		IOS:     {{start: v{12, 0, 0}}},
130		Node:    {{start: v{10, 0, 0}}},
131		Safari:  {{start: v{12, 0, 0}}},
132	},
133	BigInt: {
134		Chrome:  {{start: v{67, 0, 0}}},
135		Edge:    {{start: v{79, 0, 0}}},
136		ES:      {{start: v{2020, 0, 0}}},
137		Firefox: {{start: v{68, 0, 0}}},
138		IOS:     {{start: v{14, 0, 0}}},
139		Node:    {{start: v{10, 4, 0}}},
140		Safari:  {{start: v{14, 0, 0}}},
141	},
142	Class: {
143		Chrome:  {{start: v{49, 0, 0}}},
144		Edge:    {{start: v{13, 0, 0}}},
145		ES:      {{start: v{2015, 0, 0}}},
146		Firefox: {{start: v{45, 0, 0}}},
147		IOS:     {{start: v{10, 0, 0}}},
148		Node:    {{start: v{6, 0, 0}}},
149		Safari:  {{start: v{10, 0, 0}}},
150	},
151	ClassField: {
152		Chrome:  {{start: v{73, 0, 0}}},
153		Edge:    {{start: v{79, 0, 0}}},
154		Firefox: {{start: v{69, 0, 0}}},
155		IOS:     {{start: v{14, 0, 0}}},
156		Node:    {{start: v{12, 0, 0}}},
157		Safari:  {{start: v{14, 0, 0}}},
158	},
159	ClassPrivateAccessor: {
160		Chrome:  {{start: v{84, 0, 0}}},
161		Edge:    {{start: v{84, 0, 0}}},
162		Firefox: {{start: v{90, 0, 0}}},
163		IOS:     {{start: v{15, 0, 0}}},
164		Node:    {{start: v{14, 6, 0}}},
165		Safari:  {{start: v{15, 0, 0}}},
166	},
167	ClassPrivateBrandCheck: {
168		Chrome:  {{start: v{91, 0, 0}}},
169		Edge:    {{start: v{91, 0, 0}}},
170		Firefox: {{start: v{90, 0, 0}}},
171		IOS:     {{start: v{15, 0, 0}}},
172		Node:    {{start: v{16, 9, 0}}},
173		Safari:  {{start: v{15, 0, 0}}},
174	},
175	ClassPrivateField: {
176		Chrome:  {{start: v{84, 0, 0}}},
177		Edge:    {{start: v{84, 0, 0}}},
178		Firefox: {{start: v{90, 0, 0}}},
179		IOS:     {{start: v{15, 0, 0}}},
180		Node:    {{start: v{14, 6, 0}}},
181		Safari:  {{start: v{14, 1, 0}}},
182	},
183	ClassPrivateMethod: {
184		Chrome:  {{start: v{84, 0, 0}}},
185		Edge:    {{start: v{84, 0, 0}}},
186		Firefox: {{start: v{90, 0, 0}}},
187		IOS:     {{start: v{15, 0, 0}}},
188		Node:    {{start: v{14, 6, 0}}},
189		Safari:  {{start: v{15, 0, 0}}},
190	},
191	ClassPrivateStaticAccessor: {
192		Chrome:  {{start: v{84, 0, 0}}},
193		Edge:    {{start: v{84, 0, 0}}},
194		Firefox: {{start: v{90, 0, 0}}},
195		IOS:     {{start: v{15, 0, 0}}},
196		Node:    {{start: v{14, 6, 0}}},
197		Safari:  {{start: v{15, 0, 0}}},
198	},
199	ClassPrivateStaticField: {
200		Chrome:  {{start: v{74, 0, 0}}},
201		Edge:    {{start: v{79, 0, 0}}},
202		Firefox: {{start: v{90, 0, 0}}},
203		IOS:     {{start: v{15, 0, 0}}},
204		Node:    {{start: v{12, 0, 0}}},
205		Safari:  {{start: v{14, 1, 0}}},
206	},
207	ClassPrivateStaticMethod: {
208		Chrome:  {{start: v{84, 0, 0}}},
209		Edge:    {{start: v{84, 0, 0}}},
210		Firefox: {{start: v{90, 0, 0}}},
211		IOS:     {{start: v{15, 0, 0}}},
212		Node:    {{start: v{14, 6, 0}}},
213		Safari:  {{start: v{15, 0, 0}}},
214	},
215	ClassStaticBlocks: {
216		Chrome: {{start: v{91, 0, 0}}},
217		Node:   {{start: v{16, 11, 0}}},
218	},
219	ClassStaticField: {
220		Chrome:  {{start: v{73, 0, 0}}},
221		Edge:    {{start: v{79, 0, 0}}},
222		Firefox: {{start: v{75, 0, 0}}},
223		IOS:     {{start: v{15, 0, 0}}},
224		Node:    {{start: v{12, 0, 0}}},
225		Safari:  {{start: v{14, 1, 0}}},
226	},
227	Const: {
228		Chrome:  {{start: v{49, 0, 0}}},
229		Edge:    {{start: v{14, 0, 0}}},
230		ES:      {{start: v{2015, 0, 0}}},
231		Firefox: {{start: v{51, 0, 0}}},
232		IOS:     {{start: v{11, 0, 0}}},
233		Node:    {{start: v{6, 0, 0}}},
234		Safari:  {{start: v{11, 0, 0}}},
235	},
236	DefaultArgument: {
237		Chrome:  {{start: v{49, 0, 0}}},
238		Edge:    {{start: v{14, 0, 0}}},
239		ES:      {{start: v{2015, 0, 0}}},
240		Firefox: {{start: v{53, 0, 0}}},
241		IOS:     {{start: v{10, 0, 0}}},
242		Node:    {{start: v{6, 0, 0}}},
243		Safari:  {{start: v{10, 0, 0}}},
244	},
245	Destructuring: {
246		Chrome:  {{start: v{51, 0, 0}}},
247		Edge:    {{start: v{18, 0, 0}}},
248		ES:      {{start: v{2015, 0, 0}}},
249		Firefox: {{start: v{53, 0, 0}}},
250		IOS:     {{start: v{10, 0, 0}}},
251		Node:    {{start: v{6, 5, 0}}},
252		Safari:  {{start: v{10, 0, 0}}},
253	},
254	DynamicImport: {
255		Chrome:  {{start: v{63, 0, 0}}},
256		Edge:    {{start: v{79, 0, 0}}},
257		ES:      {{start: v{2015, 0, 0}}},
258		Firefox: {{start: v{67, 0, 0}}},
259		IOS:     {{start: v{11, 0, 0}}},
260		Node:    {{start: v{12, 20, 0}, end: v{13, 0, 0}}, {start: v{13, 2, 0}}},
261		Safari:  {{start: v{11, 1, 0}}},
262	},
263	ExponentOperator: {
264		Chrome:  {{start: v{52, 0, 0}}},
265		Edge:    {{start: v{14, 0, 0}}},
266		ES:      {{start: v{2016, 0, 0}}},
267		Firefox: {{start: v{52, 0, 0}}},
268		IOS:     {{start: v{10, 3, 0}}},
269		Node:    {{start: v{7, 0, 0}}},
270		Safari:  {{start: v{10, 1, 0}}},
271	},
272	ExportStarAs: {
273		Chrome:  {{start: v{72, 0, 0}}},
274		Edge:    {{start: v{79, 0, 0}}},
275		ES:      {{start: v{2020, 0, 0}}},
276		Firefox: {{start: v{80, 0, 0}}},
277		Node:    {{start: v{12, 0, 0}}},
278	},
279	ForAwait: {
280		Chrome:  {{start: v{63, 0, 0}}},
281		Edge:    {{start: v{79, 0, 0}}},
282		ES:      {{start: v{2018, 0, 0}}},
283		Firefox: {{start: v{57, 0, 0}}},
284		IOS:     {{start: v{12, 0, 0}}},
285		Node:    {{start: v{10, 0, 0}}},
286		Safari:  {{start: v{12, 0, 0}}},
287	},
288	ForOf: {
289		Chrome:  {{start: v{51, 0, 0}}},
290		Edge:    {{start: v{15, 0, 0}}},
291		ES:      {{start: v{2015, 0, 0}}},
292		Firefox: {{start: v{53, 0, 0}}},
293		IOS:     {{start: v{10, 0, 0}}},
294		Node:    {{start: v{6, 5, 0}}},
295		Safari:  {{start: v{10, 0, 0}}},
296	},
297	Generator: {
298		Chrome:  {{start: v{50, 0, 0}}},
299		Edge:    {{start: v{13, 0, 0}}},
300		ES:      {{start: v{2015, 0, 0}}},
301		Firefox: {{start: v{53, 0, 0}}},
302		IOS:     {{start: v{10, 0, 0}}},
303		Node:    {{start: v{6, 0, 0}}},
304		Safari:  {{start: v{10, 0, 0}}},
305	},
306	Hashbang: {
307		Chrome:  {{start: v{74, 0, 0}}},
308		Edge:    {{start: v{79, 0, 0}}},
309		Firefox: {{start: v{67, 0, 0}}},
310		IOS:     {{start: v{13, 4, 0}}},
311		Node:    {{start: v{12, 0, 0}}},
312		Safari:  {{start: v{13, 1, 0}}},
313	},
314	ImportAssertions: {
315		Chrome: {{start: v{91, 0, 0}}},
316	},
317	ImportMeta: {
318		Chrome:  {{start: v{64, 0, 0}}},
319		Edge:    {{start: v{79, 0, 0}}},
320		ES:      {{start: v{2020, 0, 0}}},
321		Firefox: {{start: v{62, 0, 0}}},
322		IOS:     {{start: v{12, 0, 0}}},
323		Node:    {{start: v{10, 4, 0}}},
324		Safari:  {{start: v{11, 1, 0}}},
325	},
326	Let: {
327		Chrome:  {{start: v{49, 0, 0}}},
328		Edge:    {{start: v{14, 0, 0}}},
329		ES:      {{start: v{2015, 0, 0}}},
330		Firefox: {{start: v{51, 0, 0}}},
331		IOS:     {{start: v{11, 0, 0}}},
332		Node:    {{start: v{6, 0, 0}}},
333		Safari:  {{start: v{11, 0, 0}}},
334	},
335	LogicalAssignment: {
336		Chrome:  {{start: v{85, 0, 0}}},
337		Edge:    {{start: v{85, 0, 0}}},
338		ES:      {{start: v{2021, 0, 0}}},
339		Firefox: {{start: v{79, 0, 0}}},
340		IOS:     {{start: v{14, 0, 0}}},
341		Node:    {{start: v{15, 0, 0}}},
342		Safari:  {{start: v{14, 0, 0}}},
343	},
344	NestedRestBinding: {
345		Chrome:  {{start: v{49, 0, 0}}},
346		Edge:    {{start: v{14, 0, 0}}},
347		ES:      {{start: v{2016, 0, 0}}},
348		Firefox: {{start: v{47, 0, 0}}},
349		IOS:     {{start: v{10, 3, 0}}},
350		Node:    {{start: v{6, 0, 0}}},
351		Safari:  {{start: v{10, 1, 0}}},
352	},
353	NewTarget: {
354		Chrome:  {{start: v{46, 0, 0}}},
355		Edge:    {{start: v{14, 0, 0}}},
356		ES:      {{start: v{2015, 0, 0}}},
357		Firefox: {{start: v{41, 0, 0}}},
358		IOS:     {{start: v{10, 0, 0}}},
359		Node:    {{start: v{5, 0, 0}}},
360		Safari:  {{start: v{10, 0, 0}}},
361	},
362	NodeColonPrefixImport: {
363		Node: {{start: v{12, 20, 0}, end: v{13, 0, 0}}, {start: v{14, 13, 1}}},
364	},
365	NodeColonPrefixRequire: {
366		Node: {{start: v{14, 18, 0}, end: v{15, 0, 0}}, {start: v{16, 0, 0}}},
367	},
368	NullishCoalescing: {
369		Chrome:  {{start: v{80, 0, 0}}},
370		Edge:    {{start: v{80, 0, 0}}},
371		ES:      {{start: v{2020, 0, 0}}},
372		Firefox: {{start: v{72, 0, 0}}},
373		IOS:     {{start: v{13, 4, 0}}},
374		Node:    {{start: v{14, 0, 0}}},
375		Safari:  {{start: v{13, 1, 0}}},
376	},
377	ObjectAccessors: {
378		Chrome:  {{start: v{5, 0, 0}}},
379		Edge:    {{start: v{12, 0, 0}}},
380		ES:      {{start: v{5, 0, 0}}},
381		Firefox: {{start: v{2, 0, 0}}},
382		IOS:     {{start: v{6, 0, 0}}},
383		Node:    {{start: v{0, 10, 0}}},
384		Safari:  {{start: v{3, 1, 0}}},
385	},
386	ObjectExtensions: {
387		Chrome:  {{start: v{44, 0, 0}}},
388		Edge:    {{start: v{12, 0, 0}}},
389		ES:      {{start: v{2015, 0, 0}}},
390		Firefox: {{start: v{34, 0, 0}}},
391		IOS:     {{start: v{10, 0, 0}}},
392		Node:    {{start: v{4, 0, 0}}},
393		Safari:  {{start: v{10, 0, 0}}},
394	},
395	ObjectRestSpread: {
396		ES:      {{start: v{2018, 0, 0}}},
397		Firefox: {{start: v{55, 0, 0}}},
398		IOS:     {{start: v{11, 3, 0}}},
399		Safari:  {{start: v{11, 1, 0}}},
400	},
401	OptionalCatchBinding: {
402		Chrome:  {{start: v{66, 0, 0}}},
403		Edge:    {{start: v{79, 0, 0}}},
404		ES:      {{start: v{2019, 0, 0}}},
405		Firefox: {{start: v{58, 0, 0}}},
406		IOS:     {{start: v{11, 3, 0}}},
407		Node:    {{start: v{10, 0, 0}}},
408		Safari:  {{start: v{11, 1, 0}}},
409	},
410	OptionalChain: {
411		Chrome:  {{start: v{91, 0, 0}}},
412		Edge:    {{start: v{91, 0, 0}}},
413		ES:      {{start: v{2020, 0, 0}}},
414		Firefox: {{start: v{74, 0, 0}}},
415		IOS:     {{start: v{13, 4, 0}}},
416		Node:    {{start: v{16, 9, 0}}},
417		Safari:  {{start: v{13, 1, 0}}},
418	},
419	RestArgument: {
420		Chrome:  {{start: v{47, 0, 0}}},
421		Edge:    {{start: v{12, 0, 0}}},
422		ES:      {{start: v{2015, 0, 0}}},
423		Firefox: {{start: v{43, 0, 0}}},
424		IOS:     {{start: v{10, 0, 0}}},
425		Node:    {{start: v{6, 0, 0}}},
426		Safari:  {{start: v{10, 0, 0}}},
427	},
428	TemplateLiteral: {
429		Chrome:  {{start: v{41, 0, 0}}},
430		Edge:    {{start: v{13, 0, 0}}},
431		ES:      {{start: v{2015, 0, 0}}},
432		Firefox: {{start: v{34, 0, 0}}},
433		IOS:     {{start: v{9, 0, 0}}},
434		Node:    {{start: v{4, 0, 0}}},
435		Safari:  {{start: v{9, 0, 0}}},
436	},
437	TopLevelAwait: {
438		Chrome:  {{start: v{89, 0, 0}}},
439		Edge:    {{start: v{89, 0, 0}}},
440		Firefox: {{start: v{89, 0, 0}}},
441		Node:    {{start: v{14, 8, 0}}},
442		Safari:  {{start: v{15, 0, 0}}},
443	},
444	UnicodeEscapes: {
445		Chrome:  {{start: v{44, 0, 0}}},
446		Edge:    {{start: v{12, 0, 0}}},
447		ES:      {{start: v{2015, 0, 0}}},
448		Firefox: {{start: v{53, 0, 0}}},
449		IOS:     {{start: v{9, 0, 0}}},
450		Node:    {{start: v{4, 0, 0}}},
451		Safari:  {{start: v{9, 0, 0}}},
452	},
453}
454
455// Return all features that are not available in at least one environment
456func UnsupportedJSFeatures(constraints map[Engine][]int) (unsupported JSFeature) {
457	for feature, engines := range jsTable {
458		for engine, version := range constraints {
459			if versionRanges, ok := engines[engine]; !ok || !isVersionSupported(versionRanges, version) {
460				unsupported |= feature
461			}
462		}
463	}
464	return
465}
466