@mandors/cli 0.0.17 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/npm/lib/install.js +36 -20
- package/package.json +1 -1
package/npm/lib/install.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Post-install hook for Mandor CLI
|
|
3
3
|
* @description Downloads binary from GitHub releases during npm install
|
|
4
|
-
* @version 0.0.
|
|
4
|
+
* @version 0.0.4
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const fs = require('fs');
|
|
8
8
|
const path = require('path');
|
|
9
9
|
const os = require('os');
|
|
10
10
|
const { execSync } = require('child_process');
|
|
11
|
+
const https = require('https');
|
|
11
12
|
|
|
12
13
|
const REPO = 'sanxzy/mandor';
|
|
13
14
|
const GITHUB_API = 'https://api.github.com';
|
|
@@ -29,13 +30,39 @@ async function getLatestVersion(prerelease = false) {
|
|
|
29
30
|
? `${GITHUB_API}/repos/${REPO}/releases`
|
|
30
31
|
: `${GITHUB_API}/repos/${REPO}/releases/latest`;
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
https.get(url, { headers: { 'User-Agent': 'Mandor-CLI' } }, (res) => {
|
|
35
|
+
let data = '';
|
|
36
|
+
res.on('data', chunk => data += chunk);
|
|
37
|
+
res.on('end', () => {
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(data);
|
|
40
|
+
const tagName = Array.isArray(parsed) ? parsed[0].tag_name : parsed.tag_name;
|
|
41
|
+
resolve(tagName.replace(/^v/, ''));
|
|
42
|
+
} catch (e) {
|
|
43
|
+
reject(e);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}).on('error', reject);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function downloadFile(url, dest) {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const file = fs.createWriteStream(dest);
|
|
53
|
+
https.get(url, (res) => {
|
|
54
|
+
if (res.statusCode === 302 || res.statusCode === 301) {
|
|
55
|
+
return downloadFile(res.headers.location, dest).then(resolve).catch(reject);
|
|
56
|
+
}
|
|
57
|
+
res.pipe(file);
|
|
58
|
+
file.on('finish', () => {
|
|
59
|
+
file.close(resolve);
|
|
60
|
+
});
|
|
61
|
+
}).on('error', (err) => {
|
|
62
|
+
fs.unlink(dest, () => {});
|
|
63
|
+
reject(err);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
39
66
|
}
|
|
40
67
|
|
|
41
68
|
async function install(options = {}) {
|
|
@@ -71,18 +98,7 @@ async function install(options = {}) {
|
|
|
71
98
|
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mandor-install-'));
|
|
72
99
|
const tarball = path.join(tempDir, assetName);
|
|
73
100
|
|
|
74
|
-
|
|
75
|
-
if (!response.ok) {
|
|
76
|
-
fs.rmSync(tempDir, { recursive: true });
|
|
77
|
-
throw new Error(`Download failed: ${response.statusText} (${downloadUrl})`);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const file = fs.createWriteStream(tarball);
|
|
81
|
-
await new Promise((resolve, reject) => {
|
|
82
|
-
response.body.pipe(file);
|
|
83
|
-
file.on('finish', resolve);
|
|
84
|
-
file.on('error', reject);
|
|
85
|
-
});
|
|
101
|
+
await downloadFile(downloadUrl, tarball);
|
|
86
102
|
|
|
87
103
|
if (!fs.existsSync(cachePath)) {
|
|
88
104
|
fs.mkdirSync(cachePath, { recursive: true });
|