@sicario-labs/kode 3.3.0 → 3.3.1
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/install.js +70 -20
- package/package.json +1 -1
package/install.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const { spawnSync } = require("child_process");
|
|
2
|
-
const { existsSync, chmodSync, mkdirSync,
|
|
2
|
+
const { existsSync, chmodSync, mkdirSync, createWriteStream } = require("fs");
|
|
3
3
|
const { join } = require("path");
|
|
4
4
|
const https = require("https");
|
|
5
5
|
|
|
@@ -27,7 +27,6 @@ if (!plat || !arch) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
const binaryName = `kode-${plat.os}-${arch}${plat.ext}`;
|
|
30
|
-
const url = `https://github.com/${repo}/releases/download/v${version}/${binaryName}`;
|
|
31
30
|
const installDir = join(__dirname, "bin");
|
|
32
31
|
const binaryPath = join(installDir, `kode${plat.ext}`);
|
|
33
32
|
|
|
@@ -35,25 +34,76 @@ if (existsSync(binaryPath)) {
|
|
|
35
34
|
process.exit(0);
|
|
36
35
|
}
|
|
37
36
|
|
|
37
|
+
mkDir(installDir);
|
|
38
|
+
|
|
38
39
|
console.log(`Downloading Kode v${version} (${binaryName})...`);
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
try { chmodSync(binaryPath, 0o755); } catch {}
|
|
54
|
-
console.log(`Kode v${version} installed to ${binaryPath}`);
|
|
55
|
-
});
|
|
56
|
-
}).on("error", (err) => {
|
|
57
|
-
console.error(`Download error: ${err.message}`);
|
|
41
|
+
// Try versioned URL first, fall back to API-resolved latest URL
|
|
42
|
+
const versionedURL = `https://github.com/${repo}/releases/download/v${version}/${binaryName}`;
|
|
43
|
+
const latestURL = `https://api.github.com/repos/${repo}/releases/latest`;
|
|
44
|
+
|
|
45
|
+
download(versionedURL).catch(() => {
|
|
46
|
+
// Fallback: resolve latest release asset URL via API
|
|
47
|
+
return resolveLatestAsset(binaryName).then(download);
|
|
48
|
+
}).then(() => {
|
|
49
|
+
try { chmodSync(binaryPath, 0o755); } catch {}
|
|
50
|
+
console.log(`Kode v${version} installed to ${binaryPath}`);
|
|
51
|
+
}).catch((err) => {
|
|
52
|
+
console.error(`Download failed: ${err.message}`);
|
|
53
|
+
console.error(`Tried:\n ${versionedURL}\n (latest release via API)`);
|
|
58
54
|
process.exit(1);
|
|
59
55
|
});
|
|
56
|
+
|
|
57
|
+
function mkDir(dir) {
|
|
58
|
+
try { mkdirSync(dir, { recursive: true }); } catch {}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function download(url) {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const file = createWriteStream(binaryPath);
|
|
64
|
+
https.get(url, { headers: { "User-Agent": "kode-installer" } }, (res) => {
|
|
65
|
+
// Follow redirects manually (GitHub CDN may return 302)
|
|
66
|
+
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
67
|
+
file.close();
|
|
68
|
+
download(res.headers.location).then(resolve, reject);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (res.statusCode !== 200) {
|
|
72
|
+
file.close();
|
|
73
|
+
reject(new Error(`HTTP ${res.statusCode}`));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
res.pipe(file);
|
|
77
|
+
file.on("finish", () => { file.close(); resolve(); });
|
|
78
|
+
}).on("error", (err) => {
|
|
79
|
+
file.close();
|
|
80
|
+
reject(err);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function resolveLatestAsset(assetName) {
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
https.get(latestURL, { headers: { "User-Agent": "kode-installer", "Accept": "application/json" } }, (res) => {
|
|
88
|
+
let body = "";
|
|
89
|
+
res.on("data", (chunk) => body += chunk);
|
|
90
|
+
res.on("end", () => {
|
|
91
|
+
try {
|
|
92
|
+
const release = JSON.parse(body);
|
|
93
|
+
if (!release.assets) {
|
|
94
|
+
reject(new Error("no assets in latest release"));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const asset = release.assets.find(a => a.name === assetName);
|
|
98
|
+
if (!asset) {
|
|
99
|
+
reject(new Error(`asset ${assetName} not found in latest release`));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
resolve(asset.browser_download_url);
|
|
103
|
+
} catch (e) {
|
|
104
|
+
reject(e);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}).on("error", reject);
|
|
108
|
+
});
|
|
109
|
+
}
|