|
|
const tests = { |
|
|
|
|
|
"object-rest-spread": ["({ ...{} })", "({ ...x } = {})"], |
|
|
"async-generators": ["async function* f() {}"], |
|
|
|
|
|
|
|
|
"optional-catch-binding": ["try {} catch {}"], |
|
|
"json-strings": ["'\\u2028'"], |
|
|
|
|
|
|
|
|
bigint: ["1n"], |
|
|
"optional-chaining": ["a?.b"], |
|
|
"nullish-coalescing-operator": ["a ?? b"], |
|
|
|
|
|
|
|
|
|
|
|
"numeric-separator": ["1_2"], |
|
|
"logical-assignment-operators": ["a ||= b", "a &&= b", "a ??= c"], |
|
|
|
|
|
|
|
|
"class-properties": [ |
|
|
"(class { x = 1 })", |
|
|
"(class { #x = 1 })", |
|
|
"(class { #x() {} })", |
|
|
], |
|
|
"private-property-in-object": ["(class { #x; m() { #x in y } })"], |
|
|
"class-static-block": ["(class { static {} })"], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
const plugins = []; |
|
|
const works = (test) => { |
|
|
try { |
|
|
|
|
|
(0, eval)(`(() => { ${test} })`); |
|
|
return true; |
|
|
} catch (_error) { |
|
|
return false; |
|
|
} |
|
|
}; |
|
|
|
|
|
for (const [name, cases] of Object.entries(tests)) { |
|
|
if (cases.some(works)) { |
|
|
plugins.push(require.resolve(`@babel/plugin-syntax-${name}`)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const major = parseInt(process.versions.node, 10); |
|
|
const minor = parseInt(process.versions.node.match(/^\d+\.(\d+)/)[1], 10); |
|
|
if (major > 10 || (major === 10 && minor >= 4)) { |
|
|
plugins.push(require.resolve("@babel/plugin-syntax-import-meta")); |
|
|
} |
|
|
|
|
|
|
|
|
if (major > 14 || (major === 14 && minor >= 3)) { |
|
|
plugins.push(require.resolve("@babel/plugin-syntax-top-level-await")); |
|
|
} |
|
|
|
|
|
if ( |
|
|
major > 20 || |
|
|
(major === 20 && minor >= 10) || |
|
|
(major === 18 && minor >= 20) |
|
|
) { |
|
|
plugins.push(require.resolve("@babel/plugin-syntax-import-attributes")); |
|
|
} |
|
|
module.exports = () => ({ plugins }); |
|
|
|