github.com/evanw/esbuild@v0.21.4/internal/compat/js_table.go (about) 1 // This file was automatically generated by "js_table.ts" 2 3 package compat 4 5 type Engine uint8 6 7 const ( 8 Chrome Engine = iota 9 Deno 10 Edge 11 ES 12 Firefox 13 Hermes 14 IE 15 IOS 16 Node 17 Opera 18 Rhino 19 Safari 20 ) 21 22 func (e Engine) String() string { 23 switch e { 24 case Chrome: 25 return "chrome" 26 case Deno: 27 return "deno" 28 case Edge: 29 return "edge" 30 case ES: 31 return "es" 32 case Firefox: 33 return "firefox" 34 case Hermes: 35 return "hermes" 36 case IE: 37 return "ie" 38 case IOS: 39 return "ios" 40 case Node: 41 return "node" 42 case Opera: 43 return "opera" 44 case Rhino: 45 return "rhino" 46 case Safari: 47 return "safari" 48 } 49 return "" 50 } 51 52 func (e Engine) IsBrowser() bool { 53 switch e { 54 case Chrome, Edge, Firefox, IE, IOS, Opera, Safari: 55 return true 56 } 57 return false 58 } 59 60 type JSFeature uint64 61 62 const ( 63 ArbitraryModuleNamespaceNames JSFeature = 1 << iota 64 ArraySpread 65 Arrow 66 AsyncAwait 67 AsyncGenerator 68 Bigint 69 Class 70 ClassField 71 ClassPrivateAccessor 72 ClassPrivateBrandCheck 73 ClassPrivateField 74 ClassPrivateMethod 75 ClassPrivateStaticAccessor 76 ClassPrivateStaticField 77 ClassPrivateStaticMethod 78 ClassStaticBlocks 79 ClassStaticField 80 ConstAndLet 81 Decorators 82 DefaultArgument 83 Destructuring 84 DynamicImport 85 ExponentOperator 86 ExportStarAs 87 ForAwait 88 ForOf 89 FunctionNameConfigurable 90 FunctionOrClassPropertyAccess 91 Generator 92 Hashbang 93 ImportAssertions 94 ImportAttributes 95 ImportMeta 96 InlineScript 97 LogicalAssignment 98 NestedRestBinding 99 NewTarget 100 NodeColonPrefixImport 101 NodeColonPrefixRequire 102 NullishCoalescing 103 ObjectAccessors 104 ObjectExtensions 105 ObjectRestSpread 106 OptionalCatchBinding 107 OptionalChain 108 RegexpDotAllFlag 109 RegexpLookbehindAssertions 110 RegexpMatchIndices 111 RegexpNamedCaptureGroups 112 RegexpSetNotation 113 RegexpStickyAndUnicodeFlags 114 RegexpUnicodePropertyEscapes 115 RestArgument 116 TemplateLiteral 117 TopLevelAwait 118 TypeofExoticObjectIsObject 119 UnicodeEscapes 120 Using 121 ) 122 123 var StringToJSFeature = map[string]JSFeature{ 124 "arbitrary-module-namespace-names": ArbitraryModuleNamespaceNames, 125 "array-spread": ArraySpread, 126 "arrow": Arrow, 127 "async-await": AsyncAwait, 128 "async-generator": AsyncGenerator, 129 "bigint": Bigint, 130 "class": Class, 131 "class-field": ClassField, 132 "class-private-accessor": ClassPrivateAccessor, 133 "class-private-brand-check": ClassPrivateBrandCheck, 134 "class-private-field": ClassPrivateField, 135 "class-private-method": ClassPrivateMethod, 136 "class-private-static-accessor": ClassPrivateStaticAccessor, 137 "class-private-static-field": ClassPrivateStaticField, 138 "class-private-static-method": ClassPrivateStaticMethod, 139 "class-static-blocks": ClassStaticBlocks, 140 "class-static-field": ClassStaticField, 141 "const-and-let": ConstAndLet, 142 "decorators": Decorators, 143 "default-argument": DefaultArgument, 144 "destructuring": Destructuring, 145 "dynamic-import": DynamicImport, 146 "exponent-operator": ExponentOperator, 147 "export-star-as": ExportStarAs, 148 "for-await": ForAwait, 149 "for-of": ForOf, 150 "function-name-configurable": FunctionNameConfigurable, 151 "function-or-class-property-access": FunctionOrClassPropertyAccess, 152 "generator": Generator, 153 "hashbang": Hashbang, 154 "import-assertions": ImportAssertions, 155 "import-attributes": ImportAttributes, 156 "import-meta": ImportMeta, 157 "inline-script": InlineScript, 158 "logical-assignment": LogicalAssignment, 159 "nested-rest-binding": NestedRestBinding, 160 "new-target": NewTarget, 161 "node-colon-prefix-import": NodeColonPrefixImport, 162 "node-colon-prefix-require": NodeColonPrefixRequire, 163 "nullish-coalescing": NullishCoalescing, 164 "object-accessors": ObjectAccessors, 165 "object-extensions": ObjectExtensions, 166 "object-rest-spread": ObjectRestSpread, 167 "optional-catch-binding": OptionalCatchBinding, 168 "optional-chain": OptionalChain, 169 "regexp-dot-all-flag": RegexpDotAllFlag, 170 "regexp-lookbehind-assertions": RegexpLookbehindAssertions, 171 "regexp-match-indices": RegexpMatchIndices, 172 "regexp-named-capture-groups": RegexpNamedCaptureGroups, 173 "regexp-set-notation": RegexpSetNotation, 174 "regexp-sticky-and-unicode-flags": RegexpStickyAndUnicodeFlags, 175 "regexp-unicode-property-escapes": RegexpUnicodePropertyEscapes, 176 "rest-argument": RestArgument, 177 "template-literal": TemplateLiteral, 178 "top-level-await": TopLevelAwait, 179 "typeof-exotic-object-is-object": TypeofExoticObjectIsObject, 180 "unicode-escapes": UnicodeEscapes, 181 "using": Using, 182 } 183 184 func (features JSFeature) Has(feature JSFeature) bool { 185 return (features & feature) != 0 186 } 187 188 func (features JSFeature) ApplyOverrides(overrides JSFeature, mask JSFeature) JSFeature { 189 return (features & ^mask) | (overrides & mask) 190 } 191 192 var jsTable = map[JSFeature]map[Engine][]versionRange{ 193 ArbitraryModuleNamespaceNames: { 194 Chrome: {{start: v{90, 0, 0}}}, 195 ES: {{start: v{2022, 0, 0}}}, 196 Firefox: {{start: v{87, 0, 0}}}, 197 IOS: {{start: v{14, 5, 0}}}, 198 Node: {{start: v{16, 0, 0}}}, 199 Safari: {{start: v{14, 1, 0}}}, 200 }, 201 ArraySpread: { 202 // Note: The latest version of "IE" failed 15 tests including: spread syntax for iterable objects: spreading non-iterables is a runtime error 203 // Note: The latest version of "Rhino" failed 15 tests including: spread syntax for iterable objects: spreading non-iterables is a runtime error 204 Chrome: {{start: v{46, 0, 0}}}, 205 Deno: {{start: v{1, 0, 0}}}, 206 Edge: {{start: v{13, 0, 0}}}, 207 ES: {{start: v{2015, 0, 0}}}, 208 Firefox: {{start: v{36, 0, 0}}}, 209 Hermes: {{start: v{0, 7, 0}}}, 210 IOS: {{start: v{10, 0, 0}}}, 211 Node: {{start: v{5, 0, 0}}}, 212 Opera: {{start: v{33, 0, 0}}}, 213 Safari: {{start: v{10, 0, 0}}}, 214 }, 215 Arrow: { 216 // Note: The latest version of "Hermes" failed 3 tests including: arrow functions: lexical "super" binding in constructors 217 // Note: The latest version of "IE" failed 13 tests including: arrow functions: "this" unchanged by call or apply 218 // Note: The latest version of "Rhino" failed 3 tests including: arrow functions: lexical "new.target" binding 219 Chrome: {{start: v{49, 0, 0}}}, 220 Deno: {{start: v{1, 0, 0}}}, 221 Edge: {{start: v{13, 0, 0}}}, 222 ES: {{start: v{2015, 0, 0}}}, 223 Firefox: {{start: v{45, 0, 0}}}, 224 IOS: {{start: v{10, 0, 0}}}, 225 Node: {{start: v{6, 0, 0}}}, 226 Opera: {{start: v{36, 0, 0}}}, 227 Safari: {{start: v{10, 0, 0}}}, 228 }, 229 AsyncAwait: { 230 // Note: The latest version of "Hermes" failed 4 tests including: async functions: async arrow functions 231 // Note: The latest version of "IE" failed 16 tests including: async functions: async arrow functions 232 // Note: The latest version of "Rhino" failed 16 tests including: async functions: async arrow functions 233 Chrome: {{start: v{55, 0, 0}}}, 234 Deno: {{start: v{1, 0, 0}}}, 235 Edge: {{start: v{15, 0, 0}}}, 236 ES: {{start: v{2017, 0, 0}}}, 237 Firefox: {{start: v{52, 0, 0}}}, 238 IOS: {{start: v{11, 0, 0}}}, 239 Node: {{start: v{7, 6, 0}}}, 240 Opera: {{start: v{42, 0, 0}}}, 241 Safari: {{start: v{11, 0, 0}}}, 242 }, 243 AsyncGenerator: { 244 // Note: The latest version of "Hermes" failed this test: Asynchronous Iterators: async generators 245 // Note: The latest version of "IE" failed this test: Asynchronous Iterators: async generators 246 // Note: The latest version of "Rhino" failed this test: Asynchronous Iterators: async generators 247 Chrome: {{start: v{63, 0, 0}}}, 248 Deno: {{start: v{1, 0, 0}}}, 249 Edge: {{start: v{79, 0, 0}}}, 250 ES: {{start: v{2018, 0, 0}}}, 251 Firefox: {{start: v{57, 0, 0}}}, 252 IOS: {{start: v{12, 0, 0}}}, 253 Node: {{start: v{10, 0, 0}}}, 254 Opera: {{start: v{50, 0, 0}}}, 255 Safari: {{start: v{12, 0, 0}}}, 256 }, 257 Bigint: { 258 // Note: The latest version of "IE" failed this test: BigInt: basic functionality 259 Chrome: {{start: v{67, 0, 0}}}, 260 Deno: {{start: v{1, 0, 0}}}, 261 Edge: {{start: v{79, 0, 0}}}, 262 ES: {{start: v{2020, 0, 0}}}, 263 Firefox: {{start: v{68, 0, 0}}}, 264 Hermes: {{start: v{0, 12, 0}}}, 265 IOS: {{start: v{14, 0, 0}}}, 266 Node: {{start: v{10, 4, 0}}}, 267 Opera: {{start: v{54, 0, 0}}}, 268 Rhino: {{start: v{1, 7, 14}}}, 269 Safari: {{start: v{14, 0, 0}}}, 270 }, 271 Class: { 272 // Note: The latest version of "Hermes" failed 24 tests including: class: accessor properties 273 // Note: The latest version of "IE" failed 24 tests including: class: accessor properties 274 // Note: The latest version of "Rhino" failed 24 tests including: class: accessor properties 275 Chrome: {{start: v{49, 0, 0}}}, 276 Deno: {{start: v{1, 0, 0}}}, 277 Edge: {{start: v{13, 0, 0}}}, 278 ES: {{start: v{2015, 0, 0}}}, 279 Firefox: {{start: v{45, 0, 0}}}, 280 IOS: {{start: v{10, 0, 0}}}, 281 Node: {{start: v{6, 0, 0}}}, 282 Opera: {{start: v{36, 0, 0}}}, 283 Safari: {{start: v{10, 0, 0}}}, 284 }, 285 ClassField: { 286 // Note: The latest version of "Hermes" failed 2 tests including: instance class fields: computed instance class fields 287 // Note: The latest version of "IE" failed 2 tests including: instance class fields: computed instance class fields 288 // Note: The latest version of "Rhino" failed 2 tests including: instance class fields: computed instance class fields 289 Chrome: {{start: v{73, 0, 0}}}, 290 Deno: {{start: v{1, 0, 0}}}, 291 Edge: {{start: v{79, 0, 0}}}, 292 ES: {{start: v{2022, 0, 0}}}, 293 Firefox: {{start: v{69, 0, 0}}}, 294 IOS: {{start: v{14, 0, 0}}}, 295 Node: {{start: v{12, 0, 0}}}, 296 Opera: {{start: v{60, 0, 0}}}, 297 Safari: {{start: v{14, 0, 0}}}, 298 }, 299 ClassPrivateAccessor: { 300 // Note: The latest version of "Hermes" failed this test: private class methods: private accessor properties 301 // Note: The latest version of "IE" failed this test: private class methods: private accessor properties 302 // Note: The latest version of "Rhino" failed this test: private class methods: private accessor properties 303 Chrome: {{start: v{84, 0, 0}}}, 304 Deno: {{start: v{1, 0, 0}}}, 305 Edge: {{start: v{84, 0, 0}}}, 306 ES: {{start: v{2022, 0, 0}}}, 307 Firefox: {{start: v{90, 0, 0}}}, 308 IOS: {{start: v{15, 0, 0}}}, 309 Node: {{start: v{14, 6, 0}}}, 310 Opera: {{start: v{70, 0, 0}}}, 311 Safari: {{start: v{15, 0, 0}}}, 312 }, 313 ClassPrivateBrandCheck: { 314 // Note: The latest version of "Hermes" failed this test: Ergonomic brand checks for private fields 315 // Note: The latest version of "IE" failed this test: Ergonomic brand checks for private fields 316 // Note: The latest version of "Rhino" failed this test: Ergonomic brand checks for private fields 317 Chrome: {{start: v{91, 0, 0}}}, 318 Deno: {{start: v{1, 9, 0}}}, 319 Edge: {{start: v{91, 0, 0}}}, 320 ES: {{start: v{2022, 0, 0}}}, 321 Firefox: {{start: v{90, 0, 0}}}, 322 IOS: {{start: v{15, 0, 0}}}, 323 Node: {{start: v{16, 4, 0}}}, 324 Opera: {{start: v{77, 0, 0}}}, 325 Safari: {{start: v{15, 0, 0}}}, 326 }, 327 ClassPrivateField: { 328 // Note: The latest version of "Hermes" failed 4 tests including: instance class fields: optional deep private instance class fields access 329 // Note: The latest version of "IE" failed 4 tests including: instance class fields: optional deep private instance class fields access 330 // Note: The latest version of "Rhino" failed 4 tests including: instance class fields: optional deep private instance class fields access 331 Chrome: {{start: v{84, 0, 0}}}, 332 Deno: {{start: v{1, 0, 0}}}, 333 Edge: {{start: v{84, 0, 0}}}, 334 ES: {{start: v{2022, 0, 0}}}, 335 Firefox: {{start: v{90, 0, 0}}}, 336 IOS: {{start: v{14, 5, 0}}}, 337 Node: {{start: v{14, 6, 0}}}, 338 Opera: {{start: v{70, 0, 0}}}, 339 Safari: {{start: v{14, 1, 0}}}, 340 }, 341 ClassPrivateMethod: { 342 // Note: The latest version of "Hermes" failed this test: private class methods: private instance methods 343 // Note: The latest version of "IE" failed this test: private class methods: private instance methods 344 // Note: The latest version of "Rhino" failed this test: private class methods: private instance methods 345 Chrome: {{start: v{84, 0, 0}}}, 346 Deno: {{start: v{1, 0, 0}}}, 347 Edge: {{start: v{84, 0, 0}}}, 348 ES: {{start: v{2022, 0, 0}}}, 349 Firefox: {{start: v{90, 0, 0}}}, 350 IOS: {{start: v{15, 0, 0}}}, 351 Node: {{start: v{14, 6, 0}}}, 352 Opera: {{start: v{70, 0, 0}}}, 353 Safari: {{start: v{15, 0, 0}}}, 354 }, 355 ClassPrivateStaticAccessor: { 356 // Note: The latest version of "Hermes" failed this test: private class methods: private static accessor properties 357 // Note: The latest version of "IE" failed this test: private class methods: private static accessor properties 358 // Note: The latest version of "Rhino" failed this test: private class methods: private static accessor properties 359 Chrome: {{start: v{84, 0, 0}}}, 360 Deno: {{start: v{1, 0, 0}}}, 361 Edge: {{start: v{84, 0, 0}}}, 362 ES: {{start: v{2022, 0, 0}}}, 363 Firefox: {{start: v{90, 0, 0}}}, 364 IOS: {{start: v{15, 0, 0}}}, 365 Node: {{start: v{14, 6, 0}}}, 366 Opera: {{start: v{70, 0, 0}}}, 367 Safari: {{start: v{15, 0, 0}}}, 368 }, 369 ClassPrivateStaticField: { 370 // Note: The latest version of "Hermes" failed this test: static class fields: private static class fields 371 // Note: The latest version of "IE" failed this test: static class fields: private static class fields 372 // Note: The latest version of "Rhino" failed this test: static class fields: private static class fields 373 Chrome: {{start: v{74, 0, 0}}}, 374 Deno: {{start: v{1, 0, 0}}}, 375 Edge: {{start: v{79, 0, 0}}}, 376 ES: {{start: v{2022, 0, 0}}}, 377 Firefox: {{start: v{90, 0, 0}}}, 378 IOS: {{start: v{14, 5, 0}}}, 379 Node: {{start: v{12, 0, 0}}}, 380 Opera: {{start: v{62, 0, 0}}}, 381 Safari: {{start: v{14, 1, 0}}}, 382 }, 383 ClassPrivateStaticMethod: { 384 // Note: The latest version of "Hermes" failed this test: private class methods: private static methods 385 // Note: The latest version of "IE" failed this test: private class methods: private static methods 386 // Note: The latest version of "Rhino" failed this test: private class methods: private static methods 387 Chrome: {{start: v{84, 0, 0}}}, 388 Deno: {{start: v{1, 0, 0}}}, 389 Edge: {{start: v{84, 0, 0}}}, 390 ES: {{start: v{2022, 0, 0}}}, 391 Firefox: {{start: v{90, 0, 0}}}, 392 IOS: {{start: v{15, 0, 0}}}, 393 Node: {{start: v{14, 6, 0}}}, 394 Opera: {{start: v{70, 0, 0}}}, 395 Safari: {{start: v{15, 0, 0}}}, 396 }, 397 ClassStaticBlocks: { 398 Chrome: {{start: v{91, 0, 0}}}, 399 Deno: {{start: v{1, 14, 0}}}, 400 Edge: {{start: v{94, 0, 0}}}, 401 ES: {{start: v{2022, 0, 0}}}, 402 Firefox: {{start: v{93, 0, 0}}}, 403 IOS: {{start: v{16, 4, 0}}}, 404 Node: {{start: v{16, 11, 0}}}, 405 Opera: {{start: v{80, 0, 0}}}, 406 Safari: {{start: v{16, 4, 0}}}, 407 }, 408 ClassStaticField: { 409 // Note: The latest version of "Hermes" failed 2 tests including: static class fields: computed static class fields 410 // Note: The latest version of "IE" failed 2 tests including: static class fields: computed static class fields 411 // Note: The latest version of "Rhino" failed 2 tests including: static class fields: computed static class fields 412 Chrome: {{start: v{73, 0, 0}}}, 413 Deno: {{start: v{1, 0, 0}}}, 414 Edge: {{start: v{79, 0, 0}}}, 415 ES: {{start: v{2022, 0, 0}}}, 416 Firefox: {{start: v{75, 0, 0}}}, 417 IOS: {{start: v{14, 5, 0}}}, 418 Node: {{start: v{12, 0, 0}}}, 419 Opera: {{start: v{60, 0, 0}}}, 420 Safari: {{start: v{14, 1, 0}}}, 421 }, 422 ConstAndLet: { 423 // Note: The latest version of "Hermes" failed 20 tests including: const: for loop statement scope 424 // Note: The latest version of "IE" failed 6 tests including: const: for-in loop iteration scope 425 // Note: The latest version of "Rhino" failed 22 tests including: const: cannot be in statements 426 Chrome: {{start: v{49, 0, 0}}}, 427 Deno: {{start: v{1, 0, 0}}}, 428 Edge: {{start: v{14, 0, 0}}}, 429 ES: {{start: v{2015, 0, 0}}}, 430 Firefox: {{start: v{51, 0, 0}}}, 431 IOS: {{start: v{11, 0, 0}}}, 432 Node: {{start: v{6, 0, 0}}}, 433 Opera: {{start: v{36, 0, 0}}}, 434 Safari: {{start: v{11, 0, 0}}}, 435 }, 436 Decorators: {}, 437 DefaultArgument: { 438 // Note: The latest version of "Hermes" failed 2 tests including: default function parameters: separate scope 439 // Note: The latest version of "IE" failed 7 tests including: default function parameters: arguments object interaction 440 // Note: The latest version of "Rhino" failed 7 tests including: default function parameters: arguments object interaction 441 Chrome: {{start: v{49, 0, 0}}}, 442 Deno: {{start: v{1, 0, 0}}}, 443 Edge: {{start: v{14, 0, 0}}}, 444 ES: {{start: v{2015, 0, 0}}}, 445 Firefox: {{start: v{53, 0, 0}}}, 446 IOS: {{start: v{10, 0, 0}}}, 447 Node: {{start: v{6, 0, 0}}}, 448 Opera: {{start: v{36, 0, 0}}}, 449 Safari: {{start: v{10, 0, 0}}}, 450 }, 451 Destructuring: { 452 // Note: The latest version of "Hermes" failed 3 tests including: destructuring, declarations: defaults, let temporal dead zone 453 // Note: The latest version of "IE" failed 71 tests including: destructuring, assignment: chained iterable destructuring 454 // Note: The latest version of "Rhino" failed 33 tests including: destructuring, assignment: computed properties 455 Chrome: {{start: v{51, 0, 0}}}, 456 Deno: {{start: v{1, 0, 0}}}, 457 Edge: {{start: v{18, 0, 0}}}, 458 ES: {{start: v{2015, 0, 0}}}, 459 Firefox: {{start: v{53, 0, 0}}}, 460 IOS: {{start: v{10, 0, 0}}}, 461 Node: {{start: v{6, 5, 0}}}, 462 Opera: {{start: v{38, 0, 0}}}, 463 Safari: {{start: v{10, 0, 0}}}, 464 }, 465 DynamicImport: { 466 Chrome: {{start: v{63, 0, 0}}}, 467 Edge: {{start: v{79, 0, 0}}}, 468 ES: {{start: v{2015, 0, 0}}}, 469 Firefox: {{start: v{67, 0, 0}}}, 470 IOS: {{start: v{11, 0, 0}}}, 471 Node: {{start: v{12, 20, 0}, end: v{13, 0, 0}}, {start: v{13, 2, 0}}}, 472 Opera: {{start: v{50, 0, 0}}}, 473 Safari: {{start: v{11, 1, 0}}}, 474 }, 475 ExponentOperator: { 476 // Note: The latest version of "IE" failed 3 tests including: exponentiation (**) operator: assignment 477 Chrome: {{start: v{52, 0, 0}}}, 478 Deno: {{start: v{1, 0, 0}}}, 479 Edge: {{start: v{14, 0, 0}}}, 480 ES: {{start: v{2016, 0, 0}}}, 481 Firefox: {{start: v{52, 0, 0}}}, 482 Hermes: {{start: v{0, 7, 0}}}, 483 IOS: {{start: v{10, 3, 0}}}, 484 Node: {{start: v{7, 0, 0}}}, 485 Opera: {{start: v{39, 0, 0}}}, 486 Rhino: {{start: v{1, 7, 14}}}, 487 Safari: {{start: v{10, 1, 0}}}, 488 }, 489 ExportStarAs: { 490 Chrome: {{start: v{72, 0, 0}}}, 491 Deno: {{start: v{1, 0, 0}}}, 492 Edge: {{start: v{79, 0, 0}}}, 493 ES: {{start: v{2020, 0, 0}}}, 494 Firefox: {{start: v{80, 0, 0}}}, 495 IOS: {{start: v{14, 5, 0}}}, 496 Node: {{start: v{13, 2, 0}}}, 497 Opera: {{start: v{60, 0, 0}}}, 498 Safari: {{start: v{14, 1, 0}}}, 499 }, 500 ForAwait: { 501 // Note: The latest version of "Hermes" failed this test: Asynchronous Iterators: for-await-of loops 502 // Note: The latest version of "IE" failed this test: Asynchronous Iterators: for-await-of loops 503 // Note: The latest version of "Rhino" failed this test: Asynchronous Iterators: for-await-of loops 504 Chrome: {{start: v{63, 0, 0}}}, 505 Deno: {{start: v{1, 0, 0}}}, 506 Edge: {{start: v{79, 0, 0}}}, 507 ES: {{start: v{2018, 0, 0}}}, 508 Firefox: {{start: v{57, 0, 0}}}, 509 IOS: {{start: v{12, 0, 0}}}, 510 Node: {{start: v{10, 0, 0}}}, 511 Opera: {{start: v{50, 0, 0}}}, 512 Safari: {{start: v{12, 0, 0}}}, 513 }, 514 ForOf: { 515 // Note: The latest version of "IE" failed 9 tests including: for..of loops: iterator closing, break 516 // Note: The latest version of "Rhino" failed 4 tests including: for..of loops: iterator closing, break 517 Chrome: {{start: v{51, 0, 0}}}, 518 Deno: {{start: v{1, 0, 0}}}, 519 Edge: {{start: v{15, 0, 0}}}, 520 ES: {{start: v{2015, 0, 0}}}, 521 Firefox: {{start: v{53, 0, 0}}}, 522 Hermes: {{start: v{0, 7, 0}}}, 523 IOS: {{start: v{10, 0, 0}}}, 524 Node: {{start: v{6, 5, 0}}}, 525 Opera: {{start: v{38, 0, 0}}}, 526 Safari: {{start: v{10, 0, 0}}}, 527 }, 528 FunctionNameConfigurable: { 529 // Note: The latest version of "IE" failed this test: function "name" property: isn't writable, is configurable 530 // Note: The latest version of "Rhino" failed this test: function "name" property: isn't writable, is configurable 531 Chrome: {{start: v{43, 0, 0}}}, 532 Deno: {{start: v{1, 0, 0}}}, 533 Edge: {{start: v{12, 0, 0}}}, 534 ES: {{start: v{2015, 0, 0}}}, 535 Firefox: {{start: v{38, 0, 0}}}, 536 Hermes: {{start: v{0, 7, 0}}}, 537 IOS: {{start: v{10, 0, 0}}}, 538 Node: {{start: v{4, 0, 0}}}, 539 Opera: {{start: v{30, 0, 0}}}, 540 Safari: {{start: v{10, 0, 0}}}, 541 }, 542 FunctionOrClassPropertyAccess: { 543 Chrome: {{start: v{0, 0, 0}}}, 544 Deno: {{start: v{0, 0, 0}}}, 545 Edge: {{start: v{0, 0, 0}}}, 546 ES: {{start: v{0, 0, 0}}}, 547 Firefox: {{start: v{0, 0, 0}}}, 548 Hermes: {{start: v{0, 0, 0}}}, 549 IE: {{start: v{0, 0, 0}}}, 550 IOS: {{start: v{0, 0, 0}}}, 551 Node: {{start: v{0, 0, 0}}}, 552 Opera: {{start: v{0, 0, 0}}}, 553 Rhino: {{start: v{0, 0, 0}}}, 554 Safari: {{start: v{16, 3, 0}}}, 555 }, 556 Generator: { 557 // Note: The latest version of "Hermes" failed 3 tests including: generators: computed shorthand generators, classes 558 // Note: The latest version of "IE" failed 27 tests including: generators: %GeneratorPrototype% 559 // Note: The latest version of "Rhino" failed 15 tests including: generators: %GeneratorPrototype% 560 Chrome: {{start: v{50, 0, 0}}}, 561 Deno: {{start: v{1, 0, 0}}}, 562 Edge: {{start: v{13, 0, 0}}}, 563 ES: {{start: v{2015, 0, 0}}}, 564 Firefox: {{start: v{53, 0, 0}}}, 565 IOS: {{start: v{10, 0, 0}}}, 566 Node: {{start: v{6, 0, 0}}}, 567 Opera: {{start: v{37, 0, 0}}}, 568 Safari: {{start: v{10, 0, 0}}}, 569 }, 570 Hashbang: { 571 // Note: The latest version of "IE" failed this test: Hashbang Grammar 572 // Note: The latest version of "Rhino" failed this test: Hashbang Grammar 573 Chrome: {{start: v{74, 0, 0}}}, 574 Deno: {{start: v{1, 0, 0}}}, 575 Edge: {{start: v{79, 0, 0}}}, 576 Firefox: {{start: v{67, 0, 0}}}, 577 Hermes: {{start: v{0, 7, 0}}}, 578 IOS: {{start: v{13, 4, 0}}}, 579 Node: {{start: v{12, 5, 0}}}, 580 Opera: {{start: v{62, 0, 0}}}, 581 Safari: {{start: v{13, 1, 0}}}, 582 }, 583 ImportAssertions: { 584 Chrome: {{start: v{91, 0, 0}}}, 585 Deno: {{start: v{1, 17, 0}}}, 586 Edge: {{start: v{91, 0, 0}}}, 587 Node: {{start: v{16, 14, 0}, end: v{22, 0, 0}}}, 588 }, 589 ImportAttributes: { 590 Chrome: {{start: v{123, 0, 0}}}, 591 Deno: {{start: v{1, 37, 0}}}, 592 Edge: {{start: v{123, 0, 0}}}, 593 IOS: {{start: v{17, 2, 0}}}, 594 Node: {{start: v{18, 20, 0}, end: v{19, 0, 0}}, {start: v{20, 10, 0}}}, 595 Opera: {{start: v{109, 0, 0}}}, 596 Safari: {{start: v{17, 2, 0}}}, 597 }, 598 ImportMeta: { 599 Chrome: {{start: v{64, 0, 0}}}, 600 Deno: {{start: v{1, 0, 0}}}, 601 Edge: {{start: v{79, 0, 0}}}, 602 ES: {{start: v{2020, 0, 0}}}, 603 Firefox: {{start: v{62, 0, 0}}}, 604 IOS: {{start: v{12, 0, 0}}}, 605 Node: {{start: v{10, 4, 0}}}, 606 Opera: {{start: v{51, 0, 0}}}, 607 Safari: {{start: v{11, 1, 0}}}, 608 }, 609 InlineScript: {}, 610 LogicalAssignment: { 611 // Note: The latest version of "IE" failed 9 tests including: Logical Assignment: &&= basic support 612 // Note: The latest version of "Rhino" failed 9 tests including: Logical Assignment: &&= basic support 613 Chrome: {{start: v{85, 0, 0}}}, 614 Deno: {{start: v{1, 2, 0}}}, 615 Edge: {{start: v{85, 0, 0}}}, 616 ES: {{start: v{2021, 0, 0}}}, 617 Firefox: {{start: v{79, 0, 0}}}, 618 Hermes: {{start: v{0, 7, 0}}}, 619 IOS: {{start: v{14, 0, 0}}}, 620 Node: {{start: v{15, 0, 0}}}, 621 Opera: {{start: v{71, 0, 0}}}, 622 Safari: {{start: v{14, 0, 0}}}, 623 }, 624 NestedRestBinding: { 625 // Note: The latest version of "IE" failed 2 tests including: nested rest destructuring, declarations 626 // Note: The latest version of "Rhino" failed 2 tests including: nested rest destructuring, declarations 627 Chrome: {{start: v{49, 0, 0}}}, 628 Deno: {{start: v{1, 0, 0}}}, 629 Edge: {{start: v{14, 0, 0}}}, 630 ES: {{start: v{2016, 0, 0}}}, 631 Firefox: {{start: v{47, 0, 0}}}, 632 Hermes: {{start: v{0, 7, 0}}}, 633 IOS: {{start: v{10, 3, 0}}}, 634 Node: {{start: v{6, 0, 0}}}, 635 Opera: {{start: v{36, 0, 0}}}, 636 Safari: {{start: v{10, 1, 0}}}, 637 }, 638 NewTarget: { 639 // Note: The latest version of "IE" failed 2 tests including: new.target: assignment is an early error 640 // Note: The latest version of "Rhino" failed 2 tests including: new.target: assignment is an early error 641 Chrome: {{start: v{46, 0, 0}}}, 642 Deno: {{start: v{1, 0, 0}}}, 643 Edge: {{start: v{14, 0, 0}}}, 644 ES: {{start: v{2015, 0, 0}}}, 645 Firefox: {{start: v{41, 0, 0}}}, 646 Hermes: {{start: v{0, 7, 0}}}, 647 IOS: {{start: v{10, 0, 0}}}, 648 Node: {{start: v{5, 0, 0}}}, 649 Opera: {{start: v{33, 0, 0}}}, 650 Safari: {{start: v{10, 0, 0}}}, 651 }, 652 NodeColonPrefixImport: { 653 Node: {{start: v{12, 20, 0}, end: v{13, 0, 0}}, {start: v{14, 13, 1}}}, 654 }, 655 NodeColonPrefixRequire: { 656 Node: {{start: v{14, 18, 0}, end: v{15, 0, 0}}, {start: v{16, 0, 0}}}, 657 }, 658 NullishCoalescing: { 659 // Note: The latest version of "IE" failed this test: nullish coalescing operator (??) 660 // Note: The latest version of "Rhino" failed this test: nullish coalescing operator (??) 661 Chrome: {{start: v{80, 0, 0}}}, 662 Deno: {{start: v{1, 0, 0}}}, 663 Edge: {{start: v{80, 0, 0}}}, 664 ES: {{start: v{2020, 0, 0}}}, 665 Firefox: {{start: v{72, 0, 0}}}, 666 Hermes: {{start: v{0, 7, 0}}}, 667 IOS: {{start: v{13, 4, 0}}}, 668 Node: {{start: v{14, 0, 0}}}, 669 Opera: {{start: v{67, 0, 0}}}, 670 Safari: {{start: v{13, 1, 0}}}, 671 }, 672 ObjectAccessors: { 673 Chrome: {{start: v{5, 0, 0}}}, 674 Deno: {{start: v{1, 0, 0}}}, 675 Edge: {{start: v{12, 0, 0}}}, 676 ES: {{start: v{5, 0, 0}}}, 677 Firefox: {{start: v{2, 0, 0}}}, 678 Hermes: {{start: v{0, 7, 0}}}, 679 IE: {{start: v{9, 0, 0}}}, 680 IOS: {{start: v{6, 0, 0}}}, 681 Node: {{start: v{0, 4, 0}}}, 682 Opera: {{start: v{10, 10, 0}}}, 683 Rhino: {{start: v{1, 7, 13}}}, 684 Safari: {{start: v{3, 1, 0}}}, 685 }, 686 ObjectExtensions: { 687 // Note: The latest version of "IE" failed 6 tests including: object literal extensions: computed accessors 688 // Note: The latest version of "Rhino" failed 3 tests including: object literal extensions: computed accessors 689 Chrome: {{start: v{44, 0, 0}}}, 690 Deno: {{start: v{1, 0, 0}}}, 691 Edge: {{start: v{12, 0, 0}}}, 692 ES: {{start: v{2015, 0, 0}}}, 693 Firefox: {{start: v{34, 0, 0}}}, 694 Hermes: {{start: v{0, 7, 0}}}, 695 IOS: {{start: v{10, 0, 0}}}, 696 Node: {{start: v{4, 0, 0}}}, 697 Opera: {{start: v{31, 0, 0}}}, 698 Safari: {{start: v{10, 0, 0}}}, 699 }, 700 ObjectRestSpread: { 701 // Note: The latest version of "IE" failed 2 tests including: object rest/spread properties: object rest properties 702 // Note: The latest version of "Rhino" failed 2 tests including: object rest/spread properties: object rest properties 703 Chrome: {{start: v{60, 0, 0}}}, 704 Deno: {{start: v{1, 0, 0}}}, 705 Edge: {{start: v{79, 0, 0}}}, 706 ES: {{start: v{2018, 0, 0}}}, 707 Firefox: {{start: v{55, 0, 0}}}, 708 Hermes: {{start: v{0, 7, 0}}}, 709 IOS: {{start: v{11, 3, 0}}}, 710 Node: {{start: v{8, 3, 0}}}, 711 Opera: {{start: v{47, 0, 0}}}, 712 Safari: {{start: v{11, 1, 0}}}, 713 }, 714 OptionalCatchBinding: { 715 // Note: The latest version of "IE" failed 3 tests including: optional catch binding: await 716 // Note: The latest version of "Rhino" failed 3 tests including: optional catch binding: await 717 Chrome: {{start: v{66, 0, 0}}}, 718 Deno: {{start: v{1, 0, 0}}}, 719 Edge: {{start: v{79, 0, 0}}}, 720 ES: {{start: v{2019, 0, 0}}}, 721 Firefox: {{start: v{58, 0, 0}}}, 722 Hermes: {{start: v{0, 12, 0}}}, 723 IOS: {{start: v{11, 3, 0}}}, 724 Node: {{start: v{10, 0, 0}}}, 725 Opera: {{start: v{53, 0, 0}}}, 726 Safari: {{start: v{11, 1, 0}}}, 727 }, 728 OptionalChain: { 729 // Note: The latest version of "IE" failed 5 tests including: optional chaining operator (?.): optional bracket access 730 // Note: The latest version of "Rhino" failed 5 tests including: optional chaining operator (?.): optional bracket access 731 Chrome: {{start: v{91, 0, 0}}}, 732 Deno: {{start: v{1, 9, 0}}}, 733 Edge: {{start: v{91, 0, 0}}}, 734 ES: {{start: v{2020, 0, 0}}}, 735 Firefox: {{start: v{74, 0, 0}}}, 736 Hermes: {{start: v{0, 12, 0}}}, 737 IOS: {{start: v{13, 4, 0}}}, 738 Node: {{start: v{16, 1, 0}}}, 739 Opera: {{start: v{77, 0, 0}}}, 740 Safari: {{start: v{13, 1, 0}}}, 741 }, 742 RegexpDotAllFlag: { 743 // Note: The latest version of "IE" failed this test: s (dotAll) flag for regular expressions 744 // Note: The latest version of "Rhino" failed this test: s (dotAll) flag for regular expressions 745 Chrome: {{start: v{62, 0, 0}}}, 746 Deno: {{start: v{1, 0, 0}}}, 747 Edge: {{start: v{79, 0, 0}}}, 748 ES: {{start: v{2018, 0, 0}}}, 749 Firefox: {{start: v{78, 0, 0}}}, 750 Hermes: {{start: v{0, 7, 0}}}, 751 IOS: {{start: v{11, 3, 0}}}, 752 Node: {{start: v{8, 10, 0}}}, 753 Opera: {{start: v{49, 0, 0}}}, 754 Safari: {{start: v{11, 1, 0}}}, 755 }, 756 RegexpLookbehindAssertions: { 757 // Note: The latest version of "IE" failed this test: RegExp Lookbehind Assertions 758 // Note: The latest version of "Rhino" failed this test: RegExp Lookbehind Assertions 759 Chrome: {{start: v{62, 0, 0}}}, 760 Deno: {{start: v{1, 0, 0}}}, 761 Edge: {{start: v{79, 0, 0}}}, 762 ES: {{start: v{2018, 0, 0}}}, 763 Firefox: {{start: v{78, 0, 0}}}, 764 Hermes: {{start: v{0, 7, 0}}}, 765 IOS: {{start: v{16, 4, 0}}}, 766 Node: {{start: v{8, 10, 0}}}, 767 Opera: {{start: v{49, 0, 0}}}, 768 Safari: {{start: v{16, 4, 0}}}, 769 }, 770 RegexpMatchIndices: { 771 Chrome: {{start: v{90, 0, 0}}}, 772 Deno: {{start: v{1, 8, 0}}}, 773 Edge: {{start: v{90, 0, 0}}}, 774 ES: {{start: v{2022, 0, 0}}}, 775 Firefox: {{start: v{88, 0, 0}}}, 776 IOS: {{start: v{15, 0, 0}}}, 777 Node: {{start: v{16, 0, 0}}}, 778 Opera: {{start: v{76, 0, 0}}}, 779 Safari: {{start: v{15, 0, 0}}}, 780 }, 781 RegexpNamedCaptureGroups: { 782 // Note: The latest version of "Hermes" failed this test: RegExp named capture groups 783 // Note: The latest version of "IE" failed this test: RegExp named capture groups 784 // Note: The latest version of "Rhino" failed this test: RegExp named capture groups 785 Chrome: {{start: v{64, 0, 0}}}, 786 Deno: {{start: v{1, 0, 0}}}, 787 Edge: {{start: v{79, 0, 0}}}, 788 ES: {{start: v{2018, 0, 0}}}, 789 Firefox: {{start: v{78, 0, 0}}}, 790 IOS: {{start: v{11, 3, 0}}}, 791 Node: {{start: v{10, 0, 0}}}, 792 Opera: {{start: v{51, 0, 0}}}, 793 Safari: {{start: v{11, 1, 0}}}, 794 }, 795 RegexpSetNotation: {}, 796 RegexpStickyAndUnicodeFlags: { 797 // Note: The latest version of "IE" failed 6 tests including: RegExp "y" and "u" flags: "u" flag 798 // Note: The latest version of "Rhino" failed 6 tests including: RegExp "y" and "u" flags: "u" flag 799 Chrome: {{start: v{50, 0, 0}}}, 800 Deno: {{start: v{1, 0, 0}}}, 801 Edge: {{start: v{13, 0, 0}}}, 802 ES: {{start: v{2015, 0, 0}}}, 803 Firefox: {{start: v{46, 0, 0}}}, 804 Hermes: {{start: v{0, 7, 0}}}, 805 IOS: {{start: v{12, 0, 0}}}, 806 Node: {{start: v{6, 0, 0}}}, 807 Opera: {{start: v{37, 0, 0}}}, 808 Safari: {{start: v{12, 0, 0}}}, 809 }, 810 RegexpUnicodePropertyEscapes: { 811 // Note: The latest version of "Chrome" failed this test: RegExp Unicode Property Escapes: Unicode 15.1 812 // Note: The latest version of "Firefox" failed this test: RegExp Unicode Property Escapes: Unicode 15.1 813 // Note: The latest version of "Hermes" failed 8 tests including: RegExp Unicode Property Escapes: Unicode 11 814 // Note: The latest version of "IE" failed 8 tests including: RegExp Unicode Property Escapes: Unicode 11 815 // Note: The latest version of "IOS" failed this test: RegExp Unicode Property Escapes: Unicode 15.1 816 // Note: The latest version of "Rhino" failed 8 tests including: RegExp Unicode Property Escapes: Unicode 11 817 // Note: The latest version of "Safari" failed this test: RegExp Unicode Property Escapes: Unicode 15.1 818 ES: {{start: v{2018, 0, 0}}}, 819 Node: {{start: v{18, 20, 0}, end: v{19, 0, 0}}, {start: v{20, 12, 0}, end: v{21, 0, 0}}, {start: v{21, 3, 0}}}, 820 }, 821 RestArgument: { 822 // Note: The latest version of "Hermes" failed this test: rest parameters: function 'length' property 823 // Note: The latest version of "IE" failed 5 tests including: rest parameters: arguments object interaction 824 // Note: The latest version of "Rhino" failed 5 tests including: rest parameters: arguments object interaction 825 Chrome: {{start: v{47, 0, 0}}}, 826 Deno: {{start: v{1, 0, 0}}}, 827 Edge: {{start: v{12, 0, 0}}}, 828 ES: {{start: v{2015, 0, 0}}}, 829 Firefox: {{start: v{43, 0, 0}}}, 830 IOS: {{start: v{10, 0, 0}}}, 831 Node: {{start: v{6, 0, 0}}}, 832 Opera: {{start: v{34, 0, 0}}}, 833 Safari: {{start: v{10, 0, 0}}}, 834 }, 835 TemplateLiteral: { 836 // Note: The latest version of "Hermes" failed this test: template literals: TemplateStrings call site caching 837 // Note: The latest version of "IE" failed 7 tests including: template literals: TemplateStrings call site caching 838 // Note: The latest version of "Rhino" failed 2 tests including: template literals: basic functionality 839 Chrome: {{start: v{41, 0, 0}}}, 840 Deno: {{start: v{1, 0, 0}}}, 841 Edge: {{start: v{13, 0, 0}}}, 842 ES: {{start: v{2015, 0, 0}}}, 843 Firefox: {{start: v{34, 0, 0}}}, 844 IOS: {{start: v{13, 0, 0}}}, 845 Node: {{start: v{10, 0, 0}}}, 846 Opera: {{start: v{28, 0, 0}}}, 847 Safari: {{start: v{13, 0, 0}}}, 848 }, 849 TopLevelAwait: { 850 Chrome: {{start: v{89, 0, 0}}}, 851 Deno: {{start: v{1, 0, 0}}}, 852 Edge: {{start: v{89, 0, 0}}}, 853 ES: {{start: v{2022, 0, 0}}}, 854 Firefox: {{start: v{89, 0, 0}}}, 855 IOS: {{start: v{15, 0, 0}}}, 856 Node: {{start: v{14, 8, 0}}}, 857 Opera: {{start: v{75, 0, 0}}}, 858 Safari: {{start: v{15, 0, 0}}}, 859 }, 860 TypeofExoticObjectIsObject: { 861 Chrome: {{start: v{0, 0, 0}}}, 862 Deno: {{start: v{0, 0, 0}}}, 863 Edge: {{start: v{0, 0, 0}}}, 864 ES: {{start: v{2020, 0, 0}}}, 865 Firefox: {{start: v{0, 0, 0}}}, 866 Hermes: {{start: v{0, 0, 0}}}, 867 IOS: {{start: v{0, 0, 0}}}, 868 Node: {{start: v{0, 0, 0}}}, 869 Opera: {{start: v{0, 0, 0}}}, 870 Rhino: {{start: v{0, 0, 0}}}, 871 Safari: {{start: v{0, 0, 0}}}, 872 }, 873 UnicodeEscapes: { 874 // Note: The latest version of "IE" failed 2 tests including: Unicode code point escapes: in identifiers 875 // Note: The latest version of "Rhino" failed 4 tests including: Unicode code point escapes: in identifiers 876 Chrome: {{start: v{44, 0, 0}}}, 877 Deno: {{start: v{1, 0, 0}}}, 878 Edge: {{start: v{12, 0, 0}}}, 879 ES: {{start: v{2015, 0, 0}}}, 880 Firefox: {{start: v{53, 0, 0}}}, 881 Hermes: {{start: v{0, 7, 0}}}, 882 IOS: {{start: v{9, 0, 0}}}, 883 Node: {{start: v{4, 0, 0}}}, 884 Opera: {{start: v{31, 0, 0}}}, 885 Safari: {{start: v{9, 0, 0}}}, 886 }, 887 Using: {}, 888 } 889 890 // Return all features that are not available in at least one environment 891 func UnsupportedJSFeatures(constraints map[Engine]Semver) (unsupported JSFeature) { 892 for feature, engines := range jsTable { 893 if feature == InlineScript { 894 continue // This is purely user-specified 895 } 896 for engine, version := range constraints { 897 if versionRanges, ok := engines[engine]; !ok || !isVersionSupported(versionRanges, version) { 898 unsupported |= feature 899 } 900 } 901 } 902 return 903 }