refactor: finish moving ssh-* scripts to own installers
[webi-installers/.git] / _common / github.js
1 'use strict';
2
3 require('dotenv').config();
4
5 /**
6  * Gets the releases for 'ripgrep'. This function could be trimmed down and made
7  * for use with any github release.
8  *
9  * @param request
10  * @param {string} owner
11  * @param {string} repo
12  * @returns {PromiseLike<any> | Promise<any>}
13  */
14 function getAllReleases(
15   request,
16   owner,
17   repo,
18   baseurl = 'https://api.github.com'
19 ) {
20   if (!owner) {
21     return Promise.reject('missing owner for repo');
22   }
23   if (!repo) {
24     return Promise.reject('missing repo name');
25   }
26
27   var req = {
28     url: `${baseurl}/repos/${owner}/${repo}/releases`,
29     json: true
30   };
31   // TODO I really don't like global config, find a way to do better
32   if (process.env.GITHUB_USERNAME) {
33     req.auth = {
34       user: process.env.GITHUB_USERNAME,
35       pass: process.env.GITHUB_TOKEN
36     };
37   }
38
39   return request(req).then((resp) => {
40     const gHubResp = resp.body;
41     const all = {
42       releases: [],
43       // todo make this ':baseurl' + ':releasename'
44       download: ''
45     };
46
47     gHubResp.forEach((release) => {
48       release['assets'].forEach((asset) => {
49         const name = asset['name'];
50         all.releases.push({
51           name: name,
52           version: release['tag_name'], // TODO tags aren't always semver / sensical
53           lts: /(\b|_)(lts)(\b|_)/.test(release['tag_name']),
54           channel: !release['prerelease'] ? 'stable' : 'beta',
55           date: (release['published_at'] || '').replace(/T.*/, ''),
56           os: '', // will be guessed by download filename
57           arch: '', // will be guessed by download filename
58           ext: '', // will be normalized
59           download: asset['browser_download_url']
60         });
61       });
62     });
63
64     return all;
65   });
66 }
67
68 module.exports = getAllReleases;
69
70 if (module === require.main) {
71   getAllReleases(require('@root/request'), 'BurntSushi', 'ripgrep').then(
72     function (all) {
73       console.info(JSON.stringify(all, null, 2));
74     }
75   );
76 }