@rowanmanning/node-versions 3.1.27 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/data/versions.json +20 -0
- package/index.js +4 -43
- package/lib/fetch-node-versions.js +4 -6
- package/lib/get-engines-node-versions.js +27 -0
- package/lib/get-package-node-versions.js +23 -0
- package/package.json +17 -7
- package/scripts/fetch-node-versions.js +4 -6
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Get the Node.js versions that a repo says it supports.
|
|
|
16
16
|
|
|
17
17
|
This library requires the following to run:
|
|
18
18
|
|
|
19
|
-
* [Node.js](https://nodejs.org/)
|
|
19
|
+
* [Node.js](https://nodejs.org/) 22+
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
## Usage
|
|
@@ -31,8 +31,6 @@ Load one of the methods into your code with `import` or `require`:
|
|
|
31
31
|
|
|
32
32
|
```js
|
|
33
33
|
import { nodeVersions } from '@rowanmanning/node-versions';
|
|
34
|
-
// or
|
|
35
|
-
const { nodeVersions } = require('@rowanmanning/node-versions');
|
|
36
34
|
```
|
|
37
35
|
|
|
38
36
|
The following exports are available.
|
|
@@ -56,10 +54,12 @@ The `options` argument is optional and can be used to change the way the method
|
|
|
56
54
|
* `majorsOnly`: A `boolean` option defaulting to `false`. If this is set to `true` then the returned versions will have any minor/patch versions removed. E.g. `20.0.0` becomes `20`
|
|
57
55
|
|
|
58
56
|
```js
|
|
59
|
-
|
|
57
|
+
import packageJson from './package.json' with { type: 'json' };
|
|
58
|
+
|
|
59
|
+
const versions = getPackageNodeVersions(packageJson);
|
|
60
60
|
// ["v22.5.1", "v20.16.0", "v18.20.4", ...]
|
|
61
61
|
|
|
62
|
-
const versions = await getPackageNodeVersions(
|
|
62
|
+
const versions = await getPackageNodeVersions(packageJson, { majorsOnly: true });
|
|
63
63
|
// ["22", "20", "18", ...]
|
|
64
64
|
```
|
|
65
65
|
|
package/data/versions.json
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
[
|
|
2
|
+
"v26.8.1",
|
|
3
|
+
"v26.8.0",
|
|
4
|
+
"v26.7.0",
|
|
5
|
+
"v26.6.0",
|
|
6
|
+
"v26.5.1",
|
|
7
|
+
"v26.5.0",
|
|
8
|
+
"v26.4.0",
|
|
9
|
+
"v26.3.1",
|
|
10
|
+
"v26.3.0",
|
|
11
|
+
"v26.2.0",
|
|
2
12
|
"v26.1.0",
|
|
3
13
|
"v26.0.0",
|
|
4
14
|
"v25.9.0",
|
|
@@ -15,6 +25,13 @@
|
|
|
15
25
|
"v25.2.0",
|
|
16
26
|
"v25.1.0",
|
|
17
27
|
"v25.0.0",
|
|
28
|
+
"v24.21.0",
|
|
29
|
+
"v24.20.0",
|
|
30
|
+
"v24.19.0",
|
|
31
|
+
"v24.18.1",
|
|
32
|
+
"v24.18.0",
|
|
33
|
+
"v24.17.0",
|
|
34
|
+
"v24.16.0",
|
|
18
35
|
"v24.15.0",
|
|
19
36
|
"v24.14.1",
|
|
20
37
|
"v24.14.0",
|
|
@@ -51,6 +68,9 @@
|
|
|
51
68
|
"v23.2.0",
|
|
52
69
|
"v23.1.0",
|
|
53
70
|
"v23.0.0",
|
|
71
|
+
"v22.23.2",
|
|
72
|
+
"v22.23.1",
|
|
73
|
+
"v22.23.0",
|
|
54
74
|
"v22.22.3",
|
|
55
75
|
"v22.22.2",
|
|
56
76
|
"v22.22.1",
|
package/index.js
CHANGED
|
@@ -1,50 +1,11 @@
|
|
|
1
|
-
'
|
|
1
|
+
import possibleNodeVersions from './data/versions.json' with { type: 'json' };
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export { getEnginesNodeVersions } from './lib/get-engines-node-versions.js';
|
|
4
|
+
export { getPackageNodeVersions } from './lib/get-package-node-versions.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* @import nodeVersions from '@rowanmanning/node-versions'
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
/** @type {nodeVersions['nodeVersions']} */
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/** @type {nodeVersions['getEnginesNodeVersions']} */
|
|
14
|
-
exports.getEnginesNodeVersions = function getEnginesNodeVersions(engines, options = {}) {
|
|
15
|
-
if (typeof engines !== 'string' || !semver.validRange(engines)) {
|
|
16
|
-
return [];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const supportedNodeVersions = possibleNodeVersions.filter((version) =>
|
|
20
|
-
semver.satisfies(version, engines)
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
// Flag to only return the major versions
|
|
24
|
-
if (options.majorsOnly) {
|
|
25
|
-
const majorVersions = new Set(
|
|
26
|
-
supportedNodeVersions.map((version) => `${semver.major(version)}`)
|
|
27
|
-
);
|
|
28
|
-
return [...majorVersions];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return supportedNodeVersions;
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
/** @type {nodeVersions['getPackageNodeVersions']} */
|
|
35
|
-
exports.getPackageNodeVersions = function getPackageNodeVersions(pkg, options) {
|
|
36
|
-
/** @type {any} */
|
|
37
|
-
let engines;
|
|
38
|
-
|
|
39
|
-
// We can only extract engines data from a v2+ lockfile
|
|
40
|
-
if (typeof pkg?.lockfileVersion === 'number' && pkg.lockfileVersion > 1) {
|
|
41
|
-
engines = pkg?.packages?.['']?.engines?.node;
|
|
42
|
-
} else {
|
|
43
|
-
engines = pkg?.engines?.node;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (typeof engines !== 'string') {
|
|
47
|
-
return [];
|
|
48
|
-
}
|
|
49
|
-
return exports.getEnginesNodeVersions(engines, options);
|
|
50
|
-
};
|
|
11
|
+
export const nodeVersions = Object.freeze(possibleNodeVersions);
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
'
|
|
2
|
-
|
|
3
|
-
const assert = require('node:assert/strict');
|
|
4
|
-
const pkg = require('../package.json');
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import pkg from '../package.json' with { type: 'json' };
|
|
5
3
|
|
|
6
4
|
const versionsEndpoint = 'https://nodejs.org/dist/index.json';
|
|
7
5
|
const userAgent = `npm:${pkg.name}/${pkg.version} (${pkg.homepage})`;
|
|
@@ -9,7 +7,7 @@ const userAgent = `npm:${pkg.name}/${pkg.version} (${pkg.homepage})`;
|
|
|
9
7
|
/**
|
|
10
8
|
* @returns {Promise<string[]>}
|
|
11
9
|
*/
|
|
12
|
-
|
|
10
|
+
export async function fetchNodeVersions() {
|
|
13
11
|
const response = await fetch(versionsEndpoint, {
|
|
14
12
|
headers: { 'user-agent': userAgent }
|
|
15
13
|
});
|
|
@@ -29,4 +27,4 @@ exports.fetchNodeVersions = async function fetchNodeVersions() {
|
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
return versions.map(({ version }) => version);
|
|
32
|
-
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
import possibleNodeVersions from '../data/versions.json' with { type: 'json' };
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @import { getEnginesNodeVersions } from '@rowanmanning/node-versions'
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** @type {getEnginesNodeVersions} */
|
|
9
|
+
export function getEnginesNodeVersions(engines, options = {}) {
|
|
10
|
+
if (typeof engines !== 'string' || !semver.validRange(engines)) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const supportedNodeVersions = possibleNodeVersions.filter((version) =>
|
|
15
|
+
semver.satisfies(version, engines)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
// Flag to only return the major versions
|
|
19
|
+
if (options.majorsOnly) {
|
|
20
|
+
const majorVersions = new Set(
|
|
21
|
+
supportedNodeVersions.map((version) => `${semver.major(version)}`)
|
|
22
|
+
);
|
|
23
|
+
return [...majorVersions];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return supportedNodeVersions;
|
|
27
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getEnginesNodeVersions } from './get-engines-node-versions.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @import { getPackageNodeVersions } from '@rowanmanning/node-versions'
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** @type {getPackageNodeVersions} */
|
|
8
|
+
export function getPackageNodeVersions(pkg, options) {
|
|
9
|
+
/** @type {any} */
|
|
10
|
+
let engines;
|
|
11
|
+
|
|
12
|
+
// We can only extract engines data from a v2+ lockfile
|
|
13
|
+
if (typeof pkg?.lockfileVersion === 'number' && pkg.lockfileVersion > 1) {
|
|
14
|
+
engines = pkg?.packages?.['']?.engines?.node;
|
|
15
|
+
} else {
|
|
16
|
+
engines = pkg?.engines?.node;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (typeof engines !== 'string') {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return getEnginesNodeVersions(engines, options);
|
|
23
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rowanmanning/node-versions",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"description": "Get the Node.js versions that a repo says it supports",
|
|
5
6
|
"keywords": [],
|
|
6
7
|
"author": "Rowan Manning (https://rowanmanning.com/)",
|
|
@@ -13,16 +14,25 @@
|
|
|
13
14
|
"bugs": "https://github.com/rowanmanning/repo-tools/issues",
|
|
14
15
|
"license": "MIT",
|
|
15
16
|
"engines": {
|
|
16
|
-
"node": "
|
|
17
|
+
"node": "22.x || 24.x"
|
|
17
18
|
},
|
|
18
19
|
"scripts": {
|
|
19
20
|
"fetch-versions": "node ./scripts/fetch-node-versions.js",
|
|
20
|
-
"postinstall": "node ./scripts/fetch-node-versions.js || true"
|
|
21
|
+
"postinstall": "node ./scripts/fetch-node-versions.js || true",
|
|
22
|
+
"test": "npm run test:unit && npm run test:end-to-end",
|
|
23
|
+
"test:unit": "node --test --experimental-test-module-mocks --experimental-test-coverage --test-coverage-exclude '**/*.test.js' --test-coverage-branches=100 --test-coverage-functions=100 --test-coverage-lines=100 'test/unit/**/*.test.js'",
|
|
24
|
+
"test:end-to-end": "node --test 'test/end-to-end/**/*.test.js'"
|
|
21
25
|
},
|
|
22
|
-
"
|
|
23
|
-
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./index.d.ts",
|
|
29
|
+
"default": "./index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"types": "./index.d.ts",
|
|
33
|
+
"main": "./index.js",
|
|
24
34
|
"dependencies": {
|
|
25
|
-
"@rowanmanning/package-json": "^
|
|
26
|
-
"semver": "^7.
|
|
35
|
+
"@rowanmanning/package-json": "^3.0.0",
|
|
36
|
+
"semver": "^7.8.5"
|
|
27
37
|
}
|
|
28
38
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { fetchNodeVersions } from '../lib/fetch-node-versions.js';
|
|
2
4
|
|
|
3
|
-
const
|
|
4
|
-
const { resolve: resolvePath } = require('node:path');
|
|
5
|
-
const { fetchNodeVersions } = require('../lib/fetch-node-versions');
|
|
6
|
-
|
|
7
|
-
const filePath = resolvePath(__dirname, '..', 'data', 'versions.json');
|
|
5
|
+
const filePath = resolve(import.meta.dirname, '..', 'data', 'versions.json');
|
|
8
6
|
|
|
9
7
|
async function runScript() {
|
|
10
8
|
const versions = await fetchNodeVersions();
|