Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I programmatically check the release status of the installed node.js version?

I want to include a check in a setup script that validates the installed node.js version is LTS. Something like this would be ideal

$ node -vvv
v16.3.0
Release v16
Status Active LTS
Codename Gallium
Initial Release 2021-04-20
Active LTS Start 2021-10-26
Maintenance LTS Start 2022-10-18
End-Of-Life 2024-04-30

Basically some way to get the information available on https://nodejs.org/en/about/releases/ but in a script. If there's some HTTP endpoint that provides this stuff in JSON that would work too.

I've looked through available options in the node, npm, nvm, and yarn CLI tools but none of them seem like they can do this.

like image 330
Scott Wyman Neagle Avatar asked Sep 03 '25 03:09

Scott Wyman Neagle


1 Answers

One source of JSON info about nodejs releases is this endpoint:

https://nodejs.org/download/release/index.json

There, you get an array of objects that each look like this:

{
    version: 'v16.14.1',
    date: '2022-03-16',
    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'
    ],
    npm: '8.5.0',
    v8: '9.4.146.24',
    uv: '1.43.0',
    zlib: '1.2.11',
    openssl: '1.1.1m+quic',
    modules: '93',
    lts: 'Gallium',
    security: false
},

If you filter that array by the lts property (any value other than false) and then sort by version, you will find the latest LTS release version and you can compare that to what is installed locally.

Here's a piece of nodejs code that gets that JSON, filters out items that aren't lts, then sorts by version. The top of the resulting array will be the latest LTS release version number. You could then programmatically compare that to what is installed locally. You could either just use process.version from within this script or you could run a child_process that captures the output from node -v.

import got from 'got';

// 'v10.16.3'
let versionRegex = /v(\d+)\.(\d+)\.(\d+)/;

// convert version string to a number for easier sorting
function calcVersion(x) {
    const match = x.match(versionRegex);
    if (!match) {
        throw new Error(`version regex failed to match version string '${x}'`);
    }
    return (+match[1] * 1000000) + (+match[2] * 1000) + (+match[3]);
}

const data = await got("https://nodejs.org/download/release/index.json").json();
const lts = data.filter(item => item.lts);

// for performance reasons when sorting,
// precalculate an actual version number from the version string
lts.forEach(item => item.numVersion = calcVersion(item.version));
lts.sort((a, b) => b.numVersion - a.numVersion);

console.log("All LTS versions - sorted newest first");
console.log(lts.map(item => item.version));

console.log("Info about newest LTS version");
console.log(lts[0]);
console.log(`Newest LTS version: ${lts[0].version}`);
console.log(`Local version: ${process.version}`);

When I run this on my system at this moment, I get this output:

All LTS versions - sorted newest first
[
  'v16.14.1',  'v16.14.0',  'v16.13.2', 'v16.13.1', 'v16.13.0',
  'v14.19.0',  'v14.18.3',  'v14.18.2', 'v14.18.1', 'v14.18.0',
  'v14.17.6',  'v14.17.5',  'v14.17.4', 'v14.17.3', 'v14.17.2',
  'v14.17.1',  'v14.17.0',  'v14.16.1', 'v14.16.0', 'v14.15.5',
  'v14.15.4',  'v14.15.3',  'v14.15.2', 'v14.15.1', 'v14.15.0',
  'v12.22.11', 'v12.22.10', 'v12.22.9', 'v12.22.8', 'v12.22.7',
  'v12.22.6',  'v12.22.5',  'v12.22.4', 'v12.22.3', 'v12.22.2',
  'v12.22.1',  'v12.22.0',  'v12.21.0', 'v12.20.2', 'v12.20.1',
  'v12.20.0',  'v12.19.1',  'v12.19.0', 'v12.18.4', 'v12.18.3',
  'v12.18.2',  'v12.18.1',  'v12.18.0', 'v12.17.0', 'v12.16.3',
  'v12.16.2',  'v12.16.1',  'v12.16.0', 'v12.15.0', 'v12.14.1',
  'v12.14.0',  'v12.13.1',  'v12.13.0', 'v10.24.1', 'v10.24.0',
  'v10.23.3',  'v10.23.2',  'v10.23.1', 'v10.23.0', 'v10.22.1',
  'v10.22.0',  'v10.21.0',  'v10.20.1', 'v10.20.0', 'v10.19.0',
  'v10.18.1',  'v10.18.0',  'v10.17.0', 'v10.16.3', 'v10.16.2',
  'v10.16.1',  'v10.16.0',  'v10.15.3', 'v10.15.2', 'v10.15.1',
  'v10.15.0',  'v10.14.2',  'v10.14.1', 'v10.14.0', 'v10.13.0',
  'v8.17.0',   'v8.16.2',   'v8.16.1',  'v8.16.0',  'v8.15.1',
  'v8.15.0',   'v8.14.1',   'v8.14.0',  'v8.13.0',  'v8.12.0',
  'v8.11.4',   'v8.11.3',   'v8.11.2',  'v8.11.1',  'v8.11.0',
  ... 74 more items
]
Info about newest LTS version
{
  version: 'v16.14.1',
  date: '2022-03-16',
  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'
  ],
  npm: '8.5.0',
  v8: '9.4.146.24',
  uv: '1.43.0',
  zlib: '1.2.11',
  openssl: '1.1.1m+quic',
  modules: '93',
  lts: 'Gallium',
  security: false,
  numVersion: 16014001
}
Newest LTS version: v16.14.1
Local version: v16.13.2
like image 90
jfriend00 Avatar answered Sep 04 '25 23:09

jfriend00