@go-task/cli 3.44.1 → 3.45.3
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/README.md +2 -2
- package/install.js +6 -0
- package/lib.js +215 -0
- package/package.json +85 -12
- package/run-task.js +6 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<a href="https://taskfile.dev">
|
|
3
|
-
<img src="website/
|
|
3
|
+
<img src="website/src/public/img/logo.svg" width="200px" height="200px" />
|
|
4
4
|
</a>
|
|
5
5
|
|
|
6
6
|
<h1>Task</h1>
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<tr>
|
|
20
20
|
<td align="center" valign="middle">
|
|
21
21
|
<a target="_blank" href="https://devowl.io">
|
|
22
|
-
<img src="/
|
|
22
|
+
<img src="https://devowl.io/wp-content/uploads/meta/favicon.webp" height="100px" title="devowl.io" />
|
|
23
23
|
</a>
|
|
24
24
|
</td>
|
|
25
25
|
</tr>
|
package/install.js
ADDED
package/lib.js
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// This file was generated by GoReleaser. DO NOT EDIT.
|
|
2
|
+
const { archives } = require("./package.json");
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const crypto = require("crypto");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const JSZip = require("jszip");
|
|
7
|
+
const tar = require("tar");
|
|
8
|
+
const axios = require("axios");
|
|
9
|
+
const { spawnSync } = require("child_process");
|
|
10
|
+
|
|
11
|
+
const getArchive = () => {
|
|
12
|
+
let target = `${process.platform}-${process.arch}`;
|
|
13
|
+
const archive = archives[target];
|
|
14
|
+
if (!archive) {
|
|
15
|
+
throw new Error(`No archive available for ${target}`);
|
|
16
|
+
}
|
|
17
|
+
return archive;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const binDir = path.join(__dirname, "bin");
|
|
21
|
+
|
|
22
|
+
async function extractTar(tarPath, binaries, dir, wrappedIn) {
|
|
23
|
+
try {
|
|
24
|
+
const filesToExtract = wrappedIn
|
|
25
|
+
? binaries.map((bin) =>
|
|
26
|
+
path.join(wrappedIn, bin).replace(/\\/g, "/"),
|
|
27
|
+
)
|
|
28
|
+
: binaries;
|
|
29
|
+
|
|
30
|
+
await tar.x({
|
|
31
|
+
file: tarPath,
|
|
32
|
+
cwd: dir,
|
|
33
|
+
filter: (path) => filesToExtract.includes(path),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// If wrapped, move files from wrapped directory to bin directory
|
|
37
|
+
if (wrappedIn) {
|
|
38
|
+
const wrappedDir = path.join(dir, wrappedIn);
|
|
39
|
+
for (const binary of binaries) {
|
|
40
|
+
const srcPath = path.join(wrappedDir, binary);
|
|
41
|
+
const destPath = path.join(dir, binary);
|
|
42
|
+
if (fs.existsSync(srcPath)) {
|
|
43
|
+
fs.renameSync(srcPath, destPath);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Clean up empty wrapped directory
|
|
47
|
+
try {
|
|
48
|
+
fs.rmSync(wrappedDir, { recursive: true, force: true });
|
|
49
|
+
} catch (err) {
|
|
50
|
+
// Ignore cleanup errors
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
console.log(`Successfully extracted ${binaries} to "${dir}"`);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
throw new Error(`Extraction failed: ${err.message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function extractZip(zipPath, binaries, dir, wrappedIn) {
|
|
61
|
+
try {
|
|
62
|
+
const zipData = fs.readFileSync(zipPath);
|
|
63
|
+
const zip = await JSZip.loadAsync(zipData);
|
|
64
|
+
|
|
65
|
+
for (const binary of binaries) {
|
|
66
|
+
const binaryPath = wrappedIn
|
|
67
|
+
? path.join(wrappedIn, binary).replace(/\\/g, "/")
|
|
68
|
+
: binary;
|
|
69
|
+
|
|
70
|
+
if (!zip.files[binaryPath]) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
`Error: ${binaryPath} does not exist in ${zipPath}`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const content = await zip.files[binaryPath].async("nodebuffer");
|
|
77
|
+
if (!fs.existsSync(dir)) {
|
|
78
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
79
|
+
}
|
|
80
|
+
const file = path.join(dir, binary);
|
|
81
|
+
fs.writeFileSync(file, content);
|
|
82
|
+
fs.chmodSync(file, "755");
|
|
83
|
+
console.log(`Successfully extracted "${binary}" to "${dir}"`);
|
|
84
|
+
}
|
|
85
|
+
} catch (err) {
|
|
86
|
+
throw new Error(`Extraction failed: ${err.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const run = async (bin) => {
|
|
91
|
+
await install();
|
|
92
|
+
if (process.platform === "win32") {
|
|
93
|
+
bin += ".exe";
|
|
94
|
+
}
|
|
95
|
+
const [, , ...args] = process.argv;
|
|
96
|
+
let result = spawnSync(path.join(binDir, bin), args, {
|
|
97
|
+
cwd: process.cwd(),
|
|
98
|
+
stdio: "inherit",
|
|
99
|
+
});
|
|
100
|
+
if (result.error) {
|
|
101
|
+
console.error(result.error);
|
|
102
|
+
}
|
|
103
|
+
return result.status;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const install = async () => {
|
|
107
|
+
try {
|
|
108
|
+
let archive = getArchive();
|
|
109
|
+
if (await exists(archive)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let tmp = fs.mkdtempSync("archive-");
|
|
113
|
+
let archivePath = path.join(tmp, archive.name);
|
|
114
|
+
await download(archive.url, archivePath);
|
|
115
|
+
verify(archivePath, archive.checksum);
|
|
116
|
+
|
|
117
|
+
if (!fs.existsSync(binDir)) {
|
|
118
|
+
fs.mkdirSync(binDir);
|
|
119
|
+
}
|
|
120
|
+
switch (archive.format) {
|
|
121
|
+
case "binary":
|
|
122
|
+
const bin = path.join(binDir, archive.bins[0]);
|
|
123
|
+
fs.copyFileSync(archivePath, bin);
|
|
124
|
+
fs.chmodSync(bin, 0o755);
|
|
125
|
+
return;
|
|
126
|
+
case "zip":
|
|
127
|
+
return extractZip(
|
|
128
|
+
archivePath,
|
|
129
|
+
archive.bins,
|
|
130
|
+
binDir,
|
|
131
|
+
archive.wrappedIn,
|
|
132
|
+
);
|
|
133
|
+
case "tar":
|
|
134
|
+
case "tar.gz":
|
|
135
|
+
case "tgz":
|
|
136
|
+
return extractTar(
|
|
137
|
+
archivePath,
|
|
138
|
+
archive.bins,
|
|
139
|
+
binDir,
|
|
140
|
+
archive.wrappedIn,
|
|
141
|
+
);
|
|
142
|
+
case "tar.zst":
|
|
143
|
+
case "tzst":
|
|
144
|
+
case "tar.xz":
|
|
145
|
+
case "txz":
|
|
146
|
+
default:
|
|
147
|
+
throw new Error(`unsupported format: ${archive.format}`);
|
|
148
|
+
}
|
|
149
|
+
} catch (err) {
|
|
150
|
+
throw new Error(`Installation failed: ${err.message}`);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const verify = (filename, checksum) => {
|
|
155
|
+
if (checksum.algorithm == "" || checksum.digest == "") {
|
|
156
|
+
console.warn("Warning: No checksum provided for verification");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
let digest = crypto
|
|
160
|
+
.createHash(checksum.algorithm)
|
|
161
|
+
.update(fs.readFileSync(filename))
|
|
162
|
+
.digest("hex");
|
|
163
|
+
if (digest != checksum.digest) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
`${filename}: ${checksum.algorithm} does not match, expected ${checksum.digest}, got ${digest}`,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const download = async (url, filename) => {
|
|
171
|
+
try {
|
|
172
|
+
console.log(`Downloading ${url} to ${filename}...`);
|
|
173
|
+
const dir = path.dirname(filename);
|
|
174
|
+
if (!fs.existsSync(dir)) {
|
|
175
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const response = await axios({
|
|
179
|
+
method: "GET",
|
|
180
|
+
url: url,
|
|
181
|
+
responseType: "stream",
|
|
182
|
+
timeout: 300000, // 5min
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const writer = fs.createWriteStream(filename);
|
|
186
|
+
response.data.pipe(writer);
|
|
187
|
+
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
writer.on("finish", () => {
|
|
190
|
+
console.log(`Download complete: ${filename}`);
|
|
191
|
+
resolve(dir);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
writer.on("error", (err) => {
|
|
195
|
+
console.error(`Error writing file: ${err.message}`);
|
|
196
|
+
reject(err);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
} catch (err) {
|
|
200
|
+
throw new Error(`Download failed: ${err.message}`);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
function exists(archive) {
|
|
205
|
+
if (!fs.existsSync(binDir)) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
return archive.bins.every((bin) => fs.existsSync(path.join(binDir, bin)));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
module.exports = {
|
|
212
|
+
install,
|
|
213
|
+
run,
|
|
214
|
+
getArchive,
|
|
215
|
+
};
|
package/package.json
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@go-task/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.45.3",
|
|
4
4
|
"description": "A task runner / simpler Make alternative written in Go",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"postinstall": "
|
|
7
|
-
"
|
|
6
|
+
"postinstall": "node install.js",
|
|
7
|
+
"run": "node run-task.js"
|
|
8
8
|
},
|
|
9
|
-
"goBinary": {
|
|
10
|
-
"name": "task",
|
|
11
|
-
"path": "./bin",
|
|
12
|
-
"url": "https://github.com/go-task/task/releases/download/v{{version}}/task_{{platform}}_{{arch}}{{archive_ext}}"
|
|
13
|
-
},
|
|
14
|
-
"files": [],
|
|
15
9
|
"repository": {
|
|
16
10
|
"type": "git",
|
|
17
|
-
"url": "https://github.com/go-task/task.git"
|
|
11
|
+
"url": "git+https://github.com/go-task/task.git"
|
|
18
12
|
},
|
|
19
13
|
"keywords": [
|
|
20
14
|
"task",
|
|
@@ -28,7 +22,86 @@
|
|
|
28
22
|
"url": "https://github.com/go-task/task/issues"
|
|
29
23
|
},
|
|
30
24
|
"homepage": "https://taskfile.dev",
|
|
25
|
+
"bin": {
|
|
26
|
+
"task": "run-task.js"
|
|
27
|
+
},
|
|
31
28
|
"dependencies": {
|
|
32
|
-
"
|
|
29
|
+
"axios": "^1.8.2",
|
|
30
|
+
"jszip": "^3.10.1",
|
|
31
|
+
"tar": "^7.4.3"
|
|
32
|
+
},
|
|
33
|
+
"archives": {
|
|
34
|
+
"darwin-arm64": {
|
|
35
|
+
"name": "task_darwin_arm64.tar.gz",
|
|
36
|
+
"url": "https://github.com/go-task/task/releases/download/v3.45.3/task_darwin_arm64.tar.gz",
|
|
37
|
+
"bins": [
|
|
38
|
+
"task"
|
|
39
|
+
],
|
|
40
|
+
"format": "tar.gz",
|
|
41
|
+
"checksum": {
|
|
42
|
+
"algorithm": "sha256",
|
|
43
|
+
"digest": "1c621045b7c6da164e25d0c458d17339d01386cbeec67e79a98ae9528bdfe044"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"darwin-x64": {
|
|
47
|
+
"name": "task_darwin_amd64.tar.gz",
|
|
48
|
+
"url": "https://github.com/go-task/task/releases/download/v3.45.3/task_darwin_amd64.tar.gz",
|
|
49
|
+
"bins": [
|
|
50
|
+
"task"
|
|
51
|
+
],
|
|
52
|
+
"format": "tar.gz",
|
|
53
|
+
"checksum": {
|
|
54
|
+
"algorithm": "sha256",
|
|
55
|
+
"digest": "ec181efc611e17bca76687b43444e22724983bba25ad602c3cd068419e642da6"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"linux-arm64": {
|
|
59
|
+
"name": "task_linux_arm64.tar.gz",
|
|
60
|
+
"url": "https://github.com/go-task/task/releases/download/v3.45.3/task_linux_arm64.tar.gz",
|
|
61
|
+
"bins": [
|
|
62
|
+
"task"
|
|
63
|
+
],
|
|
64
|
+
"format": "tar.gz",
|
|
65
|
+
"checksum": {
|
|
66
|
+
"algorithm": "sha256",
|
|
67
|
+
"digest": "cb5e6b62a4ae7acbe69c99ba344eb8e68e37f25905600e4694518fe75e412276"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"linux-x64": {
|
|
71
|
+
"name": "task_linux_amd64.tar.gz",
|
|
72
|
+
"url": "https://github.com/go-task/task/releases/download/v3.45.3/task_linux_amd64.tar.gz",
|
|
73
|
+
"bins": [
|
|
74
|
+
"task"
|
|
75
|
+
],
|
|
76
|
+
"format": "tar.gz",
|
|
77
|
+
"checksum": {
|
|
78
|
+
"algorithm": "sha256",
|
|
79
|
+
"digest": "2c39d989ba8ab6ed37c025e9094e37240360fa2d69158504fc7a7486c88dc26f"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"win32-arm64": {
|
|
83
|
+
"name": "task_windows_arm64.zip",
|
|
84
|
+
"url": "https://github.com/go-task/task/releases/download/v3.45.3/task_windows_arm64.zip",
|
|
85
|
+
"bins": [
|
|
86
|
+
"task.exe"
|
|
87
|
+
],
|
|
88
|
+
"format": "zip",
|
|
89
|
+
"checksum": {
|
|
90
|
+
"algorithm": "sha256",
|
|
91
|
+
"digest": "24677c660078d1651e6151ed3e4433af28925a84c051ae148368e44d584b6c4e"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"win32-x64": {
|
|
95
|
+
"name": "task_windows_amd64.zip",
|
|
96
|
+
"url": "https://github.com/go-task/task/releases/download/v3.45.3/task_windows_amd64.zip",
|
|
97
|
+
"bins": [
|
|
98
|
+
"task.exe"
|
|
99
|
+
],
|
|
100
|
+
"format": "zip",
|
|
101
|
+
"checksum": {
|
|
102
|
+
"algorithm": "sha256",
|
|
103
|
+
"digest": "dec53fd819593c9bce9fdc2fd0ad037a38b7bc7fa431d78d141cbb77123553b4"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
33
106
|
}
|
|
34
|
-
}
|
|
107
|
+
}
|