From 2767c06c94f67101178f4fff00e20192ddf0dff2 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Tue, 28 Apr 2020 21:50:24 -0600 Subject: [PATCH] get all node releases --- node/releases.js | 145 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 node/releases.js diff --git a/node/releases.js b/node/releases.js new file mode 100644 index 0000000..c179da6 --- /dev/null +++ b/node/releases.js @@ -0,0 +1,145 @@ +'use strict'; + +// Map from node conventions to webinstall conventions +var map = { + // OSes + osx: 'macos', + linux: 'linux', + win: 'windows', + sunos: 'sunos', + aix: 'aix', + // CPU architectures + x64: 'amd64', + x86: 'x86', + ppc64: 'ppc64', + ppc64le: 'ppc64le', + arm64: 'arm64', + armv7l: 'armv7l', + armv6l: 'armv6l', + s390x: 's390x', + // file extensions + pkg: 'pkg', + exe: 'exe', + msi: 'msi', + '7z': '7z', + zip: 'zip', + tar: 'tar.gz' +}; + +function getAllReleases(request) { + return request({ + url: 'https://nodejs.org/dist/index.json', + json: true + }).then(function (resp) { + var rels = resp.body; + var all = { + releases: [], + download: '' // node's download URLs are unpredictable + }; + + // https://blog.risingstack.com/update-nodejs-8-end-of-life-no-support/ + // 6 mos "current" + 18 mos LTS "active" + 12 mos LTS "maintenance" + //var endOfLife = 3 * 366 * 24 * 60 * 60 * 1000; + // If there have been no updates in 12 months, it's almost certainly end-of-life + var endOfLife = 366 * 24 * 60 * 60 * 1000; + + rels.forEach(function (rel) { + if (Date.now() - new Date(rel.date).valueOf() > endOfLife) { + return; + } + rel.files.forEach(function (file) { + if ('src' === file || 'headers' === file) { + return; + } + var parts = file.split(/-/); + var os = map[parts[0]]; + if (!os) { + console.warn('node versions: unknown os "%s"', parts[0]); + } + var arch = map[parts[1]]; + if (!arch) { + console.warn('node versions: unknown arch "%s"', parts[1]); + } + var ext = map[parts[2] || 'tar']; + if (!ext) { + console.warn('node versions: unknown ext "%s"', parts[2]); + } + if ('exe' === ext) { + // node exe files are not self-extracting installers + return; + } + + var even = 0 === rel.version.slice(1).split('.')[0] % 2; + var r = { + version: rel.version, + date: rel.date, + lts: !!rel.lts, + // historically odd releases have been beta and even have been stable + channel: even ? 'stable' : 'beta', + os: os, + arch: arch, + ext: ext, + //sha1: '', + // See https://nodejs.org/dist/v14.0.0/ + // usually like https://nodejs.org/dist/v14.0.0/node-{version}-{plat}-{arch}.{ext} + download: + 'https://nodejs.org/dist/' + rel.version + '/node-' + rel.version + }; + all.releases.push(r); + + // handle all the special cases (which there are many) + if ('pkg' === ext) { + r.download += '.pkg'; + return; + } + if ('msi' === ext) { + if ('amd64' === arch) { + r.download += '-x64.msi'; + } else { + r.download += '-x86.msi'; + } + return; + } + + if ('macos' === os) { + r.download += '-darwin'; + } else if ('win' === os) { + r.download += '-win'; + } else { + r.download += '-' + os; + } + + if ('amd64' === arch) { + r.download += '-x64'; + } else { + r.download += '-' + arch; + } + + if ('aix' === os) { + r.download += '.tar.gz'; + return; + } + + r.download += '.' + ext; + + if ('tar.gz' === ext) { + r.download += '.xz'; + r.ext = '.tar.xz'; + all.releases.push(JSON.parse(JSON.stringify(r))); + r.download = r.download.replace(/\.xz$/, '.gz'); + r.ext = '.tar.gz'; + } + }); + }); + + return all; + }); +} +module.exports = getAllReleases; + +if (module === require.main) { + getAllReleases(require('@root/request')).then(function (all) { + console.log(JSON.stringify(all)); + //console.log(JSON.stringify(all, null, 2)); + }); +} -- 2.25.1