@rowanmanning/node-versions 1.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 ADDED
@@ -0,0 +1,94 @@
1
+
2
+ # @rowanmanning/node-versions
3
+
4
+ Get the Node.js versions that a repo says it supports.
5
+
6
+ * [Requirements](#requirements)
7
+ * [Usage](#usage)
8
+ * [Contributing](#contributing)
9
+ * [License](#license)
10
+
11
+
12
+ ## Requirements
13
+
14
+ This library requires the following to run:
15
+
16
+ * [Node.js](https://nodejs.org/) 18+
17
+
18
+
19
+ ## Usage
20
+
21
+ Install with [npm](https://www.npmjs.com/):
22
+
23
+ ```sh
24
+ npm install @rowanmanning/node-versions
25
+ ```
26
+
27
+ Load one of the methods into your code with `import` or `require`:
28
+
29
+ ```js
30
+ import { nodeVersions } from '@rowanmanning/node-versions';
31
+ // or
32
+ const { nodeVersions } = require('@rowanmanning/node-versions');
33
+ ```
34
+
35
+ The following exports are available.
36
+
37
+ ### `nodeVersions`
38
+
39
+ An array of strings (`string[]`) that contains every released versions of Node.js, retrieved from <https://nodejs.org/dist/index.json>. The versions are loaded on install rather than at runtime and there's a cached copy in the package that we keep up to date.
40
+
41
+ ### `getPackageNodeVersions()`
42
+
43
+ A function to list the Node.js versions that a `package.json` file claims to support. This function has the following signature:
44
+
45
+ ```ts
46
+ (path: string, options?: object) => Promise<string[]>
47
+ ```
48
+
49
+ The `path` argument is required and must be an accessible folder that contains a `package.json` file _or_ the path to a `package.json` file itself.
50
+
51
+ The `options` argument is optional and can be used to change the way the method works. The following options are available:
52
+
53
+ * `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`
54
+
55
+ ```js
56
+ const versions = await getPackageNodeVersions('/path/to/my/repo');
57
+ // ["v22.5.1", "v20.16.0", "v18.20.4", ...]
58
+
59
+ const versions = await getPackageNodeVersions('/path/to/my/repo', { majorsOnly: true });
60
+ // ["22", "20", "18", ...]
61
+ ```
62
+
63
+ ### `getEnginesNodeVersions()`
64
+
65
+ A function to list the supported Node.js versions based on a version range string. This might be useful if, for example, you already have the engines your package supports as a string. This function has the following signature:
66
+
67
+ ```ts
68
+ (engines: string, options?: object) => string[]
69
+ ```
70
+
71
+ The `engines` argument is required and must be a semver range.
72
+
73
+ The `options` argument is optional and can be used to change the way the method works. The following options are available:
74
+
75
+ * `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`
76
+
77
+ ```js
78
+ const versions = getEnginesNodeVersions('18.x || 20.x || 22.x');
79
+ // ["v22.5.1", "v20.16.0", "v18.20.4", ...]
80
+
81
+ const versions = getEnginesNodeVersions('18.x || 20.x || 22.x', { majorsOnly: true });
82
+ // ["22", "20", "18", ...]
83
+ ```
84
+
85
+
86
+ ## Contributing
87
+
88
+ [See the central README for a contribution guide and code of conduct](https://github.com/rowanmanning/repo-tools#contributing).
89
+
90
+
91
+ ## License
92
+
93
+ Licensed under the [MIT](https://github.com/rowanmanning/repo-tools/blob/main/LICENSE) license.<br/>
94
+ Copyright &copy; 2024, Rowan Manning
@@ -0,0 +1,751 @@
1
+ [
2
+ "v22.5.1",
3
+ "v22.5.0",
4
+ "v22.4.1",
5
+ "v22.4.0",
6
+ "v22.3.0",
7
+ "v22.2.0",
8
+ "v22.1.0",
9
+ "v22.0.0",
10
+ "v21.7.3",
11
+ "v21.7.2",
12
+ "v21.7.1",
13
+ "v21.7.0",
14
+ "v21.6.2",
15
+ "v21.6.1",
16
+ "v21.6.0",
17
+ "v21.5.0",
18
+ "v21.4.0",
19
+ "v21.3.0",
20
+ "v21.2.0",
21
+ "v21.1.0",
22
+ "v21.0.0",
23
+ "v20.16.0",
24
+ "v20.15.1",
25
+ "v20.15.0",
26
+ "v20.14.0",
27
+ "v20.13.1",
28
+ "v20.13.0",
29
+ "v20.12.2",
30
+ "v20.12.1",
31
+ "v20.12.0",
32
+ "v20.11.1",
33
+ "v20.11.0",
34
+ "v20.10.0",
35
+ "v20.9.0",
36
+ "v20.8.1",
37
+ "v20.8.0",
38
+ "v20.7.0",
39
+ "v20.6.1",
40
+ "v20.6.0",
41
+ "v20.5.1",
42
+ "v20.5.0",
43
+ "v20.4.0",
44
+ "v20.3.1",
45
+ "v20.3.0",
46
+ "v20.2.0",
47
+ "v20.1.0",
48
+ "v20.0.0",
49
+ "v19.9.0",
50
+ "v19.8.1",
51
+ "v19.8.0",
52
+ "v19.7.0",
53
+ "v19.6.1",
54
+ "v19.6.0",
55
+ "v19.5.0",
56
+ "v19.4.0",
57
+ "v19.3.0",
58
+ "v19.2.0",
59
+ "v19.1.0",
60
+ "v19.0.1",
61
+ "v19.0.0",
62
+ "v18.20.4",
63
+ "v18.20.3",
64
+ "v18.20.2",
65
+ "v18.20.1",
66
+ "v18.20.0",
67
+ "v18.19.1",
68
+ "v18.19.0",
69
+ "v18.18.2",
70
+ "v18.18.1",
71
+ "v18.18.0",
72
+ "v18.17.1",
73
+ "v18.17.0",
74
+ "v18.16.1",
75
+ "v18.16.0",
76
+ "v18.15.0",
77
+ "v18.14.2",
78
+ "v18.14.1",
79
+ "v18.14.0",
80
+ "v18.13.0",
81
+ "v18.12.1",
82
+ "v18.12.0",
83
+ "v18.11.0",
84
+ "v18.10.0",
85
+ "v18.9.1",
86
+ "v18.9.0",
87
+ "v18.8.0",
88
+ "v18.7.0",
89
+ "v18.6.0",
90
+ "v18.5.0",
91
+ "v18.4.0",
92
+ "v18.3.0",
93
+ "v18.2.0",
94
+ "v18.1.0",
95
+ "v18.0.0",
96
+ "v17.9.1",
97
+ "v17.9.0",
98
+ "v17.8.0",
99
+ "v17.7.2",
100
+ "v17.7.1",
101
+ "v17.7.0",
102
+ "v17.6.0",
103
+ "v17.5.0",
104
+ "v17.4.0",
105
+ "v17.3.1",
106
+ "v17.3.0",
107
+ "v17.2.0",
108
+ "v17.1.0",
109
+ "v17.0.1",
110
+ "v17.0.0",
111
+ "v16.20.2",
112
+ "v16.20.1",
113
+ "v16.20.0",
114
+ "v16.19.1",
115
+ "v16.19.0",
116
+ "v16.18.1",
117
+ "v16.18.0",
118
+ "v16.17.1",
119
+ "v16.17.0",
120
+ "v16.16.0",
121
+ "v16.15.1",
122
+ "v16.15.0",
123
+ "v16.14.2",
124
+ "v16.14.1",
125
+ "v16.14.0",
126
+ "v16.13.2",
127
+ "v16.13.1",
128
+ "v16.13.0",
129
+ "v16.12.0",
130
+ "v16.11.1",
131
+ "v16.11.0",
132
+ "v16.10.0",
133
+ "v16.9.1",
134
+ "v16.9.0",
135
+ "v16.8.0",
136
+ "v16.7.0",
137
+ "v16.6.2",
138
+ "v16.6.1",
139
+ "v16.6.0",
140
+ "v16.5.0",
141
+ "v16.4.2",
142
+ "v16.4.1",
143
+ "v16.4.0",
144
+ "v16.3.0",
145
+ "v16.2.0",
146
+ "v16.1.0",
147
+ "v16.0.0",
148
+ "v15.14.0",
149
+ "v15.13.0",
150
+ "v15.12.0",
151
+ "v15.11.0",
152
+ "v15.10.0",
153
+ "v15.9.0",
154
+ "v15.8.0",
155
+ "v15.7.0",
156
+ "v15.6.0",
157
+ "v15.5.1",
158
+ "v15.5.0",
159
+ "v15.4.0",
160
+ "v15.3.0",
161
+ "v15.2.1",
162
+ "v15.2.0",
163
+ "v15.1.0",
164
+ "v15.0.1",
165
+ "v15.0.0",
166
+ "v14.21.3",
167
+ "v14.21.2",
168
+ "v14.21.1",
169
+ "v14.21.0",
170
+ "v14.20.1",
171
+ "v14.20.0",
172
+ "v14.19.3",
173
+ "v14.19.2",
174
+ "v14.19.1",
175
+ "v14.19.0",
176
+ "v14.18.3",
177
+ "v14.18.2",
178
+ "v14.18.1",
179
+ "v14.18.0",
180
+ "v14.17.6",
181
+ "v14.17.5",
182
+ "v14.17.4",
183
+ "v14.17.3",
184
+ "v14.17.2",
185
+ "v14.17.1",
186
+ "v14.17.0",
187
+ "v14.16.1",
188
+ "v14.16.0",
189
+ "v14.15.5",
190
+ "v14.15.4",
191
+ "v14.15.3",
192
+ "v14.15.2",
193
+ "v14.15.1",
194
+ "v14.15.0",
195
+ "v14.14.0",
196
+ "v14.13.1",
197
+ "v14.13.0",
198
+ "v14.12.0",
199
+ "v14.11.0",
200
+ "v14.10.1",
201
+ "v14.10.0",
202
+ "v14.9.0",
203
+ "v14.8.0",
204
+ "v14.7.0",
205
+ "v14.6.0",
206
+ "v14.5.0",
207
+ "v14.4.0",
208
+ "v14.3.0",
209
+ "v14.2.0",
210
+ "v14.1.0",
211
+ "v14.0.0",
212
+ "v13.14.0",
213
+ "v13.13.0",
214
+ "v13.12.0",
215
+ "v13.11.0",
216
+ "v13.10.1",
217
+ "v13.10.0",
218
+ "v13.9.0",
219
+ "v13.8.0",
220
+ "v13.7.0",
221
+ "v13.6.0",
222
+ "v13.5.0",
223
+ "v13.4.0",
224
+ "v13.3.0",
225
+ "v13.2.0",
226
+ "v13.1.0",
227
+ "v13.0.1",
228
+ "v13.0.0",
229
+ "v12.22.12",
230
+ "v12.22.11",
231
+ "v12.22.10",
232
+ "v12.22.9",
233
+ "v12.22.8",
234
+ "v12.22.7",
235
+ "v12.22.6",
236
+ "v12.22.5",
237
+ "v12.22.4",
238
+ "v12.22.3",
239
+ "v12.22.2",
240
+ "v12.22.1",
241
+ "v12.22.0",
242
+ "v12.21.0",
243
+ "v12.20.2",
244
+ "v12.20.1",
245
+ "v12.20.0",
246
+ "v12.19.1",
247
+ "v12.19.0",
248
+ "v12.18.4",
249
+ "v12.18.3",
250
+ "v12.18.2",
251
+ "v12.18.1",
252
+ "v12.18.0",
253
+ "v12.17.0",
254
+ "v12.16.3",
255
+ "v12.16.2",
256
+ "v12.16.1",
257
+ "v12.16.0",
258
+ "v12.15.0",
259
+ "v12.14.1",
260
+ "v12.14.0",
261
+ "v12.13.1",
262
+ "v12.13.0",
263
+ "v12.12.0",
264
+ "v12.11.1",
265
+ "v12.11.0",
266
+ "v12.10.0",
267
+ "v12.9.1",
268
+ "v12.9.0",
269
+ "v12.8.1",
270
+ "v12.8.0",
271
+ "v12.7.0",
272
+ "v12.6.0",
273
+ "v12.5.0",
274
+ "v12.4.0",
275
+ "v12.3.1",
276
+ "v12.3.0",
277
+ "v12.2.0",
278
+ "v12.1.0",
279
+ "v12.0.0",
280
+ "v11.15.0",
281
+ "v11.14.0",
282
+ "v11.13.0",
283
+ "v11.12.0",
284
+ "v11.11.0",
285
+ "v11.10.1",
286
+ "v11.10.0",
287
+ "v11.9.0",
288
+ "v11.8.0",
289
+ "v11.7.0",
290
+ "v11.6.0",
291
+ "v11.5.0",
292
+ "v11.4.0",
293
+ "v11.3.0",
294
+ "v11.2.0",
295
+ "v11.1.0",
296
+ "v11.0.0",
297
+ "v10.24.1",
298
+ "v10.24.0",
299
+ "v10.23.3",
300
+ "v10.23.2",
301
+ "v10.23.1",
302
+ "v10.23.0",
303
+ "v10.22.1",
304
+ "v10.22.0",
305
+ "v10.21.0",
306
+ "v10.20.1",
307
+ "v10.20.0",
308
+ "v10.19.0",
309
+ "v10.18.1",
310
+ "v10.18.0",
311
+ "v10.17.0",
312
+ "v10.16.3",
313
+ "v10.16.2",
314
+ "v10.16.1",
315
+ "v10.16.0",
316
+ "v10.15.3",
317
+ "v10.15.2",
318
+ "v10.15.1",
319
+ "v10.15.0",
320
+ "v10.14.2",
321
+ "v10.14.1",
322
+ "v10.14.0",
323
+ "v10.13.0",
324
+ "v10.12.0",
325
+ "v10.11.0",
326
+ "v10.10.0",
327
+ "v10.9.0",
328
+ "v10.8.0",
329
+ "v10.7.0",
330
+ "v10.6.0",
331
+ "v10.5.0",
332
+ "v10.4.1",
333
+ "v10.4.0",
334
+ "v10.3.0",
335
+ "v10.2.1",
336
+ "v10.2.0",
337
+ "v10.1.0",
338
+ "v10.0.0",
339
+ "v9.11.2",
340
+ "v9.11.1",
341
+ "v9.11.0",
342
+ "v9.10.1",
343
+ "v9.10.0",
344
+ "v9.9.0",
345
+ "v9.8.0",
346
+ "v9.7.1",
347
+ "v9.7.0",
348
+ "v9.6.1",
349
+ "v9.6.0",
350
+ "v9.5.0",
351
+ "v9.4.0",
352
+ "v9.3.0",
353
+ "v9.2.1",
354
+ "v9.2.0",
355
+ "v9.1.0",
356
+ "v9.0.0",
357
+ "v8.17.0",
358
+ "v8.16.2",
359
+ "v8.16.1",
360
+ "v8.16.0",
361
+ "v8.15.1",
362
+ "v8.15.0",
363
+ "v8.14.1",
364
+ "v8.14.0",
365
+ "v8.13.0",
366
+ "v8.12.0",
367
+ "v8.11.4",
368
+ "v8.11.3",
369
+ "v8.11.2",
370
+ "v8.11.1",
371
+ "v8.11.0",
372
+ "v8.10.0",
373
+ "v8.9.4",
374
+ "v8.9.3",
375
+ "v8.9.2",
376
+ "v8.9.1",
377
+ "v8.9.0",
378
+ "v8.8.1",
379
+ "v8.8.0",
380
+ "v8.7.0",
381
+ "v8.6.0",
382
+ "v8.5.0",
383
+ "v8.4.0",
384
+ "v8.3.0",
385
+ "v8.2.1",
386
+ "v8.2.0",
387
+ "v8.1.4",
388
+ "v8.1.3",
389
+ "v8.1.2",
390
+ "v8.1.1",
391
+ "v8.1.0",
392
+ "v8.0.0",
393
+ "v7.10.1",
394
+ "v7.10.0",
395
+ "v7.9.0",
396
+ "v7.8.0",
397
+ "v7.7.4",
398
+ "v7.7.3",
399
+ "v7.7.2",
400
+ "v7.7.1",
401
+ "v7.7.0",
402
+ "v7.6.0",
403
+ "v7.5.0",
404
+ "v7.4.0",
405
+ "v7.3.0",
406
+ "v7.2.1",
407
+ "v7.2.0",
408
+ "v7.1.0",
409
+ "v7.0.0",
410
+ "v6.17.1",
411
+ "v6.17.0",
412
+ "v6.16.0",
413
+ "v6.15.1",
414
+ "v6.15.0",
415
+ "v6.14.4",
416
+ "v6.14.3",
417
+ "v6.14.2",
418
+ "v6.14.1",
419
+ "v6.14.0",
420
+ "v6.13.1",
421
+ "v6.13.0",
422
+ "v6.12.3",
423
+ "v6.12.2",
424
+ "v6.12.1",
425
+ "v6.12.0",
426
+ "v6.11.5",
427
+ "v6.11.4",
428
+ "v6.11.3",
429
+ "v6.11.2",
430
+ "v6.11.1",
431
+ "v6.11.0",
432
+ "v6.10.3",
433
+ "v6.10.2",
434
+ "v6.10.1",
435
+ "v6.10.0",
436
+ "v6.9.5",
437
+ "v6.9.4",
438
+ "v6.9.3",
439
+ "v6.9.2",
440
+ "v6.9.1",
441
+ "v6.9.0",
442
+ "v6.8.1",
443
+ "v6.8.0",
444
+ "v6.7.0",
445
+ "v6.6.0",
446
+ "v6.5.0",
447
+ "v6.4.0",
448
+ "v6.3.1",
449
+ "v6.3.0",
450
+ "v6.2.2",
451
+ "v6.2.1",
452
+ "v6.2.0",
453
+ "v6.1.0",
454
+ "v6.0.0",
455
+ "v5.12.0",
456
+ "v5.11.1",
457
+ "v5.11.0",
458
+ "v5.10.1",
459
+ "v5.10.0",
460
+ "v5.9.1",
461
+ "v5.9.0",
462
+ "v5.8.0",
463
+ "v5.7.1",
464
+ "v5.7.0",
465
+ "v5.6.0",
466
+ "v5.5.0",
467
+ "v5.4.1",
468
+ "v5.4.0",
469
+ "v5.3.0",
470
+ "v5.2.0",
471
+ "v5.1.1",
472
+ "v5.1.0",
473
+ "v5.0.0",
474
+ "v4.9.1",
475
+ "v4.9.0",
476
+ "v4.8.7",
477
+ "v4.8.6",
478
+ "v4.8.5",
479
+ "v4.8.4",
480
+ "v4.8.3",
481
+ "v4.8.2",
482
+ "v4.8.1",
483
+ "v4.8.0",
484
+ "v4.7.3",
485
+ "v4.7.2",
486
+ "v4.7.1",
487
+ "v4.7.0",
488
+ "v4.6.2",
489
+ "v4.6.1",
490
+ "v4.6.0",
491
+ "v4.5.0",
492
+ "v4.4.7",
493
+ "v4.4.6",
494
+ "v4.4.5",
495
+ "v4.4.4",
496
+ "v4.4.3",
497
+ "v4.4.2",
498
+ "v4.4.1",
499
+ "v4.4.0",
500
+ "v4.3.2",
501
+ "v4.3.1",
502
+ "v4.3.0",
503
+ "v4.2.6",
504
+ "v4.2.5",
505
+ "v4.2.4",
506
+ "v4.2.3",
507
+ "v4.2.2",
508
+ "v4.2.1",
509
+ "v4.2.0",
510
+ "v4.1.2",
511
+ "v4.1.1",
512
+ "v4.1.0",
513
+ "v4.0.0",
514
+ "v0.12.18",
515
+ "v0.12.17",
516
+ "v0.12.16",
517
+ "v0.12.15",
518
+ "v0.12.14",
519
+ "v0.12.13",
520
+ "v0.12.12",
521
+ "v0.12.11",
522
+ "v0.12.10",
523
+ "v0.12.9",
524
+ "v0.12.8",
525
+ "v0.12.7",
526
+ "v0.12.6",
527
+ "v0.12.5",
528
+ "v0.12.4",
529
+ "v0.12.3",
530
+ "v0.12.2",
531
+ "v0.12.1",
532
+ "v0.12.0",
533
+ "v0.11.16",
534
+ "v0.11.15",
535
+ "v0.11.14",
536
+ "v0.11.13",
537
+ "v0.11.12",
538
+ "v0.11.11",
539
+ "v0.11.10",
540
+ "v0.11.9",
541
+ "v0.11.8",
542
+ "v0.11.7",
543
+ "v0.11.6",
544
+ "v0.11.5",
545
+ "v0.11.4",
546
+ "v0.11.3",
547
+ "v0.11.2",
548
+ "v0.11.1",
549
+ "v0.11.0",
550
+ "v0.10.48",
551
+ "v0.10.47",
552
+ "v0.10.46",
553
+ "v0.10.45",
554
+ "v0.10.44",
555
+ "v0.10.43",
556
+ "v0.10.42",
557
+ "v0.10.41",
558
+ "v0.10.40",
559
+ "v0.10.39",
560
+ "v0.10.38",
561
+ "v0.10.37",
562
+ "v0.10.36",
563
+ "v0.10.35",
564
+ "v0.10.34",
565
+ "v0.10.33",
566
+ "v0.10.32",
567
+ "v0.10.31",
568
+ "v0.10.30",
569
+ "v0.10.29",
570
+ "v0.10.28",
571
+ "v0.10.27",
572
+ "v0.10.26",
573
+ "v0.10.25",
574
+ "v0.10.24",
575
+ "v0.10.23",
576
+ "v0.10.22",
577
+ "v0.10.21",
578
+ "v0.10.20",
579
+ "v0.10.19",
580
+ "v0.10.18",
581
+ "v0.10.17",
582
+ "v0.10.16",
583
+ "v0.10.15",
584
+ "v0.10.14",
585
+ "v0.10.13",
586
+ "v0.10.12",
587
+ "v0.10.11",
588
+ "v0.10.10",
589
+ "v0.10.9",
590
+ "v0.10.8",
591
+ "v0.10.7",
592
+ "v0.10.6",
593
+ "v0.10.5",
594
+ "v0.10.4",
595
+ "v0.10.3",
596
+ "v0.10.2",
597
+ "v0.10.1",
598
+ "v0.10.0",
599
+ "v0.9.12",
600
+ "v0.9.11",
601
+ "v0.9.10",
602
+ "v0.9.9",
603
+ "v0.9.8",
604
+ "v0.9.7",
605
+ "v0.9.6",
606
+ "v0.9.5",
607
+ "v0.9.4",
608
+ "v0.9.3",
609
+ "v0.9.2",
610
+ "v0.9.1",
611
+ "v0.9.0",
612
+ "v0.8.28",
613
+ "v0.8.27",
614
+ "v0.8.26",
615
+ "v0.8.25",
616
+ "v0.8.24",
617
+ "v0.8.23",
618
+ "v0.8.22",
619
+ "v0.8.21",
620
+ "v0.8.20",
621
+ "v0.8.19",
622
+ "v0.8.18",
623
+ "v0.8.17",
624
+ "v0.8.16",
625
+ "v0.8.15",
626
+ "v0.8.14",
627
+ "v0.8.13",
628
+ "v0.8.12",
629
+ "v0.8.11",
630
+ "v0.8.10",
631
+ "v0.8.9",
632
+ "v0.8.8",
633
+ "v0.8.7",
634
+ "v0.8.6",
635
+ "v0.8.5",
636
+ "v0.8.4",
637
+ "v0.8.3",
638
+ "v0.8.2",
639
+ "v0.8.1",
640
+ "v0.8.0",
641
+ "v0.7.12",
642
+ "v0.7.11",
643
+ "v0.7.10",
644
+ "v0.7.9",
645
+ "v0.7.8",
646
+ "v0.7.7",
647
+ "v0.7.6",
648
+ "v0.7.5",
649
+ "v0.7.4",
650
+ "v0.7.3",
651
+ "v0.7.2",
652
+ "v0.7.1",
653
+ "v0.7.0",
654
+ "v0.6.21",
655
+ "v0.6.20",
656
+ "v0.6.19",
657
+ "v0.6.18",
658
+ "v0.6.17",
659
+ "v0.6.16",
660
+ "v0.6.15",
661
+ "v0.6.14",
662
+ "v0.6.13",
663
+ "v0.6.12",
664
+ "v0.6.11",
665
+ "v0.6.10",
666
+ "v0.6.9",
667
+ "v0.6.8",
668
+ "v0.6.7",
669
+ "v0.6.6",
670
+ "v0.6.5",
671
+ "v0.6.4",
672
+ "v0.6.3",
673
+ "v0.6.2",
674
+ "v0.6.1",
675
+ "v0.6.0",
676
+ "v0.5.10",
677
+ "v0.5.9",
678
+ "v0.5.8",
679
+ "v0.5.7",
680
+ "v0.5.6",
681
+ "v0.5.5",
682
+ "v0.5.4",
683
+ "v0.5.3",
684
+ "v0.5.2",
685
+ "v0.5.1",
686
+ "v0.5.0",
687
+ "v0.4.12",
688
+ "v0.4.11",
689
+ "v0.4.10",
690
+ "v0.4.9",
691
+ "v0.4.8",
692
+ "v0.4.7",
693
+ "v0.4.6",
694
+ "v0.4.5",
695
+ "v0.4.4",
696
+ "v0.4.3",
697
+ "v0.4.2",
698
+ "v0.4.1",
699
+ "v0.4.0",
700
+ "v0.3.8",
701
+ "v0.3.7",
702
+ "v0.3.6",
703
+ "v0.3.5",
704
+ "v0.3.4",
705
+ "v0.3.3",
706
+ "v0.3.2",
707
+ "v0.3.1",
708
+ "v0.3.0",
709
+ "v0.2.6",
710
+ "v0.2.5",
711
+ "v0.2.4",
712
+ "v0.2.3",
713
+ "v0.2.2",
714
+ "v0.2.1",
715
+ "v0.2.0",
716
+ "v0.1.104",
717
+ "v0.1.103",
718
+ "v0.1.102",
719
+ "v0.1.101",
720
+ "v0.1.100",
721
+ "v0.1.99",
722
+ "v0.1.98",
723
+ "v0.1.97",
724
+ "v0.1.96",
725
+ "v0.1.95",
726
+ "v0.1.94",
727
+ "v0.1.93",
728
+ "v0.1.92",
729
+ "v0.1.91",
730
+ "v0.1.90",
731
+ "v0.1.33",
732
+ "v0.1.32",
733
+ "v0.1.31",
734
+ "v0.1.30",
735
+ "v0.1.29",
736
+ "v0.1.28",
737
+ "v0.1.27",
738
+ "v0.1.26",
739
+ "v0.1.25",
740
+ "v0.1.24",
741
+ "v0.1.23",
742
+ "v0.1.22",
743
+ "v0.1.21",
744
+ "v0.1.20",
745
+ "v0.1.19",
746
+ "v0.1.18",
747
+ "v0.1.17",
748
+ "v0.1.16",
749
+ "v0.1.15",
750
+ "v0.1.14"
751
+ ]
package/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export const nodeVersions: readonly string[];
2
+ export function getEnginesNodeVersions(engines: string, options?: Options | undefined): string[];
3
+ export function getPackageNodeVersions(path: string, options?: Options | undefined): Promise<string[]>;
4
+ export type Options = {
5
+ majorsOnly?: boolean | undefined;
6
+ };
7
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.js"],"names":[],"mappings":";AAkBiC,gDAJtB,MAAM,kCAEJ,MAAM,EAAE,CAoBpB;AAOgC,6CAJtB,MAAM,kCAEJ,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ7B"}
package/index.js ADDED
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const { loadPackage } = require('./lib/load-package');
4
+ const possibleNodeVersions = require('./data/versions.json');
5
+ const semver = require('semver');
6
+
7
+ /**
8
+ * @typedef {object} Options
9
+ * @property {boolean} [majorsOnly]
10
+ */
11
+
12
+ exports.nodeVersions = Object.freeze(possibleNodeVersions);
13
+
14
+ /**
15
+ * @param {string} engines
16
+ * @param {Options} [options]
17
+ * @returns {string[]}
18
+ */
19
+ exports.getEnginesNodeVersions = function getEnginesNodeVersions(engines, options = {}) {
20
+ if (typeof engines !== 'string' || !semver.validRange(engines)) {
21
+ return [];
22
+ }
23
+
24
+ const supportedNodeVersions = possibleNodeVersions.filter((version) =>
25
+ semver.satisfies(version, engines)
26
+ );
27
+
28
+ // Flag to only return the major versions
29
+ if (options.majorsOnly) {
30
+ const majorVersions = new Set(
31
+ supportedNodeVersions.map((version) => `${semver.major(version)}`)
32
+ );
33
+ return [...majorVersions];
34
+ }
35
+
36
+ return supportedNodeVersions;
37
+ };
38
+
39
+ /**
40
+ * @param {string} path
41
+ * @param {Options} [options]
42
+ * @returns {Promise<string[]>}
43
+ */
44
+ exports.getPackageNodeVersions = async function getPackageNodeVersions(path, options) {
45
+ const packageJson = await loadPackage(path);
46
+ if (typeof packageJson.engines?.node !== 'string') {
47
+ return [];
48
+ }
49
+ return exports.getEnginesNodeVersions(packageJson.engines.node, options);
50
+ };
@@ -0,0 +1,2 @@
1
+ export function fetchNodeVersions(): Promise<string[]>;
2
+ //# sourceMappingURL=fetch-node-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-node-versions.d.ts","sourceRoot":"","sources":["fetch-node-versions.js"],"names":[],"mappings":"AAW4B,qCAFf,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB7B"}
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ const assert = require('node:assert/strict');
4
+ const pkg = require('../package.json');
5
+
6
+ const versionsEndpoint = 'https://nodejs.org/dist/index.json';
7
+ const userAgent = `npm:${pkg.name}/${pkg.version} (${pkg.homepage})`;
8
+
9
+ /**
10
+ * @returns {Promise<string[]>}
11
+ */
12
+ exports.fetchNodeVersions = async function fetchNodeVersions() {
13
+ const response = await fetch(versionsEndpoint, {
14
+ headers: { 'user-agent': userAgent }
15
+ });
16
+ const versions = await response.json();
17
+
18
+ // Validate the version data
19
+ assert.ok(Array.isArray(versions), 'versions are not an array');
20
+ for (const [key, value] of Object.entries(versions)) {
21
+ assert.ok(value, `version (index ${key}) is not an object`);
22
+ assert.equal(typeof value, 'object', `version (index ${key}) is not an object`);
23
+ assert.notEqual(Array.isArray(value), `version (index ${key}) is not an object`);
24
+ assert.equal(
25
+ typeof value?.version,
26
+ 'string',
27
+ `version (index ${key}) has a non-string "version" property`
28
+ );
29
+ }
30
+
31
+ return versions.map(({ version }) => version);
32
+ };
@@ -0,0 +1,2 @@
1
+ export function loadPackage(path: string): Promise<PackageJson.Content>;
2
+ //# sourceMappingURL=load-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-package.d.ts","sourceRoot":"","sources":["load-package.js"],"names":[],"mappings":"AAQsB,kCAHX,MAAM,GACJ,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAsBxC"}
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const PackageJson = require('@npmcli/package-json');
4
+
5
+ /**
6
+ * @param {string} path
7
+ * @returns {Promise<PackageJson.Content>}
8
+ */
9
+ exports.loadPackage = async function loadPackage(path) {
10
+ try {
11
+ const pkg = await PackageJson.load(path);
12
+ return pkg.content;
13
+ } catch (/** @type {any} */ cause) {
14
+ if (cause.code === 'ENOENT') {
15
+ throw Object.assign(new Error(`No package.json file found at ${path}`, { cause }), {
16
+ code: 'PACKAGE_JSON_MISSING'
17
+ });
18
+ }
19
+ if (cause.code === 'EJSONPARSE') {
20
+ throw Object.assign(
21
+ new Error(`Invalid package.json file found at ${path}`, { cause }),
22
+ {
23
+ code: 'PACKAGE_JSON_INVALID'
24
+ }
25
+ );
26
+ }
27
+ throw cause;
28
+ }
29
+ };
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@rowanmanning/node-versions",
3
+ "version": "1.0.0",
4
+ "description": "Get the Node.js versions that a repo says it supports",
5
+ "keywords": [],
6
+ "author": "Rowan Manning (https://rowanmanning.com/)",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/rowanmanning/repo-tools.git",
10
+ "directory": "packages/node-versions"
11
+ },
12
+ "homepage": "https://github.com/rowanmanning/repo-tools/tree/main/packages/node-versions#readme",
13
+ "bugs": "https://github.com/rowanmanning/repo-tools/issues",
14
+ "license": "MIT",
15
+ "engines": {
16
+ "node": "18.x || 20.x || 22.x"
17
+ },
18
+ "scripts": {
19
+ "fetch-versions": "node ./scripts/fetch-node-versions.js",
20
+ "postinstall": "node ./scripts/fetch-node-versions.js || true"
21
+ },
22
+ "main": "index.js",
23
+ "dependencies": {
24
+ "@npmcli/package-json": "^5.2.0",
25
+ "semver": "^7.6.3"
26
+ }
27
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fetch-node-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-node-versions.d.ts","sourceRoot":"","sources":["fetch-node-versions.js"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
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');
8
+
9
+ async function runScript() {
10
+ const versions = await fetchNodeVersions();
11
+ await writeFile(filePath, `${JSON.stringify(versions, null, '\t')}\n`);
12
+ }
13
+
14
+ runScript().catch((error) => {
15
+ // biome-ignore lint/nursery/noConsole: required for debugging this script
16
+ console.error(error.stack);
17
+ process.exitCode = 1;
18
+ });