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