@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 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/) 20+
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
- const versions = getPackageNodeVersions(require('./package.json'));
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(require('./package.json'), { majorsOnly: true });
62
+ const versions = await getPackageNodeVersions(packageJson, { majorsOnly: true });
63
63
  // ["22", "20", "18", ...]
64
64
  ```
65
65
 
@@ -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
- 'use strict';
1
+ import possibleNodeVersions from './data/versions.json' with { type: 'json' };
2
2
 
3
- const possibleNodeVersions = require('./data/versions.json');
4
- const semver = require('semver');
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
- exports.nodeVersions = Object.freeze(possibleNodeVersions);
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
- 'use strict';
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
- exports.fetchNodeVersions = async function fetchNodeVersions() {
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.1.27",
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": "20.x || 22.x || 24.x"
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
- "main": "index.js",
23
- "types": "index.d.ts",
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": "^2.1.0",
26
- "semver": "^7.7.4"
35
+ "@rowanmanning/package-json": "^3.0.0",
36
+ "semver": "^7.8.5"
27
37
  }
28
38
  }
@@ -1,10 +1,8 @@
1
- 'use strict';
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 { writeFile } = require('node:fs/promises');
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();