diff --git a/.eslintignore b/.eslintignore index 6912fef..c8c0bbf 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ deps/ +test/temp/ diff --git a/lib/version.js b/lib/version.js index e2df593..bf148ff 100644 --- a/lib/version.js +++ b/lib/version.js @@ -8,7 +8,7 @@ const settings = require('./settings').settings; const Error = require('./error'); const versionRegex = - /^(([\w-]+)\/)?((v?(\d+(\.\d+(\.\d+)?)?(-[0-9A-Za-z.-]+)?))|([a-z][a-z_-][0-9a-z_-]*))(\/((x86)|(32)|((x)?64)|(arm\w*)|(ppc\w*)|(s390x)))?$/i; + /^(([\w-]+)\/)?((v?(\d+(\.\d+(\.\d+)?)?(-[0-9A-Za-z.-]+)?))|([a-z][a-z_-][0-9a-z_-]*|\*))(\/((x86)|(32)|((x)?64)|(arm\w*)|(ppc\w*)|(s390x)))?$/i; class NodeVersion { constructor(remoteName, semanticVersion, arch) { @@ -103,8 +103,19 @@ class NodeVersion { remoteName = 'default'; } - if (remoteName === 'default' && settings.remotes) { - remoteName = settings.remotes['default'] || 'node'; + if (settings.remotes) { + if (remoteName === 'default') { + remoteName = settings.remotes['default'] || 'node'; + } else if (remoteName === 'lts' && !semanticVersion) { + // Interpret an 'lts' remote name as 'node' to enable compatibility + // with NVM-style LTS version strings such as "lts/boron". + remoteName = settings.remotes['default'] || 'node'; + if (label === '*') { + // In NVM, "lts/*" means "latest LTS". + // The NVS equivalent is "node/lts". + label = 'lts'; + } + } } if ((!settings.remotes || !settings.remotes[remoteName]) && diff --git a/test/modules/versionTests.js b/test/modules/versionTests.js index 8bb2d3f..ddf50f7 100644 --- a/test/modules/versionTests.js +++ b/test/modules/versionTests.js @@ -166,4 +166,12 @@ test('GetBinaryNameFromVersion', t => { t.is(NodeVersion.getBinaryNameFromVersion('7.8'), 'node'); }); +test('LTS versions', t => { + t.is(NodeVersion.parse('lts').toString(), 'test/lts'); + t.is(NodeVersion.parse('lts/*').toString(), 'test/lts'); + t.is(NodeVersion.parse('lts/boron').toString(), 'test/boron'); + t.throws(() => NodeVersion.parse('lts/6.7.8'), + (e) => e.message.indexOf('Remote name not found') >= 0); +}); + test.todo('Match');