refactor: finish moving ssh-* scripts to own installers
[webi-installers/.git] / node / releases.js
1 'use strict';
2
3 // Map from node conventions to webinstall conventions
4 var map = {
5   // OSes
6   osx: 'macos',
7   linux: 'linux',
8   win: 'windows', // windows
9   sunos: 'sunos',
10   aix: 'aix',
11   // CPU architectures
12   x64: 'amd64',
13   x86: 'x86',
14   ppc64: 'ppc64',
15   ppc64le: 'ppc64le',
16   arm64: 'arm64',
17   armv7l: 'armv7l',
18   armv6l: 'armv6l',
19   s390x: 's390x',
20   // file extensions
21   pkg: 'pkg',
22   exe: 'exe',
23   msi: 'msi',
24   '7z': '7z',
25   zip: 'zip',
26   tar: 'tar.gz'
27 };
28
29 function getAllReleases(request) {
30   return request({
31     url: 'https://nodejs.org/dist/index.json',
32     json: true
33   }).then(function (resp) {
34     var rels = resp.body;
35     var all = {
36       releases: [],
37       download: '' // node's download URLs are unpredictable
38     };
39
40     // https://blog.risingstack.com/update-nodejs-8-end-of-life-no-support/
41     // 6 mos "current" + 18 mos LTS "active" +  12 mos LTS "maintenance"
42     //var endOfLife = 3 * 366 * 24 * 60 * 60 * 1000;
43     // If there have been no updates in 12 months, it's almost certainly end-of-life
44     var endOfLife = 366 * 24 * 60 * 60 * 1000;
45
46     rels.forEach(function (rel) {
47       if (Date.now() - new Date(rel.date).valueOf() > endOfLife) {
48         return;
49       }
50       rel.files.forEach(function (file) {
51         if ('src' === file || 'headers' === file) {
52           return;
53         }
54         var parts = file.split(/-/);
55         var os = map[parts[0]];
56         if (!os) {
57           console.warn('node versions: unknown os "%s"', parts[0]);
58         }
59         var arch = map[parts[1]];
60         if (!arch) {
61           console.warn('node versions: unknown arch "%s"', parts[1]);
62         }
63         var ext = map[parts[2] || 'tar'];
64         if (!ext) {
65           console.warn('node versions: unknown ext "%s"', parts[2]);
66         }
67         if ('exe' === ext) {
68           // node exe files are not self-extracting installers
69           return;
70         }
71
72         var even = 0 === rel.version.slice(1).split('.')[0] % 2;
73         var r = {
74           // nix leading 'v'
75           version: rel.version.slice(1),
76           date: rel.date,
77           lts: !!rel.lts,
78           // historically odd releases have been beta and even have been stable
79           channel: even ? 'stable' : 'beta',
80           os: os,
81           arch: arch,
82           ext: ext,
83           //sha1: '',
84           // See https://nodejs.org/dist/v14.0.0/
85           // usually like https://nodejs.org/dist/v14.0.0/node-{version}-{plat}-{arch}.{ext}
86           download:
87             'https://nodejs.org/dist/' + rel.version + '/node-' + rel.version
88         };
89         all.releases.push(r);
90
91         // handle all the special cases (which there are many)
92         if ('pkg' === ext) {
93           r.download += '.pkg';
94           return;
95         }
96         if ('msi' === ext) {
97           if ('amd64' === arch) {
98             r.download += '-x64.msi';
99           } else {
100             r.download += '-x86.msi';
101           }
102           return;
103         }
104
105         if ('macos' === os) {
106           r.download += '-darwin';
107         } else if ('windows' === os) {
108           r.download += '-win';
109         } else {
110           r.download += '-' + os;
111         }
112
113         if ('amd64' === arch) {
114           r.download += '-x64';
115         } else {
116           r.download += '-' + arch;
117         }
118
119         if ('aix' === os) {
120           r.download += '.tar.gz';
121           return;
122         }
123
124         r.download += '.' + ext;
125
126         if ('tar.gz' === ext) {
127           r.download = r.download.replace(/\.tar\.gz$/, '.tar.xz');
128           r.ext = 'tar.xz';
129           all.releases.push(JSON.parse(JSON.stringify(r)));
130           r.download = r.download.replace(/\.tar\.xz$/, '.tar.gz');
131           r.ext = 'tar.gz';
132         }
133       });
134     });
135
136     return all;
137   });
138 }
139 module.exports = getAllReleases;
140
141 if (module === require.main) {
142   getAllReleases(require('@root/request')).then(function (all) {
143     all = require('../_webi/normalize.js')(all);
144     console.info(JSON.stringify(all));
145     //console.info(JSON.stringify(all, null, 2));
146   });
147 }