|
/** |
|
* @fileoverview Report the ECMAScript version(s) supported by the JavaScript |
|
* engine running this script. Intended for use with ancient or obscure runtimes. |
|
* |
|
* NOTE: This file's `.jsx` extension is needed to be runnable in Adobe Illustrator |
|
* (and presumably other Adobe products that support so-called "ExtendScript" files). |
|
* It has nothing to do with Babel or its overhyped implementation of E4X. |
|
*/ |
|
|
|
/*@cc_on @if (@_jscript_version > 1 && @_jscript_version <= 11) @*/ |
|
if("function" !== typeof alert && ( |
|
"function" === typeof print || |
|
"object" === typeof console && null !== console && "function" === typeof console.log |
|
)){ |
|
function alert(value){ |
|
if("object" === typeof console) |
|
console.log(value); |
|
else |
|
print(value); |
|
} |
|
} |
|
/*@end @*/ |
|
|
|
function exec(js){ |
|
try{ return eval(js); } |
|
catch(error){} |
|
} |
|
|
|
// Supposedly, ES3 engines can also be detected with `"function" === typeof /a/`. |
|
var supportsES3 = (function(){ |
|
var failures = 0; |
|
var badWords = [ |
|
"abstract", |
|
"boolean", |
|
"byte", |
|
"char", |
|
"double", |
|
"final", |
|
"float", |
|
"goto", |
|
"int", |
|
"long", |
|
"native", |
|
"short", |
|
"synchronized", |
|
"throws", |
|
"transient", |
|
"volatile", |
|
"redHerring" |
|
]; |
|
for(var i = 0; i < badWords.length; ++i){ |
|
try{ eval("var " + badWords[i] + " = true;"); } |
|
catch(error){ ++failures; } |
|
} |
|
return failures === badWords.length - 1; |
|
})(); |
|
var supportsES4 = false; // TODO: Find some way to run this script as ActionScript 3, lol |
|
var supportsES5 = exec("1 === ({ if: 1 }).if;"); |
|
var supportsES6 = "function" === typeof (exec("let Foo = () => {}; Foo")); |
|
var supportsES2016 = 16 === exec("4 ** 2"); |
|
var supportsES2017 = ("function" === typeof Promise) && exec("(async function(){ await Promise.resolve(true); })()") instanceof Promise; |
|
var supportsES2018 = exec("var X = {b: 2, c: 3}; var O = {a: 1, ...X}; O !== X && 6 === (O.a + O.b + O.c);"); |
|
var supportsES2019 = exec("(function(){ try { throw new Error(); } catch { return true; } return false; })()"); |
|
var supportsES2020 = 16 === exec("Number(null ?? 16n)"); |
|
var supportsES2021 = exec("let a = 1; let i = 1; a ||= ++i; a === 1 && i === 1"); |
|
var supportsES2022 = exec("class A{#x; static check(obj){ return #x in obj; }}; A.check(new A) && !A.check({});"); |
|
var supportsES2023 = exec("(function(){ try{ return !eval('#!/usr/bin/env osascript -l JavaScript'); } catch(error){ return false; }})()"); |
|
|
|
alert( |
|
"Engine is limited to..." |
|
+ "\n- ES3: " + !!supportsES3 |
|
+ "\n- ES4: " + !!supportsES4 |
|
+ "\n\nEngine supports..." |
|
+ "\n- ES5: " + !!supportsES5 |
|
+ "\n- ES6: " + !!supportsES6 |
|
+ "\n- ES2016: " + !!supportsES2016 |
|
+ "\n- ES2017: " + !!supportsES2017 |
|
+ "\n- ES2018: " + !!supportsES2018 |
|
+ "\n- ES2019: " + !!supportsES2019 |
|
+ "\n- ES2020: " + !!supportsES2020 |
|
+ "\n- ES2021: " + !!supportsES2021 |
|
+ "\n- ES2022: " + !!supportsES2022 |
|
+ "\n- ES2023: " + !!supportsES2023 |
|
); |