@namespacelabs/actions-toolkit 0.1.0 → 0.1.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/README.md +2 -2
- package/dist/index-D8KbltV5.d.cts +38 -0
- package/dist/index-D8KbltV5.d.cts.map +1 -0
- package/dist/index-DwGIuc_X.d.mts +38 -0
- package/dist/index-DwGIuc_X.d.mts.map +1 -0
- package/dist/index.cjs +2 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{spacectl-6udimwjI.cjs → spacectl-DJeTPYLE.cjs} +51 -24
- package/dist/spacectl-DJeTPYLE.cjs.map +1 -0
- package/dist/{spacectl-COQOkFHx.mjs → spacectl-DoqF-x68.mjs} +45 -24
- package/dist/spacectl-DoqF-x68.mjs.map +1 -0
- package/dist/spacectl.cjs +2 -1
- package/dist/spacectl.d.cts +2 -2
- package/dist/spacectl.d.mts +2 -2
- package/dist/spacectl.mjs +2 -2
- package/package.json +14 -14
- package/dist/index-C6FXIu0Q.d.mts +0 -26
- package/dist/index-C6FXIu0Q.d.mts.map +0 -1
- package/dist/index-DJzkZaGq.d.cts +0 -26
- package/dist/index-DJzkZaGq.d.cts.map +0 -1
- package/dist/spacectl-6udimwjI.cjs.map +0 -1
- package/dist/spacectl-COQOkFHx.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -17,8 +17,8 @@ Install and execute the [spacectl](https://github.com/namespacelabs/space) CLI.
|
|
|
17
17
|
```typescript
|
|
18
18
|
import { install, exec } from "@namespacelabs/actions-toolkit/spacectl";
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
const result = await exec(
|
|
20
|
+
await install();
|
|
21
|
+
const result = await exec(["cache", "modes"]);
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
See [spacectl documentation](src/spacectl/README.md) for detailed usage.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as actionsExec from "@actions/exec";
|
|
2
|
+
|
|
3
|
+
//#region src/spacectl/exec.d.ts
|
|
4
|
+
type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
|
|
5
|
+
type ExecResult = actionsExec.ExecOutput;
|
|
6
|
+
declare class SpacectlExecError extends Error {
|
|
7
|
+
readonly exitCode: number;
|
|
8
|
+
readonly stdout: string;
|
|
9
|
+
readonly stderr: string;
|
|
10
|
+
readonly command: string;
|
|
11
|
+
constructor(message: string, exitCode: number, stdout: string, stderr: string, command: string, cause?: unknown);
|
|
12
|
+
}
|
|
13
|
+
declare function exec(args: string[], options?: ExecOptions & {
|
|
14
|
+
binPath?: string;
|
|
15
|
+
}): Promise<ExecResult>;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/spacectl/installer.d.ts
|
|
18
|
+
interface InstallOptions {
|
|
19
|
+
version?: string;
|
|
20
|
+
githubToken?: string;
|
|
21
|
+
/** Check for existing binary before downloading. @default true */
|
|
22
|
+
useSystemBinary?: boolean;
|
|
23
|
+
/** Add binary directory to PATH via core.addPath(). @default true */
|
|
24
|
+
addToPath?: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface InstallResult {
|
|
27
|
+
binPath: string;
|
|
28
|
+
version: string;
|
|
29
|
+
}
|
|
30
|
+
type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "UNSUPPORTED_ARCH" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
|
|
31
|
+
declare class SpacectlInstallError extends Error {
|
|
32
|
+
readonly code: SpacectlInstallErrorCode;
|
|
33
|
+
constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
|
|
34
|
+
}
|
|
35
|
+
declare function install(options?: InstallOptions): Promise<InstallResult>;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ExecOptions as a, exec as c, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, SpacectlExecError as s, InstallOptions as t };
|
|
38
|
+
//# sourceMappingURL=index-D8KbltV5.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-D8KbltV5.d.cts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAEY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,cAExB,iBAAA,SAA0B,KAAA;EAAA,SAC5B,QAAA;EAAA,SACA,MAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;cAGP,OAAA,UACA,QAAA,UACA,MAAA,UACA,MAAA,UACA,OAAA,UACA,KAAA;AAAA;AAAA,iBAWkB,IAAA,CACpB,IAAA,YACA,OAAA,GAAU,WAAA;EAAgB,OAAA;AAAA,IACzB,OAAA,CAAQ,UAAA;;;UCtBM,cAAA;EACf,OAAA;EACA,WAAA;EDbqB;ECerB,eAAA;EDf4B;ECiB5B,SAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAOC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;cAEH,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as actionsExec from "@actions/exec";
|
|
2
|
+
|
|
3
|
+
//#region src/spacectl/exec.d.ts
|
|
4
|
+
type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
|
|
5
|
+
type ExecResult = actionsExec.ExecOutput;
|
|
6
|
+
declare class SpacectlExecError extends Error {
|
|
7
|
+
readonly exitCode: number;
|
|
8
|
+
readonly stdout: string;
|
|
9
|
+
readonly stderr: string;
|
|
10
|
+
readonly command: string;
|
|
11
|
+
constructor(message: string, exitCode: number, stdout: string, stderr: string, command: string, cause?: unknown);
|
|
12
|
+
}
|
|
13
|
+
declare function exec(args: string[], options?: ExecOptions & {
|
|
14
|
+
binPath?: string;
|
|
15
|
+
}): Promise<ExecResult>;
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/spacectl/installer.d.ts
|
|
18
|
+
interface InstallOptions {
|
|
19
|
+
version?: string;
|
|
20
|
+
githubToken?: string;
|
|
21
|
+
/** Check for existing binary before downloading. @default true */
|
|
22
|
+
useSystemBinary?: boolean;
|
|
23
|
+
/** Add binary directory to PATH via core.addPath(). @default true */
|
|
24
|
+
addToPath?: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface InstallResult {
|
|
27
|
+
binPath: string;
|
|
28
|
+
version: string;
|
|
29
|
+
}
|
|
30
|
+
type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "UNSUPPORTED_ARCH" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
|
|
31
|
+
declare class SpacectlInstallError extends Error {
|
|
32
|
+
readonly code: SpacectlInstallErrorCode;
|
|
33
|
+
constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
|
|
34
|
+
}
|
|
35
|
+
declare function install(options?: InstallOptions): Promise<InstallResult>;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ExecOptions as a, exec as c, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, SpacectlExecError as s, InstallOptions as t };
|
|
38
|
+
//# sourceMappingURL=index-DwGIuc_X.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DwGIuc_X.d.mts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAEY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,cAExB,iBAAA,SAA0B,KAAA;EAAA,SAC5B,QAAA;EAAA,SACA,MAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;cAGP,OAAA,UACA,QAAA,UACA,MAAA,UACA,MAAA,UACA,OAAA,UACA,KAAA;AAAA;AAAA,iBAWkB,IAAA,CACpB,IAAA,YACA,OAAA,GAAU,WAAA;EAAgB,OAAA;AAAA,IACzB,OAAA,CAAQ,UAAA;;;UCtBM,cAAA;EACf,OAAA;EACA,WAAA;EDbqB;ECerB,eAAA;EDf4B;ECiB5B,SAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAOC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;cAEH,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
const require_spacectl = require('./spacectl-
|
|
1
|
+
const require_spacectl = require('./spacectl-DJeTPYLE.cjs');
|
|
2
2
|
|
|
3
|
+
exports.SpacectlExecError = require_spacectl.SpacectlExecError;
|
|
3
4
|
exports.SpacectlInstallError = require_spacectl.SpacectlInstallError;
|
|
4
5
|
exports.exec = require_spacectl.exec;
|
|
5
6
|
exports.install = require_spacectl.install;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as
|
|
2
|
-
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
|
|
1
|
+
import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-D8KbltV5.cjs";
|
|
2
|
+
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as
|
|
2
|
-
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
|
|
1
|
+
import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-DwGIuc_X.mjs";
|
|
2
|
+
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as install, r as
|
|
1
|
+
import { i as exec, n as install, r as SpacectlExecError, t as SpacectlInstallError } from "./spacectl-DoqF-x68.mjs";
|
|
2
2
|
|
|
3
|
-
export { SpacectlInstallError, exec, install };
|
|
3
|
+
export { SpacectlExecError, SpacectlInstallError, exec, install };
|
|
@@ -25,12 +25,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
}) : target, mod));
|
|
26
26
|
|
|
27
27
|
//#endregion
|
|
28
|
-
let _actions_core = require("@actions/core");
|
|
29
|
-
_actions_core = __toESM(_actions_core);
|
|
30
28
|
let _actions_exec = require("@actions/exec");
|
|
31
29
|
_actions_exec = __toESM(_actions_exec);
|
|
32
30
|
let node_path = require("node:path");
|
|
33
31
|
node_path = __toESM(node_path);
|
|
32
|
+
let _actions_core = require("@actions/core");
|
|
33
|
+
_actions_core = __toESM(_actions_core);
|
|
34
34
|
let _actions_io = require("@actions/io");
|
|
35
35
|
_actions_io = __toESM(_actions_io);
|
|
36
36
|
let _actions_tool_cache = require("@actions/tool-cache");
|
|
@@ -41,7 +41,22 @@ let _actions_github = require("@actions/github");
|
|
|
41
41
|
_actions_github = __toESM(_actions_github);
|
|
42
42
|
|
|
43
43
|
//#region src/spacectl/exec.ts
|
|
44
|
-
|
|
44
|
+
var SpacectlExecError = class extends Error {
|
|
45
|
+
exitCode;
|
|
46
|
+
stdout;
|
|
47
|
+
stderr;
|
|
48
|
+
command;
|
|
49
|
+
constructor(message, exitCode, stdout, stderr, command, cause) {
|
|
50
|
+
super(message, cause !== void 0 ? { cause } : void 0);
|
|
51
|
+
this.name = "SpacectlExecError";
|
|
52
|
+
this.exitCode = exitCode;
|
|
53
|
+
this.stdout = stdout;
|
|
54
|
+
this.stderr = stderr;
|
|
55
|
+
this.command = command;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
async function exec(args, options) {
|
|
59
|
+
const binPath = options?.binPath ?? "space";
|
|
45
60
|
const execArgs = [...args, "--output=json"];
|
|
46
61
|
let stdout = "";
|
|
47
62
|
let stderr = "";
|
|
@@ -60,13 +75,13 @@ async function exec(binPath, args, options) {
|
|
|
60
75
|
}
|
|
61
76
|
});
|
|
62
77
|
if (exitCode !== 0) {
|
|
63
|
-
|
|
78
|
+
const command = `${binPath} ${execArgs.join(" ")}`;
|
|
79
|
+
let errorMessage = `'${command}' failed with exit code ${exitCode}`;
|
|
64
80
|
try {
|
|
65
81
|
const errorJson = JSON.parse(stdout.trim());
|
|
66
82
|
if (errorJson.message) errorMessage = errorJson.message;
|
|
67
83
|
} catch {}
|
|
68
|
-
|
|
69
|
-
process.exit(exitCode);
|
|
84
|
+
throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);
|
|
70
85
|
}
|
|
71
86
|
return {
|
|
72
87
|
exitCode,
|
|
@@ -87,10 +102,11 @@ function getPlatform() {
|
|
|
87
102
|
}
|
|
88
103
|
}
|
|
89
104
|
function getArch() {
|
|
90
|
-
|
|
105
|
+
const arch = node_os.arch();
|
|
106
|
+
switch (arch) {
|
|
91
107
|
case "arm64": return "arm64";
|
|
92
108
|
case "x64": return "amd64";
|
|
93
|
-
default:
|
|
109
|
+
default: throw new Error(`Unsupported architecture: ${arch}`);
|
|
94
110
|
}
|
|
95
111
|
}
|
|
96
112
|
function getBinaryName() {
|
|
@@ -102,7 +118,7 @@ function getBinaryName() {
|
|
|
102
118
|
const REPO_OWNER$1 = "namespacelabs";
|
|
103
119
|
const REPO_NAME$1 = "space";
|
|
104
120
|
function normalizeVersion(version) {
|
|
105
|
-
return version.trim().replace(/^
|
|
121
|
+
return version.trim().replace(/^[vV]/, "");
|
|
106
122
|
}
|
|
107
123
|
async function getLatestVersion(token) {
|
|
108
124
|
const octokit = _actions_github.getOctokit(token || process.env.GITHUB_TOKEN || "");
|
|
@@ -146,12 +162,10 @@ const REPO_OWNER = "namespacelabs";
|
|
|
146
162
|
const REPO_NAME = "space";
|
|
147
163
|
var SpacectlInstallError = class extends Error {
|
|
148
164
|
code;
|
|
149
|
-
cause;
|
|
150
165
|
constructor(message, code, cause) {
|
|
151
|
-
super(message);
|
|
166
|
+
super(message, { cause });
|
|
152
167
|
this.name = "SpacectlInstallError";
|
|
153
168
|
this.code = code;
|
|
154
|
-
this.cause = cause;
|
|
155
169
|
}
|
|
156
170
|
};
|
|
157
171
|
async function findExistingBinary() {
|
|
@@ -176,7 +190,7 @@ async function findExistingBinary() {
|
|
|
176
190
|
}
|
|
177
191
|
}
|
|
178
192
|
async function getInstalledVersion(binPath) {
|
|
179
|
-
const result = await exec(
|
|
193
|
+
const result = await exec(["version"], { binPath });
|
|
180
194
|
try {
|
|
181
195
|
return normalizeVersion(JSON.parse(result.stdout.trim()).version);
|
|
182
196
|
} catch (error) {
|
|
@@ -184,13 +198,11 @@ async function getInstalledVersion(binPath) {
|
|
|
184
198
|
throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, "EXEC_FAILED", error);
|
|
185
199
|
}
|
|
186
200
|
}
|
|
187
|
-
function getDownloadUrl(version) {
|
|
188
|
-
return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${
|
|
201
|
+
function getDownloadUrl(version, platform, arch) {
|
|
202
|
+
return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`}`;
|
|
189
203
|
}
|
|
190
|
-
async function downloadAndCache(version, token) {
|
|
191
|
-
const
|
|
192
|
-
const arch = getArch();
|
|
193
|
-
const url = getDownloadUrl(version);
|
|
204
|
+
async function downloadAndCache(version, platform, arch, token) {
|
|
205
|
+
const url = getDownloadUrl(version, platform, arch);
|
|
194
206
|
_actions_core.info(`Downloading spacectl ${version} from ${url}`);
|
|
195
207
|
let archivePath;
|
|
196
208
|
try {
|
|
@@ -208,18 +220,25 @@ async function downloadAndCache(version, token) {
|
|
|
208
220
|
async function install(options = {}) {
|
|
209
221
|
const versionSpec = options.version ?? "";
|
|
210
222
|
const token = options.githubToken ?? process.env.GITHUB_TOKEN;
|
|
223
|
+
let platform;
|
|
211
224
|
try {
|
|
212
|
-
getPlatform();
|
|
225
|
+
platform = getPlatform();
|
|
213
226
|
} catch (error) {
|
|
214
227
|
throw new SpacectlInstallError(`Unsupported platform: ${process.platform}`, "UNSUPPORTED_PLATFORM", error);
|
|
215
228
|
}
|
|
216
|
-
|
|
229
|
+
let arch;
|
|
230
|
+
try {
|
|
231
|
+
arch = getArch();
|
|
232
|
+
} catch (error) {
|
|
233
|
+
throw new SpacectlInstallError(`Unsupported architecture: ${process.arch}`, "UNSUPPORTED_ARCH", error);
|
|
234
|
+
}
|
|
217
235
|
const binaryName = getBinaryName();
|
|
218
|
-
if (versionSpec === "") {
|
|
236
|
+
if (versionSpec === "" && options.useSystemBinary !== false) {
|
|
219
237
|
const existingPath = await findExistingBinary();
|
|
220
238
|
if (existingPath) {
|
|
221
239
|
const version = await getInstalledVersion(existingPath);
|
|
222
240
|
_actions_core.info(`Using existing spacectl ${version} at ${existingPath}`);
|
|
241
|
+
if (options.addToPath !== false) _actions_core.addPath(node_path.dirname(existingPath));
|
|
223
242
|
return {
|
|
224
243
|
binPath: existingPath,
|
|
225
244
|
version
|
|
@@ -237,14 +256,16 @@ async function install(options = {}) {
|
|
|
237
256
|
if (cached) {
|
|
238
257
|
const binPath = node_path.join(cached, binaryName);
|
|
239
258
|
_actions_core.info(`Using cached spacectl ${targetVersion} at ${cached}`);
|
|
259
|
+
if (options.addToPath !== false) _actions_core.addPath(cached);
|
|
240
260
|
return {
|
|
241
261
|
binPath,
|
|
242
262
|
version: targetVersion
|
|
243
263
|
};
|
|
244
264
|
}
|
|
245
|
-
const cachedDir = await downloadAndCache(targetVersion, token);
|
|
265
|
+
const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);
|
|
246
266
|
const binPath = node_path.join(cachedDir, binaryName);
|
|
247
267
|
await getInstalledVersion(binPath);
|
|
268
|
+
if (options.addToPath !== false) _actions_core.addPath(cachedDir);
|
|
248
269
|
return {
|
|
249
270
|
binPath,
|
|
250
271
|
version: targetVersion
|
|
@@ -252,6 +273,12 @@ async function install(options = {}) {
|
|
|
252
273
|
}
|
|
253
274
|
|
|
254
275
|
//#endregion
|
|
276
|
+
Object.defineProperty(exports, 'SpacectlExecError', {
|
|
277
|
+
enumerable: true,
|
|
278
|
+
get: function () {
|
|
279
|
+
return SpacectlExecError;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
255
282
|
Object.defineProperty(exports, 'SpacectlInstallError', {
|
|
256
283
|
enumerable: true,
|
|
257
284
|
get: function () {
|
|
@@ -270,4 +297,4 @@ Object.defineProperty(exports, 'install', {
|
|
|
270
297
|
return install;
|
|
271
298
|
}
|
|
272
299
|
});
|
|
273
|
-
//# sourceMappingURL=spacectl-
|
|
300
|
+
//# sourceMappingURL=spacectl-DJeTPYLE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spacectl-DJeTPYLE.cjs","names":["actionsExec","os","REPO_OWNER","REPO_NAME","github","path","io","tc"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport class SpacectlExecError extends Error {\n readonly exitCode: number;\n readonly stdout: string;\n readonly stderr: string;\n readonly command: string;\n\n constructor(\n message: string,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n cause?: unknown\n ) {\n super(message, cause !== undefined ? { cause } : undefined);\n this.name = \"SpacectlExecError\";\n this.exitCode = exitCode;\n this.stdout = stdout;\n this.stderr = stderr;\n this.command = command;\n }\n}\n\nexport async function exec(\n args: string[],\n options?: ExecOptions & { binPath?: string }\n): Promise<ExecResult> {\n const binPath = options?.binPath ?? \"space\"; // install() should have added to path by default\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n const command = `${binPath} ${execArgs.join(\" \")}`;\n let errorMessage = `'${command}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n throw new Error(`Unsupported architecture: ${arch}`);\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^[vV]/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName, type Platform, type Arch } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n /** Check for existing binary before downloading. @default true */\n useSystemBinary?: boolean;\n /** Add binary directory to PATH via core.addPath(). @default true */\n addToPath?: boolean;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"UNSUPPORTED_ARCH\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message, { cause });\n this.name = \"SpacectlInstallError\";\n this.code = code;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec([\"version\"], { binPath });\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nexport function getDownloadUrl(version: string, platform: Platform, arch: Arch): string {\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(\n version: string,\n platform: Platform,\n arch: Arch,\n token?: string\n): Promise<string> {\n const url = getDownloadUrl(version, platform, arch);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n let platform: Platform;\n try {\n platform = getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n let arch: Arch;\n try {\n arch = getArch();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported architecture: ${process.arch}`,\n \"UNSUPPORTED_ARCH\",\n error\n );\n }\n\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\" && options.useSystemBinary !== false) {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n if (options.addToPath !== false) {\n core.addPath(path.dirname(existingPath));\n }\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n if (options.addToPath !== false) {\n core.addPath(cached);\n }\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n if (options.addToPath !== false) {\n core.addPath(cachedDir);\n }\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +1,28 @@
|
|
|
1
|
-
import * as core from "@actions/core";
|
|
2
1
|
import * as actionsExec from "@actions/exec";
|
|
3
2
|
import * as path from "node:path";
|
|
3
|
+
import * as core from "@actions/core";
|
|
4
4
|
import * as io from "@actions/io";
|
|
5
5
|
import * as tc from "@actions/tool-cache";
|
|
6
6
|
import * as os from "node:os";
|
|
7
7
|
import * as github from "@actions/github";
|
|
8
8
|
|
|
9
9
|
//#region src/spacectl/exec.ts
|
|
10
|
-
|
|
10
|
+
var SpacectlExecError = class extends Error {
|
|
11
|
+
exitCode;
|
|
12
|
+
stdout;
|
|
13
|
+
stderr;
|
|
14
|
+
command;
|
|
15
|
+
constructor(message, exitCode, stdout, stderr, command, cause) {
|
|
16
|
+
super(message, cause !== void 0 ? { cause } : void 0);
|
|
17
|
+
this.name = "SpacectlExecError";
|
|
18
|
+
this.exitCode = exitCode;
|
|
19
|
+
this.stdout = stdout;
|
|
20
|
+
this.stderr = stderr;
|
|
21
|
+
this.command = command;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
async function exec(args, options) {
|
|
25
|
+
const binPath = options?.binPath ?? "space";
|
|
11
26
|
const execArgs = [...args, "--output=json"];
|
|
12
27
|
let stdout = "";
|
|
13
28
|
let stderr = "";
|
|
@@ -26,13 +41,13 @@ async function exec(binPath, args, options) {
|
|
|
26
41
|
}
|
|
27
42
|
});
|
|
28
43
|
if (exitCode !== 0) {
|
|
29
|
-
|
|
44
|
+
const command = `${binPath} ${execArgs.join(" ")}`;
|
|
45
|
+
let errorMessage = `'${command}' failed with exit code ${exitCode}`;
|
|
30
46
|
try {
|
|
31
47
|
const errorJson = JSON.parse(stdout.trim());
|
|
32
48
|
if (errorJson.message) errorMessage = errorJson.message;
|
|
33
49
|
} catch {}
|
|
34
|
-
|
|
35
|
-
process.exit(exitCode);
|
|
50
|
+
throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);
|
|
36
51
|
}
|
|
37
52
|
return {
|
|
38
53
|
exitCode,
|
|
@@ -53,10 +68,11 @@ function getPlatform() {
|
|
|
53
68
|
}
|
|
54
69
|
}
|
|
55
70
|
function getArch() {
|
|
56
|
-
|
|
71
|
+
const arch = os.arch();
|
|
72
|
+
switch (arch) {
|
|
57
73
|
case "arm64": return "arm64";
|
|
58
74
|
case "x64": return "amd64";
|
|
59
|
-
default:
|
|
75
|
+
default: throw new Error(`Unsupported architecture: ${arch}`);
|
|
60
76
|
}
|
|
61
77
|
}
|
|
62
78
|
function getBinaryName() {
|
|
@@ -68,7 +84,7 @@ function getBinaryName() {
|
|
|
68
84
|
const REPO_OWNER$1 = "namespacelabs";
|
|
69
85
|
const REPO_NAME$1 = "space";
|
|
70
86
|
function normalizeVersion(version) {
|
|
71
|
-
return version.trim().replace(/^
|
|
87
|
+
return version.trim().replace(/^[vV]/, "");
|
|
72
88
|
}
|
|
73
89
|
async function getLatestVersion(token) {
|
|
74
90
|
const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || "");
|
|
@@ -112,12 +128,10 @@ const REPO_OWNER = "namespacelabs";
|
|
|
112
128
|
const REPO_NAME = "space";
|
|
113
129
|
var SpacectlInstallError = class extends Error {
|
|
114
130
|
code;
|
|
115
|
-
cause;
|
|
116
131
|
constructor(message, code, cause) {
|
|
117
|
-
super(message);
|
|
132
|
+
super(message, { cause });
|
|
118
133
|
this.name = "SpacectlInstallError";
|
|
119
134
|
this.code = code;
|
|
120
|
-
this.cause = cause;
|
|
121
135
|
}
|
|
122
136
|
};
|
|
123
137
|
async function findExistingBinary() {
|
|
@@ -142,7 +156,7 @@ async function findExistingBinary() {
|
|
|
142
156
|
}
|
|
143
157
|
}
|
|
144
158
|
async function getInstalledVersion(binPath) {
|
|
145
|
-
const result = await exec(
|
|
159
|
+
const result = await exec(["version"], { binPath });
|
|
146
160
|
try {
|
|
147
161
|
return normalizeVersion(JSON.parse(result.stdout.trim()).version);
|
|
148
162
|
} catch (error) {
|
|
@@ -150,13 +164,11 @@ async function getInstalledVersion(binPath) {
|
|
|
150
164
|
throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, "EXEC_FAILED", error);
|
|
151
165
|
}
|
|
152
166
|
}
|
|
153
|
-
function getDownloadUrl(version) {
|
|
154
|
-
return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${
|
|
167
|
+
function getDownloadUrl(version, platform, arch) {
|
|
168
|
+
return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${`${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`}`;
|
|
155
169
|
}
|
|
156
|
-
async function downloadAndCache(version, token) {
|
|
157
|
-
const
|
|
158
|
-
const arch = getArch();
|
|
159
|
-
const url = getDownloadUrl(version);
|
|
170
|
+
async function downloadAndCache(version, platform, arch, token) {
|
|
171
|
+
const url = getDownloadUrl(version, platform, arch);
|
|
160
172
|
core.info(`Downloading spacectl ${version} from ${url}`);
|
|
161
173
|
let archivePath;
|
|
162
174
|
try {
|
|
@@ -174,18 +186,25 @@ async function downloadAndCache(version, token) {
|
|
|
174
186
|
async function install(options = {}) {
|
|
175
187
|
const versionSpec = options.version ?? "";
|
|
176
188
|
const token = options.githubToken ?? process.env.GITHUB_TOKEN;
|
|
189
|
+
let platform;
|
|
177
190
|
try {
|
|
178
|
-
getPlatform();
|
|
191
|
+
platform = getPlatform();
|
|
179
192
|
} catch (error) {
|
|
180
193
|
throw new SpacectlInstallError(`Unsupported platform: ${process.platform}`, "UNSUPPORTED_PLATFORM", error);
|
|
181
194
|
}
|
|
182
|
-
|
|
195
|
+
let arch;
|
|
196
|
+
try {
|
|
197
|
+
arch = getArch();
|
|
198
|
+
} catch (error) {
|
|
199
|
+
throw new SpacectlInstallError(`Unsupported architecture: ${process.arch}`, "UNSUPPORTED_ARCH", error);
|
|
200
|
+
}
|
|
183
201
|
const binaryName = getBinaryName();
|
|
184
|
-
if (versionSpec === "") {
|
|
202
|
+
if (versionSpec === "" && options.useSystemBinary !== false) {
|
|
185
203
|
const existingPath = await findExistingBinary();
|
|
186
204
|
if (existingPath) {
|
|
187
205
|
const version = await getInstalledVersion(existingPath);
|
|
188
206
|
core.info(`Using existing spacectl ${version} at ${existingPath}`);
|
|
207
|
+
if (options.addToPath !== false) core.addPath(path.dirname(existingPath));
|
|
189
208
|
return {
|
|
190
209
|
binPath: existingPath,
|
|
191
210
|
version
|
|
@@ -203,14 +222,16 @@ async function install(options = {}) {
|
|
|
203
222
|
if (cached) {
|
|
204
223
|
const binPath = path.join(cached, binaryName);
|
|
205
224
|
core.info(`Using cached spacectl ${targetVersion} at ${cached}`);
|
|
225
|
+
if (options.addToPath !== false) core.addPath(cached);
|
|
206
226
|
return {
|
|
207
227
|
binPath,
|
|
208
228
|
version: targetVersion
|
|
209
229
|
};
|
|
210
230
|
}
|
|
211
|
-
const cachedDir = await downloadAndCache(targetVersion, token);
|
|
231
|
+
const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);
|
|
212
232
|
const binPath = path.join(cachedDir, binaryName);
|
|
213
233
|
await getInstalledVersion(binPath);
|
|
234
|
+
if (options.addToPath !== false) core.addPath(cachedDir);
|
|
214
235
|
return {
|
|
215
236
|
binPath,
|
|
216
237
|
version: targetVersion
|
|
@@ -218,5 +239,5 @@ async function install(options = {}) {
|
|
|
218
239
|
}
|
|
219
240
|
|
|
220
241
|
//#endregion
|
|
221
|
-
export { install as n,
|
|
222
|
-
//# sourceMappingURL=spacectl-
|
|
242
|
+
export { exec as i, install as n, SpacectlExecError as r, SpacectlInstallError as t };
|
|
243
|
+
//# sourceMappingURL=spacectl-DoqF-x68.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spacectl-DoqF-x68.mjs","names":["REPO_OWNER","REPO_NAME"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport class SpacectlExecError extends Error {\n readonly exitCode: number;\n readonly stdout: string;\n readonly stderr: string;\n readonly command: string;\n\n constructor(\n message: string,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n cause?: unknown\n ) {\n super(message, cause !== undefined ? { cause } : undefined);\n this.name = \"SpacectlExecError\";\n this.exitCode = exitCode;\n this.stdout = stdout;\n this.stderr = stderr;\n this.command = command;\n }\n}\n\nexport async function exec(\n args: string[],\n options?: ExecOptions & { binPath?: string }\n): Promise<ExecResult> {\n const binPath = options?.binPath ?? \"space\"; // install() should have added to path by default\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n const command = `${binPath} ${execArgs.join(\" \")}`;\n let errorMessage = `'${command}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n throw new SpacectlExecError(errorMessage, exitCode, stdout, stderr, command);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n throw new Error(`Unsupported architecture: ${arch}`);\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^[vV]/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName, type Platform, type Arch } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n /** Check for existing binary before downloading. @default true */\n useSystemBinary?: boolean;\n /** Add binary directory to PATH via core.addPath(). @default true */\n addToPath?: boolean;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"UNSUPPORTED_ARCH\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message, { cause });\n this.name = \"SpacectlInstallError\";\n this.code = code;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec([\"version\"], { binPath });\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nexport function getDownloadUrl(version: string, platform: Platform, arch: Arch): string {\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(\n version: string,\n platform: Platform,\n arch: Arch,\n token?: string\n): Promise<string> {\n const url = getDownloadUrl(version, platform, arch);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n let platform: Platform;\n try {\n platform = getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n let arch: Arch;\n try {\n arch = getArch();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported architecture: ${process.arch}`,\n \"UNSUPPORTED_ARCH\",\n error\n );\n }\n\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\" && options.useSystemBinary !== false) {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n if (options.addToPath !== false) {\n core.addPath(path.dirname(existingPath));\n }\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n if (options.addToPath !== false) {\n core.addPath(cached);\n }\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, platform, arch, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n if (options.addToPath !== false) {\n core.addPath(cachedDir);\n }\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}
|
package/dist/spacectl.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
const require_spacectl = require('./spacectl-
|
|
1
|
+
const require_spacectl = require('./spacectl-DJeTPYLE.cjs');
|
|
2
2
|
|
|
3
|
+
exports.SpacectlExecError = require_spacectl.SpacectlExecError;
|
|
3
4
|
exports.SpacectlInstallError = require_spacectl.SpacectlInstallError;
|
|
4
5
|
exports.exec = require_spacectl.exec;
|
|
5
6
|
exports.install = require_spacectl.install;
|
package/dist/spacectl.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as
|
|
2
|
-
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
|
|
1
|
+
import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-D8KbltV5.cjs";
|
|
2
|
+
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
|
package/dist/spacectl.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ExecOptions, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as
|
|
2
|
-
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlInstallError, exec, install };
|
|
1
|
+
import { a as ExecOptions, c as exec, i as install, n as InstallResult, o as ExecResult, r as SpacectlInstallError, s as SpacectlExecError, t as InstallOptions } from "./index-DwGIuc_X.mjs";
|
|
2
|
+
export { ExecOptions, ExecResult, InstallOptions, InstallResult, SpacectlExecError, SpacectlInstallError, exec, install };
|
package/dist/spacectl.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as install, r as
|
|
1
|
+
import { i as exec, n as install, r as SpacectlExecError, t as SpacectlInstallError } from "./spacectl-DoqF-x68.mjs";
|
|
2
2
|
|
|
3
|
-
export { SpacectlInstallError, exec, install };
|
|
3
|
+
export { SpacectlExecError, SpacectlInstallError, exec, install };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@namespacelabs/actions-toolkit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "GitHub Actions toolkit for Namespace",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
"engines": {
|
|
12
12
|
"node": ">=20"
|
|
13
13
|
},
|
|
14
|
-
"packageManager": "pnpm@10.6.2",
|
|
15
14
|
"files": [
|
|
16
15
|
"dist"
|
|
17
16
|
],
|
|
@@ -41,17 +40,6 @@
|
|
|
41
40
|
},
|
|
42
41
|
"./package.json": "./package.json"
|
|
43
42
|
},
|
|
44
|
-
"scripts": {
|
|
45
|
-
"build": "tsdown",
|
|
46
|
-
"clean": "rm -rf dist",
|
|
47
|
-
"typecheck": "tsc --noEmit",
|
|
48
|
-
"lint": "eslint src",
|
|
49
|
-
"lint:fix": "eslint src --fix",
|
|
50
|
-
"format": "prettier --write \"src/**/*.ts\"",
|
|
51
|
-
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
52
|
-
"test": "vitest",
|
|
53
|
-
"test:run": "vitest run"
|
|
54
|
-
},
|
|
55
43
|
"dependencies": {
|
|
56
44
|
"@actions/core": "^1.11.1",
|
|
57
45
|
"@actions/exec": "^1.1.1",
|
|
@@ -70,5 +58,17 @@
|
|
|
70
58
|
"typescript": "^5.8.3",
|
|
71
59
|
"typescript-eslint": "^8.54.0",
|
|
72
60
|
"vitest": "^3.1.4"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsdown",
|
|
64
|
+
"clean": "rm -rf dist",
|
|
65
|
+
"typecheck": "tsc --noEmit",
|
|
66
|
+
"lint": "eslint src",
|
|
67
|
+
"lint:fix": "eslint src --fix",
|
|
68
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
69
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
70
|
+
"test": "vitest",
|
|
71
|
+
"test:run": "vitest run",
|
|
72
|
+
"release": "./scripts/release.sh"
|
|
73
73
|
}
|
|
74
|
-
}
|
|
74
|
+
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import * as actionsExec from "@actions/exec";
|
|
2
|
-
|
|
3
|
-
//#region src/spacectl/exec.d.ts
|
|
4
|
-
type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
|
|
5
|
-
type ExecResult = actionsExec.ExecOutput;
|
|
6
|
-
declare function exec(binPath: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src/spacectl/installer.d.ts
|
|
9
|
-
interface InstallOptions {
|
|
10
|
-
version?: string;
|
|
11
|
-
githubToken?: string;
|
|
12
|
-
}
|
|
13
|
-
interface InstallResult {
|
|
14
|
-
binPath: string;
|
|
15
|
-
version: string;
|
|
16
|
-
}
|
|
17
|
-
type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
|
|
18
|
-
declare class SpacectlInstallError extends Error {
|
|
19
|
-
readonly code: SpacectlInstallErrorCode;
|
|
20
|
-
readonly cause?: unknown;
|
|
21
|
-
constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
|
|
22
|
-
}
|
|
23
|
-
declare function install(options?: InstallOptions): Promise<InstallResult>;
|
|
24
|
-
//#endregion
|
|
25
|
-
export { ExecOptions as a, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, exec as s, InstallOptions as t };
|
|
26
|
-
//# sourceMappingURL=index-C6FXIu0Q.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-C6FXIu0Q.d.mts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAGY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,iBAEf,IAAA,CACpB,OAAA,UACA,IAAA,YACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;;;UCDM,cAAA;EACf,OAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAMC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;EAAA,SACN,KAAA;cAEG,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import * as actionsExec from "@actions/exec";
|
|
2
|
-
|
|
3
|
-
//#region src/spacectl/exec.d.ts
|
|
4
|
-
type ExecOptions = Omit<actionsExec.ExecOptions, "listeners" | "ignoreReturnCode" | "silent">;
|
|
5
|
-
type ExecResult = actionsExec.ExecOutput;
|
|
6
|
-
declare function exec(binPath: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src/spacectl/installer.d.ts
|
|
9
|
-
interface InstallOptions {
|
|
10
|
-
version?: string;
|
|
11
|
-
githubToken?: string;
|
|
12
|
-
}
|
|
13
|
-
interface InstallResult {
|
|
14
|
-
binPath: string;
|
|
15
|
-
version: string;
|
|
16
|
-
}
|
|
17
|
-
type SpacectlInstallErrorCode = "UNSUPPORTED_PLATFORM" | "RESOLVE_VERSION_FAILED" | "DOWNLOAD_FAILED" | "EXEC_FAILED";
|
|
18
|
-
declare class SpacectlInstallError extends Error {
|
|
19
|
-
readonly code: SpacectlInstallErrorCode;
|
|
20
|
-
readonly cause?: unknown;
|
|
21
|
-
constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown);
|
|
22
|
-
}
|
|
23
|
-
declare function install(options?: InstallOptions): Promise<InstallResult>;
|
|
24
|
-
//#endregion
|
|
25
|
-
export { ExecOptions as a, install as i, InstallResult as n, ExecResult as o, SpacectlInstallError as r, exec as s, InstallOptions as t };
|
|
26
|
-
//# sourceMappingURL=index-DJzkZaGq.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DJzkZaGq.d.cts","names":[],"sources":["../src/spacectl/exec.ts","../src/spacectl/installer.ts"],"mappings":";;;KAGY,WAAA,GAAc,IAAA,CACxB,WAAA,CAAY,WAAA;AAAA,KAIF,UAAA,GAAa,WAAA,CAAY,UAAA;AAAA,iBAEf,IAAA,CACpB,OAAA,UACA,IAAA,YACA,OAAA,GAAU,WAAA,GACT,OAAA,CAAQ,UAAA;;;UCDM,cAAA;EACf,OAAA;EACA,WAAA;AAAA;AAAA,UAGe,aAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,wBAAA;AAAA,cAMC,oBAAA,SAA6B,KAAA;EAAA,SAC/B,IAAA,EAAM,wBAAA;EAAA,SACN,KAAA;cAEG,OAAA,UAAiB,IAAA,EAAM,wBAAA,EAA0B,KAAA;AAAA;AAAA,iBAkFzC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,aAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spacectl-6udimwjI.cjs","names":["actionsExec","os","REPO_OWNER","REPO_NAME","github","path","io","tc"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as core from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport async function exec(\n binPath: string,\n args: string[],\n options?: ExecOptions\n): Promise<ExecResult> {\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n let errorMessage = `'${binPath} ${execArgs.join(\" \")}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n core.error(errorMessage);\n process.exit(exitCode);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n return \"amd64\";\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^v/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n readonly cause?: unknown;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message);\n this.name = \"SpacectlInstallError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec(binPath, [\"version\"]);\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nfunction getDownloadUrl(version: string): string {\n const platform = getPlatform();\n const arch = getArch();\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(version: string, token?: string): Promise<string> {\n const platform = getPlatform();\n const arch = getArch();\n const url = getDownloadUrl(version);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n try {\n getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n const arch = getArch();\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\") {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spacectl-COQOkFHx.mjs","names":["REPO_OWNER","REPO_NAME"],"sources":["../src/spacectl/exec.ts","../src/spacectl/platform.ts","../src/spacectl/version.ts","../src/spacectl/installer.ts"],"sourcesContent":["import * as core from \"@actions/core\";\nimport * as actionsExec from \"@actions/exec\";\n\nexport type ExecOptions = Omit<\n actionsExec.ExecOptions,\n \"listeners\" | \"ignoreReturnCode\" | \"silent\"\n>;\n\nexport type ExecResult = actionsExec.ExecOutput;\n\nexport async function exec(\n binPath: string,\n args: string[],\n options?: ExecOptions\n): Promise<ExecResult> {\n const execArgs = [...args, \"--output=json\"];\n\n let stdout = \"\";\n let stderr = \"\";\n\n const exitCode = await actionsExec.exec(binPath, execArgs, {\n ...options,\n ignoreReturnCode: true,\n silent: true,\n listeners: {\n stdout: (data: Buffer) => {\n stdout += data.toString();\n },\n stderr: (data: Buffer) => {\n stderr += data.toString();\n // Forward stderr to stdout so GitHub Actions can process workflow\n // commands like ::debug::. The space binary outputs these to stderr\n // when --output=json is used to keep stdout clean for JSON.\n process.stdout.write(data);\n },\n },\n });\n\n if (exitCode !== 0) {\n let errorMessage = `'${binPath} ${execArgs.join(\" \")}' failed with exit code ${exitCode}`;\n try {\n const errorJson = JSON.parse(stdout.trim());\n if (errorJson.message) {\n errorMessage = errorJson.message;\n }\n } catch {\n // stdout wasn't valid JSON, use default message\n }\n core.error(errorMessage);\n process.exit(exitCode);\n }\n\n return { exitCode, stdout, stderr };\n}\n","import * as os from \"node:os\";\n\nexport type Platform = \"darwin\" | \"linux\" | \"windows\";\nexport type Arch = \"amd64\" | \"arm64\";\n\nexport function getPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case \"darwin\":\n return \"darwin\";\n case \"linux\":\n return \"linux\";\n case \"win32\":\n return \"windows\";\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport function getArch(): Arch {\n const arch = os.arch();\n switch (arch) {\n case \"arm64\":\n return \"arm64\";\n case \"x64\":\n return \"amd64\";\n default:\n return \"amd64\";\n }\n}\n\nexport function getBinaryName(): string {\n return getPlatform() === \"windows\" ? \"space.exe\" : \"space\";\n}\n","import * as core from \"@actions/core\";\nimport * as github from \"@actions/github\";\n\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport function normalizeVersion(version: string): string {\n return version.trim().replace(/^v/, \"\");\n}\n\nexport async function getLatestVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const { data: release } = await octokit.rest.repos.getLatestRelease({\n owner: REPO_OWNER,\n repo: REPO_NAME,\n });\n return normalizeVersion(release.tag_name);\n } catch (error) {\n core.debug(`Failed to get latest release: ${error}`);\n throw new Error(\n `Failed to resolve latest version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function getLatestDevVersion(token?: string): Promise<string> {\n const octokit = github.getOctokit(token || process.env.GITHUB_TOKEN || \"\");\n\n try {\n const iterator = octokit.paginate.iterator(octokit.rest.repos.listReleases, {\n owner: REPO_OWNER,\n repo: REPO_NAME,\n per_page: 100,\n });\n\n for await (const { data: releases } of iterator) {\n for (const release of releases) {\n if (release.tag_name.includes(\"-dev\")) {\n return normalizeVersion(release.tag_name);\n }\n }\n }\n\n throw new Error(\"No dev release found\");\n } catch (error) {\n core.debug(`Failed to get dev release: ${error}`);\n throw new Error(\n `Failed to resolve dev version. ` +\n `If hitting rate limits, provide a GitHub token via options.githubToken or GITHUB_TOKEN env var.`\n );\n }\n}\n\nexport async function resolveVersion(versionSpec: string, token?: string): Promise<string> {\n const spec = versionSpec.trim().toLowerCase();\n\n if (spec === \"\" || spec === \"latest\") {\n return getLatestVersion(token);\n }\n\n if (spec === \"dev\") {\n return getLatestDevVersion(token);\n }\n\n return normalizeVersion(versionSpec);\n}\n","import * as path from \"node:path\";\nimport * as core from \"@actions/core\";\nimport * as io from \"@actions/io\";\nimport * as tc from \"@actions/tool-cache\";\n\nimport { exec } from \"./exec\";\nimport { getPlatform, getArch, getBinaryName } from \"./platform\";\nimport { resolveVersion, normalizeVersion } from \"./version\";\n\nconst TOOL_NAME = \"space\";\nconst REPO_OWNER = \"namespacelabs\";\nconst REPO_NAME = \"space\";\n\nexport interface InstallOptions {\n version?: string;\n githubToken?: string;\n}\n\nexport interface InstallResult {\n binPath: string;\n version: string;\n}\n\nexport type SpacectlInstallErrorCode =\n | \"UNSUPPORTED_PLATFORM\"\n | \"RESOLVE_VERSION_FAILED\"\n | \"DOWNLOAD_FAILED\"\n | \"EXEC_FAILED\";\n\nexport class SpacectlInstallError extends Error {\n readonly code: SpacectlInstallErrorCode;\n readonly cause?: unknown;\n\n constructor(message: string, code: SpacectlInstallErrorCode, cause?: unknown) {\n super(message);\n this.name = \"SpacectlInstallError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\nasync function findExistingBinary(): Promise<string | undefined> {\n const binaryName = getBinaryName();\n\n const powertoysDir = process.env.NSC_POWERTOYS_DIR;\n if (powertoysDir) {\n const powertoysPath = path.join(powertoysDir, binaryName);\n try {\n await io.which(powertoysPath, true);\n core.debug(`Found existing binary in powertoys: ${powertoysPath}`);\n return powertoysPath;\n } catch {\n core.debug(`Binary not found in powertoys dir: ${powertoysPath}`);\n }\n }\n\n try {\n const systemPath = await io.which(TOOL_NAME, true);\n core.debug(`Found existing binary on PATH: ${systemPath}`);\n return systemPath;\n } catch {\n core.debug(\"Binary not found on PATH\");\n }\n\n return undefined;\n}\n\nasync function getInstalledVersion(binPath: string): Promise<string> {\n const result = await exec(binPath, [\"version\"]);\n\n try {\n const parsed = JSON.parse(result.stdout.trim());\n return normalizeVersion(parsed.version);\n } catch (error) {\n core.debug(`Failed to parse version output: ${error}`);\n throw new SpacectlInstallError(`Failed to validate binary at ${binPath}`, \"EXEC_FAILED\", error);\n }\n}\n\nfunction getDownloadUrl(version: string): string {\n const platform = getPlatform();\n const arch = getArch();\n const filename = `${TOOL_NAME}_${version}_${platform}_${arch}.tar.gz`;\n return `https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/v${version}/${filename}`;\n}\n\nasync function downloadAndCache(version: string, token?: string): Promise<string> {\n const platform = getPlatform();\n const arch = getArch();\n const url = getDownloadUrl(version);\n\n core.info(`Downloading spacectl ${version} from ${url}`);\n\n let archivePath: string;\n try {\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `token ${token}`;\n }\n archivePath = await tc.downloadTool(url, undefined, undefined, headers);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to download spacectl ${version} for ${platform}/${arch}`,\n \"DOWNLOAD_FAILED\",\n error\n );\n }\n\n const extractedPath = await tc.extractTar(archivePath);\n const cachedPath = await tc.cacheDir(extractedPath, TOOL_NAME, version, arch);\n\n core.info(`Cached spacectl ${version} to ${cachedPath}`);\n return cachedPath;\n}\n\nexport async function install(options: InstallOptions = {}): Promise<InstallResult> {\n const versionSpec = options.version ?? \"\";\n const token = options.githubToken ?? process.env.GITHUB_TOKEN;\n\n try {\n getPlatform();\n } catch (error) {\n throw new SpacectlInstallError(\n `Unsupported platform: ${process.platform}`,\n \"UNSUPPORTED_PLATFORM\",\n error\n );\n }\n\n const arch = getArch();\n const binaryName = getBinaryName();\n\n if (versionSpec === \"\") {\n const existingPath = await findExistingBinary();\n if (existingPath) {\n const version = await getInstalledVersion(existingPath);\n core.info(`Using existing spacectl ${version} at ${existingPath}`);\n return {\n binPath: existingPath,\n version,\n };\n }\n core.info(\"No existing spacectl found, downloading latest version\");\n }\n\n let targetVersion: string;\n try {\n targetVersion =\n versionSpec === \"\"\n ? await resolveVersion(\"latest\", token)\n : await resolveVersion(versionSpec, token);\n } catch (error) {\n throw new SpacectlInstallError(\n `Failed to resolve version \"${versionSpec}\"`,\n \"RESOLVE_VERSION_FAILED\",\n error\n );\n }\n\n const cached = tc.find(TOOL_NAME, targetVersion, arch);\n if (cached) {\n const binPath = path.join(cached, binaryName);\n core.info(`Using cached spacectl ${targetVersion} at ${cached}`);\n return {\n binPath,\n version: targetVersion,\n };\n }\n\n const cachedDir = await downloadAndCache(targetVersion, token);\n const binPath = path.join(cachedDir, binaryName);\n\n await getInstalledVersion(binPath);\n\n return {\n binPath,\n version: targetVersion,\n };\n}\n"],"mappings":"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"}
|