added go releases and refactored some common code
[webi-installers/.git] / _common / github.js
1 'use strict';
2
3 /**
4  * Gets the releases for 'ripgrep'. This function could be trimmed down and made
5  * for use with any github release.
6  *
7  * @param request
8  * @param {string} owner
9  * @param {string} repo
10  * @returns {PromiseLike<any> | Promise<any>}
11  */
12 function getAllReleases(request, owner = 'BurntSushi', repo = 'ripgrep') {
13   if (!owner) {
14     return Promise.reject('missing owner for repo');
15   }
16   if (!repo) {
17     return Promise.reject('missing repo name');
18   }
19   return request({
20     url: `https://api.github.com/repos/${owner}/${repo}/releases`,
21     json: true
22   }).then((resp) => {
23     const gHubResp = resp.body;
24     const all = {
25       releases: [],
26       // todo make this ':baseurl' + ':releasename'
27       download: ''
28     };
29
30     gHubResp.forEach((release) => {
31       release['assets'].forEach((asset) => {
32         const name = asset['name'];
33         all.releases.push({
34           version: release['tag_name'], // TODO tags aren't always semver / sensical
35           lts: /\b(lts)\b/.test(release['tag_name']),
36           channel: !release['prerelease'] ? 'stable' : 'beta',
37           date: (release['published_at'] || '').replace(/T.*/, ''),
38           os: '', // will be guessed by download filename
39           arch: '', // will be guessed by download filename
40           ext: '', // will be normalized
41           download: asset['browser_download_url']
42         });
43       });
44     });
45
46     return all;
47   });
48 }
49
50 module.exports = getAllReleases;
51
52 if (module === require.main) {
53   getAllReleases(require('@root/request'), 'BurntSushi', 'ripgrep').then(
54     function (all) {
55       console.log(JSON.stringify(all, null, 2));
56     }
57   );
58 }