|
var semver = require('semver') |
|
|
|
function getNextTarget (runtime, targets) { |
|
if (targets == null) targets = allTargets |
|
var latest = targets.filter(function (t) { return t.runtime === runtime }).slice(-1)[0] |
|
var increment = runtime === 'electron' ? 'minor' : 'major' |
|
var next = semver.inc(latest.target, increment) |
|
|
|
|
|
if (runtime === 'electron' && semver.parse(latest.target).prerelease.length) { |
|
next = semver.inc(next, 'major') |
|
} |
|
return next |
|
} |
|
|
|
function getAbi (target, runtime) { |
|
if (target === String(Number(target))) return target |
|
if (target) target = target.replace(/^v/, '') |
|
if (!runtime) runtime = 'node' |
|
|
|
if (runtime === 'node') { |
|
if (!target) return process.versions.modules |
|
if (target === process.versions.node) return process.versions.modules |
|
} |
|
|
|
var abi |
|
|
|
for (var i = 0; i < allTargets.length; i++) { |
|
var t = allTargets[i] |
|
if (t.runtime !== runtime) continue |
|
if (semver.lte(t.target, target)) abi = t.abi |
|
else break |
|
} |
|
|
|
if (abi && semver.lt(target, getNextTarget(runtime))) return abi |
|
throw new Error('Could not detect abi for version ' + target + ' and runtime ' + runtime + '. Updating "node-abi" might help solve this issue if it is a new release of ' + runtime) |
|
} |
|
|
|
function getTarget (abi, runtime) { |
|
if (abi && abi !== String(Number(abi))) return abi |
|
if (!runtime) runtime = 'node' |
|
|
|
if (runtime === 'node' && !abi) return process.versions.node |
|
|
|
var match = allTargets |
|
.filter(function (t) { |
|
return t.abi === abi && t.runtime === runtime |
|
}) |
|
.map(function (t) { |
|
return t.target |
|
}) |
|
if (match.length) { |
|
var betaSeparatorIndex = match[0].indexOf("-") |
|
return betaSeparatorIndex > -1 |
|
? match[0].substring(0, betaSeparatorIndex) |
|
: match[0] |
|
} |
|
|
|
throw new Error('Could not detect target for abi ' + abi + ' and runtime ' + runtime) |
|
} |
|
|
|
function sortByTargetFn (a, b) { |
|
var abiComp = Number(a.abi) - Number(b.abi) |
|
if (abiComp !== 0) return abiComp |
|
if (a.target < b.target) return -1 |
|
if (a.target > b.target) return 1 |
|
return 0 |
|
} |
|
|
|
function loadGeneratedTargets () { |
|
var registry = require('./abi_registry.json') |
|
var targets = { |
|
supported: [], |
|
additional: [], |
|
future: [] |
|
} |
|
|
|
registry.forEach(function (item) { |
|
var target = { |
|
runtime: item.runtime, |
|
target: item.target, |
|
abi: item.abi |
|
} |
|
if (item.lts) { |
|
var startDate = new Date(Date.parse(item.lts[0])) |
|
var endDate = new Date(Date.parse(item.lts[1])) |
|
var currentDate = new Date() |
|
target.lts = startDate < currentDate && currentDate < endDate |
|
} else { |
|
target.lts = false |
|
} |
|
|
|
if (target.runtime === 'node-webkit') { |
|
targets.additional.push(target) |
|
} else if (item.future) { |
|
targets.future.push(target) |
|
} else { |
|
targets.supported.push(target) |
|
} |
|
}) |
|
|
|
targets.supported.sort(sortByTargetFn) |
|
targets.additional.sort(sortByTargetFn) |
|
targets.future.sort(sortByTargetFn) |
|
|
|
return targets |
|
} |
|
|
|
var generatedTargets = loadGeneratedTargets() |
|
|
|
var supportedTargets = [ |
|
{runtime: 'node', target: '5.0.0', abi: '47', lts: false}, |
|
{runtime: 'node', target: '6.0.0', abi: '48', lts: false}, |
|
{runtime: 'node', target: '7.0.0', abi: '51', lts: false}, |
|
{runtime: 'node', target: '8.0.0', abi: '57', lts: false}, |
|
{runtime: 'node', target: '9.0.0', abi: '59', lts: false}, |
|
{runtime: 'node', target: '10.0.0', abi: '64', lts: new Date(2018, 10, 1) < new Date() && new Date() < new Date(2020, 4, 31)}, |
|
{runtime: 'electron', target: '0.36.0', abi: '47', lts: false}, |
|
{runtime: 'electron', target: '1.1.0', abi: '48', lts: false}, |
|
{runtime: 'electron', target: '1.3.0', abi: '49', lts: false}, |
|
{runtime: 'electron', target: '1.4.0', abi: '50', lts: false}, |
|
{runtime: 'electron', target: '1.5.0', abi: '51', lts: false}, |
|
{runtime: 'electron', target: '1.6.0', abi: '53', lts: false}, |
|
{runtime: 'electron', target: '1.7.0', abi: '54', lts: false}, |
|
{runtime: 'electron', target: '1.8.0', abi: '57', lts: false}, |
|
{runtime: 'electron', target: '2.0.0', abi: '57', lts: false}, |
|
{runtime: 'electron', target: '3.0.0', abi: '64', lts: false}, |
|
{runtime: 'electron', target: '4.0.0', abi: '64', lts: false}, |
|
{runtime: 'electron', target: '4.0.4', abi: '69', lts: false} |
|
] |
|
|
|
supportedTargets.push.apply(supportedTargets, generatedTargets.supported) |
|
|
|
var additionalTargets = [ |
|
{runtime: 'node-webkit', target: '0.13.0', abi: '47', lts: false}, |
|
{runtime: 'node-webkit', target: '0.15.0', abi: '48', lts: false}, |
|
{runtime: 'node-webkit', target: '0.18.3', abi: '51', lts: false}, |
|
{runtime: 'node-webkit', target: '0.23.0', abi: '57', lts: false}, |
|
{runtime: 'node-webkit', target: '0.26.5', abi: '59', lts: false} |
|
] |
|
|
|
additionalTargets.push.apply(additionalTargets, generatedTargets.additional) |
|
|
|
var deprecatedTargets = [ |
|
{runtime: 'node', target: '0.2.0', abi: '1', lts: false}, |
|
{runtime: 'node', target: '0.9.1', abi: '0x000A', lts: false}, |
|
{runtime: 'node', target: '0.9.9', abi: '0x000B', lts: false}, |
|
{runtime: 'node', target: '0.10.4', abi: '11', lts: false}, |
|
{runtime: 'node', target: '0.11.0', abi: '0x000C', lts: false}, |
|
{runtime: 'node', target: '0.11.8', abi: '13', lts: false}, |
|
{runtime: 'node', target: '0.11.11', abi: '14', lts: false}, |
|
{runtime: 'node', target: '1.0.0', abi: '42', lts: false}, |
|
{runtime: 'node', target: '1.1.0', abi: '43', lts: false}, |
|
{runtime: 'node', target: '2.0.0', abi: '44', lts: false}, |
|
{runtime: 'node', target: '3.0.0', abi: '45', lts: false}, |
|
{runtime: 'node', target: '4.0.0', abi: '46', lts: false}, |
|
{runtime: 'electron', target: '0.30.0', abi: '44', lts: false}, |
|
{runtime: 'electron', target: '0.31.0', abi: '45', lts: false}, |
|
{runtime: 'electron', target: '0.33.0', abi: '46', lts: false} |
|
] |
|
|
|
var futureTargets = generatedTargets.future |
|
|
|
var allTargets = deprecatedTargets |
|
.concat(supportedTargets) |
|
.concat(additionalTargets) |
|
.concat(futureTargets) |
|
|
|
exports.getAbi = getAbi |
|
exports.getTarget = getTarget |
|
exports.deprecatedTargets = deprecatedTargets |
|
exports.supportedTargets = supportedTargets |
|
exports.additionalTargets = additionalTargets |
|
exports.futureTargets = futureTargets |
|
exports.allTargets = allTargets |
|
exports._getNextTarget = getNextTarget |
|
|