get all node releases
authorAJ ONeal <coolaj86@gmail.com>
Wed, 29 Apr 2020 03:50:24 +0000 (21:50 -0600)
committerAJ ONeal <coolaj86@gmail.com>
Wed, 29 Apr 2020 03:51:25 +0000 (21:51 -0600)
node/releases.js [new file with mode: 0644]

diff --git a/node/releases.js b/node/releases.js
new file mode 100644 (file)
index 0000000..c179da6
--- /dev/null
@@ -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));
+  });
+}