Skip to content

Commit

Permalink
feat: add engines and cwd options
Browse files Browse the repository at this point in the history
  • Loading branch information
ljharb authored and wesleytodd committed Jul 17, 2024
1 parent a5dd9af commit cafeb26
Show file tree
Hide file tree
Showing 6 changed files with 245 additions and 1 deletion.
103 changes: 103 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,109 @@ console.log(versions.map((v) => v.version))
*/
```

## Command line interface (CLI)

Options:
- `--only-version`: instead of the entire output, only print one version number per line
- `--engines`: only print versions that match the current directory's `engines.node` field
- `--engines=lts`: only print LTS versions that also match the current directory's `engines.node` field

```sh
$ nv ls lts
{
"version": "18.20.4",
"major": 18,
"minor": 20,
"patch": 4,
"tag": "",
"codename": "hydrogen",
"versionName": "v18",
"start": "2022-04-19T00:00:00.000Z",
"lts": "2022-10-25T00:00:00.000Z",
"maintenance": "2023-10-18T00:00:00.000Z",
"end": "2025-04-30T00:00:00.000Z",
"releaseDate": "2024-07-08T00:00:00.000Z",
"isLts": true,
"files": [
"aix-ppc64",
"headers",
"linux-arm64",
"linux-armv7l",
"linux-ppc64le",
"linux-s390x",
"linux-x64",
"osx-arm64-tar",
"osx-x64-pkg",
"osx-x64-tar",
"src",
"win-x64-7z",
"win-x64-exe",
"win-x64-msi",
"win-x64-zip",
"win-x86-7z",
"win-x86-exe",
"win-x86-msi",
"win-x86-zip"
],
"dependencies": {
"npm": "10.7.0",
"v8": "10.2.154.26",
"uv": "1.44.2",
"zlib": "1.3.0.1-motley",
"openssl": "3.0.13+quic"
}
}
{
"version": "20.15.1",
"major": 20,
"minor": 15,
"patch": 1,
"tag": "",
"codename": "iron",
"versionName": "v20",
"start": "2023-04-18T00:00:00.000Z",
"lts": "2023-10-24T00:00:00.000Z",
"maintenance": "2024-10-22T00:00:00.000Z",
"end": "2026-04-30T00:00:00.000Z",
"releaseDate": "2024-07-08T00:00:00.000Z",
"isLts": true,
"files": [
"aix-ppc64",
"headers",
"linux-arm64",
"linux-armv7l",
"linux-ppc64le",
"linux-s390x",
"linux-x64",
"osx-arm64-tar",
"osx-x64-pkg",
"osx-x64-tar",
"src",
"win-arm64-7z",
"win-arm64-zip",
"win-x64-7z",
"win-x64-exe",
"win-x64-msi",
"win-x64-zip",
"win-x86-7z",
"win-x86-exe",
"win-x86-msi",
"win-x86-zip"
],
"dependencies": {
"npm": "10.7.0",
"v8": "11.3.244.8",
"uv": "1.46.0",
"zlib": "1.3.0.1-motley",
"openssl": "3.0.13+quic"
}
}

