Skip to content

Instantly share code, notes, and snippets.

@guillaumealgis
Last active November 12, 2023 09:52
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guillaumealgis/6878d80e864e26c6a4169602d96f733d to your computer and use it in GitHub Desktop.
Save guillaumealgis/6878d80e864e26c6a4169602d96f733d to your computer and use it in GitHub Desktop.
Detect the latest ECMAScript version supported by JavascriptCore on macOS
#!/usr/bin/env sh
# Find the jsc REPL, and execute our detection code inside it.
SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
JSC=$(find -H /System/Library/Frameworks/JavaScriptCore.framework -iname jsc)
if [ -z "$JSC" ]; then
echo "jsc binary not found" >&2
exit 1
fi
echo "Using jsc at $JSC"
$JSC "$SCRIPT_DIR/detect_js_version.js"
// Adapted from https://stackoverflow.com/a/68953809/404321
// https://www.devdiscuss.com/how-to-detect-the-ecmascript-version/
//
// Adapted and shared under CC BY-SA 4.0
var getECMAVersion = function () {
var rv = '';
// https://en.wikipedia.org/wiki/ECMAScript_version_history
return (
(rv = null),
'function' == typeof RegExp &&
(rv = {
edition: 3,
date_published: '1999-12'
}),
'function' == typeof Array.isArray &&
(rv = {
edition: 5,
date_published: '2009-12'
}),
('function' != typeof Array.find && 'function' != typeof Array.findIndex) ||
(rv = {
edition: 6,
date_published: '2015-06',
name: 'ECMAScript 2015',
name_code: 'ES2015'
}),
'function' == typeof Array.prototype.includes &&
(rv = {
edition: 7,
date_published: '2016-06',
name: 'ECMAScript 2016',
name_code: 'ES2016'
}),
'function' == typeof Object.entries &&
(rv = {
edition: 8,
date_published: '2017-06',
name: 'ECMAScript 2017',
name_code: 'ES2017'
}),
'undefined' != typeof Promise &&
'function' == typeof Promise.prototype.finally &&
(rv = {
edition: 9,
date_published: '2018-06',
name: 'ECMAScript 2018',
name_code: 'ES2018'
}),
('function' != typeof Object.fromEntries && 'function' != typeof String.prototype.trimStart) ||
(rv = {
edition: 10,
date_published: '2019-06',
name: 'ECMAScript 2019',
name_code: 'ES2019'
}),
'function' == typeof BigInt &&
(rv = {
edition: 11,
date_published: '2020-06',
name: 'ECMAScript 2020',
name_code: 'ES2020'
}),
'function' == typeof String.prototype.replaceAll &&
(rv = {
edition: 12,
date_published: '2021-06',
name: 'ECMAScript 2021',
name_code: 'ES2021'
}),
'function' == typeof Object.hasOwn &&
(rv = {
edition: 13,
date_published: '2022-06',
name: 'ECMAScript 2022',
name_code: 'ES2022'
}),
'function' == typeof Array.prototype.toSorted &&
(rv = {
edition: 14,
date_published: '2023-06',
name: 'ECMAScript 2023',
name_code: 'ES2023'
}),
rv
);
};
// https://gist.github.com/ctkjose/03d14236a55c4b85cb8d6e6156c57b13
var console = { log: debug };
var ecma = getECMAVersion();
if (typeof ecma !== 'undefined') {
if (ecma.edition) {
console.log('ECMAScript Edition: ' + ecma.edition);
}
if (ecma.name) {
console.log('Name: ' + ecma.name);
}
if (ecma.date_published) {
console.log('Released: ' + ecma.date_published);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment