From 34108d730f848b031346d20f8901e2184e9c04c4 Mon Sep 17 00:00:00 2001 From: Wes Todd Date: Thu, 11 Sep 2025 11:55:47 -0500 Subject: [PATCH] feat: add isSupported, isMaintenance, isSecurity, and modules --- index.d.ts | 4 ++++ index.js | 44 +++++++++++++++++++++++++++++++++----------- index.test-d.ts | 4 ++++ test/index.js | 11 +++++++++++ 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/index.d.ts b/index.d.ts index 4ebaaff..372edd0 100644 --- a/index.d.ts +++ b/index.d.ts @@ -19,6 +19,10 @@ interface VersionInfo { end?: Date; releaseDate: Date; isLts: boolean; + isSupported: boolean; + isMaintenance: boolean; + isSecurity: boolean; + modules: string; files: string[]; dependencies: { npm: string, diff --git a/index.js b/index.js index 453ffdf..c2c8671 100644 --- a/index.js +++ b/index.js @@ -10,7 +10,11 @@ module.exports = async function (alias = 'lts_active', opts = {}) { const latestOfMajorOnly = opts.latestOfMajorOnly || false const a = Array.isArray(alias) ? alias : [alias] - const versions = await getLatestVersionsByCodename(now, cache, mirror) + const versions = await getLatestVersionsByCodename({ + now, + cache, + mirror + }) // Reduce to an object let m = a.reduce((m, a) => { @@ -70,7 +74,7 @@ function getVersions (cache, mirror) { }).json() } -async function getLatestVersionsByCodename (now, cache, mirror) { +async function getLatestVersionsByCodename ({ now, cache, mirror }) { const schedule = await getSchedule(cache) const versions = await getVersions(cache, mirror) @@ -102,6 +106,10 @@ async function getLatestVersionsByCodename (now, cache, mirror) { end: s && s.end && new Date(s.end), releaseDate: new Date(ver.date), isLts: false, + isSupported: false, + isMaintenance: false, + isSecurity: ver.security, + modules: ver.modules, files: ver.files || [], dependencies: { npm: ver.npm, @@ -112,30 +120,38 @@ async function getLatestVersionsByCodename (now, cache, mirror) { } } - // All versions get added to all - obj.all.push(v) + // Is in any supported period + if (now > v.start && now < v.end) { + v.isSupported = true - // Add specific version references - obj[v.version] = obj[`v${v.version}`] = v + // Is in maintenence period + if (now > v.maintenance) { + v.isMaintenance = true + } + + // Latest lts + if (now > v.lts) { + v.isLts = true + } + } // The new version is higher than the last stored version for this release line if (!obj[versionName] || semver.gt(ver.version, obj[versionName].version)) { // Version and codename alias obj[versionName] = obj[codename] = v - if (now > v.start && now < v.end) { + if (v.isSupported) { supported[versionName] = v - if (now < v.maintenance) { + if (!v.isMaintenance) { active[versionName] = v } // Latest lts - if (now > v.lts) { + if (v.isLts) { lts[versionName] = v - v.isLts = true - if (now < v.maintenance) { + if (!v.isMaintenance) { ltsActive[versionName] = v } @@ -151,6 +167,12 @@ async function getLatestVersionsByCodename (now, cache, mirror) { } } + // All versions get added to all + obj.all.push(v) + + // Add specific version references + obj[v.version] = obj[`v${v.version}`] = v + return obj }, { all: [] diff --git a/index.test-d.ts b/index.test-d.ts index f6d2b39..a8ce2ae 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -16,6 +16,10 @@ import assert from 'node:assert' assert(versions[0].end) assert(versions[0].releaseDate) assert(versions[0].isLts) + assert(versions[0].isSupported) + assert(versions[0].isMaintenance) + assert(versions[0].isSecurity) + assert(versions[0].modules) assert(versions[0].files) assert(versions[0].dependencies) assert(versions[0].dependencies.npm) diff --git a/test/index.js b/test/index.js index cba2ab0..516352c 100644 --- a/test/index.js +++ b/test/index.js @@ -22,6 +22,9 @@ suite('nv', () => { assert.strictEqual(versions[0].maintenance.toISOString(), '2020-05-19T00:00:00.000Z') assert.strictEqual(versions[0].end.toISOString(), '2021-04-30T00:00:00.000Z') assert.strictEqual(versions[0].isLts, true) + assert.strictEqual(versions[0].isSupported, true) + assert.strictEqual(versions[0].isMaintenance, false) + assert.strictEqual(versions[0].modules, '64') assert.deepStrictEqual(versions[0].files, [ 'aix-ppc64', 'headers', @@ -172,6 +175,14 @@ suite('nv', () => { assert.strictEqual(versions[0].major, 18) }) + test('latestOfMajorOnly with an alias', async () => { + const versions = await nv('supported', { now, latestOfMajorOnly: true }) + assert.strictEqual(versions.length, 3) + assert.strictEqual(versions[0].major, 8) + assert.strictEqual(versions[1].major, 10) + assert.strictEqual(versions[2].major, 12) + }) + test('isLts: false', async () => { const versions = await nv('0.8.0', { now }) assert.strictEqual(versions[0].major, 0)