$ nv ls lts --only-version
18.20.4
20.15.1
```

## Supported Aliases

**Support Aliases**
Expand Down
7 changes: 6 additions & 1 deletion bin/nv
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,14 @@ require('yargs')
type: 'boolean',
description: 'show version number only'
})
yargs.option('engines', {
type: 'string',
description: 'read the value of `engines.node`. if a value is provided, and it satisfies, the version is shown; if not, the max satisfying version is shown'
})
},
handler: (argv) => {
nv(argv.versions, {
engines: argv.engines,
mirror: argv.mirror
})
.then(result => {
Expand All @@ -41,7 +46,7 @@ require('yargs')
})
}).catch(e => {
console.error(e)
process.exitCode = e.code || 1
process.exitCode ||= e.code || 1
})
}
})
Expand Down
17 changes: 17 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
'use strict'
const { readFile } = require('fs/promises')
const { join } = require('path')

const got = require('got')
const semver = require('semver')
const _cache = new Map()
Expand All @@ -8,6 +11,8 @@ module.exports = async function (alias = 'lts_active', opts = {}) {
const cache = opts.cache || _cache
const mirror = opts.mirror || 'https://nodejs.org/dist/'
const latestOfMajorOnly = opts.latestOfMajorOnly || false
const engines = opts.engines
const cwd = opts.cwd || process.cwd()

const a = Array.isArray(alias) ? alias : [alias]
const versions = await getLatestVersionsByCodename(now, cache, mirror)
Expand All @@ -25,6 +30,18 @@ module.exports = async function (alias = 'lts_active', opts = {}) {
return m
}, {})

if (typeof engines === 'string' || engines === true) {
const { engines: { node } = { node: '*' } } = JSON.parse(await readFile(join(cwd, 'package.json'), 'utf8'))

m = Object.fromEntries(Object.entries(m).filter(([version]) => semver.satisfies(version, node)))

const matching = Object.entries(m).filter(([version]) => semver.satisfies(version, engines))

if (matching.length > 0) {
m = Object.fromEntries(matching)
}
}

// If only latest major is true, filter out all but latest
if (latestOfMajorOnly) {
const vers = Object.values(m).reduce((latestMajor, v) => {
Expand Down
58 changes: 58 additions & 0 deletions test/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,62 @@ suite('nv cli', () => {
assert(semver.valid(r))
})
})

test('works with `--engines`', () => {
const result = execFileSync(nv, ['ls', '8.x', '--only-version', '--engines=">=8"'], { cwd: path.join(__dirname, 'fixtures', 'engines') })
.toString().trim().split('\n')

assert.deepEqual(result, [
'8.10.0',
'8.11.0',
'8.11.1',
'8.11.2',
'8.11.3',
'8.11.4',
'8.12.0',
'8.13.0',
'8.14.0',
'8.14.1',
'8.15.0',
'8.15.1',
'8.16.0',
'8.16.1',
'8.16.2',
'8.17.0'
])

const result2 = execFileSync(nv, ['ls', '8.x', '--only-version', '--engines=">=8.15"'], { cwd: path.join(__dirname, 'fixtures', 'engines') })
.toString().trim().split('\n')

assert.deepEqual(result2, [
'8.15.0',
'8.15.1',
'8.16.0',
'8.16.1',
'8.16.2',
'8.17.0'
])

const result3 = execFileSync(nv, ['ls', '8.x', '--only-version', '--engines'], { cwd: path.join(__dirname, 'fixtures', 'engines') })
.toString().trim().split('\n')

assert.deepEqual(result3, [
'8.10.0',
'8.11.0',
'8.11.1',
'8.11.2',
'8.11.3',
'8.11.4',
'8.12.0',
'8.13.0',
'8.14.0',
'8.14.1',
'8.15.0',
'8.15.1',
'8.16.0',
'8.16.1',
'8.16.2',
'8.17.0'
])
})
})
5 changes: 5 additions & 0 deletions test/fixtures/engines/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"engines": {
"node": "^8.10"
}
}
56 changes: 56 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict'
const { suite, test } = require('mocha')
const assert = require('assert')
const path = require('path')
const nv = require('..')

// 2019-02-07T16:15:49.683Z
Expand Down Expand Up @@ -182,4 +183,59 @@ suite('nv', () => {
const versions = await nv('0.8.0', { now })
assert.strictEqual(versions[0].codename, null)
})

test('engines option', async () => {
const versions = await nv('8.x', { now, cwd: path.join(__dirname, 'fixtures', 'engines'), engines: '>=8' })

assert.deepEqual(versions.map(x => x.version), [
'8.10.0',
'8.11.0',
'8.11.1',
'8.11.2',
'8.11.3',
'8.11.4',
'8.12.0',
'8.13.0',
'8.14.0',
'8.14.1',
'8.15.0',
'8.15.1',
'8.16.0',
'8.16.1',
'8.16.2',
'8.17.0'
])

const versions2 = await nv('8.x', { now, cwd: path.join(__dirname, 'fixtures', 'engines'), engines: '>=8.15' })

assert.deepEqual(versions2.map(x => x.version), [
'8.15.0',
'8.15.1',
'8.16.0',
'8.16.1',
'8.16.2',
'8.17.0'
])

const versions3 = await nv('8.x', { now, cwd: path.join(__dirname, 'fixtures', 'engines'), engines: true })

assert.deepEqual(versions3.map(x => x.version), [
'8.10.0',
'8.11.0',
'8.11.1',
'8.11.2',
'8.11.3',
'8.11.4',
'8.12.0',
'8.13.0',
'8.14.0',
'8.14.1',
'8.15.0',
'8.15.1',
'8.16.0',
'8.16.1',
'8.16.2',
'8.17.0'
])
})
})

0 comments on commit cafeb26

Please sign in to comment.