@buildspacestudio/cli 0.2.0
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/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +350 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +389 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +102 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +2 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +343 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/env.d.ts +2 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +204 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +118 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +106 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +75 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/app.d.ts +28 -0
- package/dist/lib/app.d.ts.map +1 -0
- package/dist/lib/app.js +132 -0
- package/dist/lib/app.js.map +1 -0
- package/dist/lib/args.d.ts +3 -0
- package/dist/lib/args.d.ts.map +1 -0
- package/dist/lib/args.js +16 -0
- package/dist/lib/args.js.map +1 -0
- package/dist/lib/auth.d.ts +9 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +21 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +23 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +72 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/git.d.ts +8 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +63 -0
- package/dist/lib/git.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { hostname as getHostname } from "node:os";
|
|
5
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
6
|
+
import { createInterface } from "node:readline/promises";
|
|
7
|
+
import { hasFlag, readFlag } from "../lib/args.js";
|
|
8
|
+
import { getConfigPath, maskToken, readConfig, resolveApiBaseUrl, resolveGitBaseUrl, writeConfig, } from "../lib/config.js";
|
|
9
|
+
const CLI_LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
|
|
10
|
+
const DEFAULT_TOKEN_EXPIRY_DAYS = 30;
|
|
11
|
+
const CALLBACK_HOST = "127.0.0.1";
|
|
12
|
+
function printUsage() {
|
|
13
|
+
console.log("Usage: buildspace auth <login|set|show|clear> [options]");
|
|
14
|
+
console.log("");
|
|
15
|
+
console.log("Commands:");
|
|
16
|
+
console.log(" login Sign in via browser and save a PAT");
|
|
17
|
+
console.log(" set Store a personal access token");
|
|
18
|
+
console.log(" show Show configured token (masked)");
|
|
19
|
+
console.log(" clear Remove configured token");
|
|
20
|
+
console.log("");
|
|
21
|
+
console.log("Options for `login`:");
|
|
22
|
+
console.log(" --url <api> Override API base URL and save it");
|
|
23
|
+
console.log(" --git-url <git> Override Git base URL and save it");
|
|
24
|
+
console.log(" --name <token-name> PAT display name (default: CLI on <hostname>)");
|
|
25
|
+
console.log(" --expires-days <n> PAT expiry in days (default: 30)");
|
|
26
|
+
console.log(" --timeout <seconds> Login wait timeout (default: 300)");
|
|
27
|
+
console.log(" --no-open Print URL instead of opening browser");
|
|
28
|
+
console.log("");
|
|
29
|
+
console.log("Options for `set`:");
|
|
30
|
+
console.log(" --token <value> PAT value (otherwise interactive prompt)");
|
|
31
|
+
}
|
|
32
|
+
function printLoginUsage() {
|
|
33
|
+
console.log("Usage: buildspace auth login [options]");
|
|
34
|
+
console.log("");
|
|
35
|
+
console.log("Options:");
|
|
36
|
+
console.log(" --url <api> Override API base URL and save it");
|
|
37
|
+
console.log(" --git-url <git> Override Git base URL and save it");
|
|
38
|
+
console.log(" --name <token-name> PAT display name (default: CLI on <hostname>)");
|
|
39
|
+
console.log(" --expires-days <n> PAT expiry in days (default: 30)");
|
|
40
|
+
console.log(" --timeout <seconds> Login wait timeout (default: 300)");
|
|
41
|
+
console.log(" --no-open Print URL instead of opening browser");
|
|
42
|
+
}
|
|
43
|
+
function base64Url(input) {
|
|
44
|
+
return input.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
45
|
+
}
|
|
46
|
+
function normalizeUrl(value) {
|
|
47
|
+
const parsed = new URL(value.trim());
|
|
48
|
+
return parsed.toString().replace(/\/+$/g, "");
|
|
49
|
+
}
|
|
50
|
+
function resolveTokenName(raw) {
|
|
51
|
+
if (raw?.trim()) {
|
|
52
|
+
return raw.trim();
|
|
53
|
+
}
|
|
54
|
+
return `CLI on ${getHostname()}`;
|
|
55
|
+
}
|
|
56
|
+
function parseExpiresDays(raw) {
|
|
57
|
+
if (!raw) {
|
|
58
|
+
return DEFAULT_TOKEN_EXPIRY_DAYS;
|
|
59
|
+
}
|
|
60
|
+
const value = Number.parseInt(raw, 10);
|
|
61
|
+
if (!Number.isFinite(value) || value <= 0 || value > 3650) {
|
|
62
|
+
throw new Error("Invalid --expires-days value. Use a positive integer up to 3650.");
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function parseTimeoutMs(raw) {
|
|
67
|
+
if (!raw) {
|
|
68
|
+
return CLI_LOGIN_TIMEOUT_MS;
|
|
69
|
+
}
|
|
70
|
+
const value = Number.parseInt(raw, 10);
|
|
71
|
+
if (!Number.isFinite(value) || value <= 0 || value > 3600) {
|
|
72
|
+
throw new Error("Invalid --timeout value. Use seconds between 1 and 3600.");
|
|
73
|
+
}
|
|
74
|
+
return value * 1000;
|
|
75
|
+
}
|
|
76
|
+
function openBrowser(url) {
|
|
77
|
+
const platform = process.platform;
|
|
78
|
+
let command = "";
|
|
79
|
+
let args = [];
|
|
80
|
+
if (platform === "darwin") {
|
|
81
|
+
command = "open";
|
|
82
|
+
args = [url];
|
|
83
|
+
}
|
|
84
|
+
else if (platform === "win32") {
|
|
85
|
+
command = "cmd";
|
|
86
|
+
args = ["/c", "start", "", url];
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
command = "xdg-open";
|
|
90
|
+
args = [url];
|
|
91
|
+
}
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const child = spawn(command, args, {
|
|
94
|
+
stdio: "ignore",
|
|
95
|
+
detached: true,
|
|
96
|
+
});
|
|
97
|
+
let resolved = false;
|
|
98
|
+
child.on("error", () => {
|
|
99
|
+
if (!resolved) {
|
|
100
|
+
resolved = true;
|
|
101
|
+
resolve(false);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
child.on("spawn", () => {
|
|
105
|
+
if (!resolved) {
|
|
106
|
+
resolved = true;
|
|
107
|
+
child.unref();
|
|
108
|
+
resolve(true);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function createPkceVerifier() {
|
|
114
|
+
return base64Url(randomBytes(64));
|
|
115
|
+
}
|
|
116
|
+
function createPkceChallenge(verifier) {
|
|
117
|
+
return base64Url(createHash("sha256").update(verifier).digest());
|
|
118
|
+
}
|
|
119
|
+
function startCallbackServer() {
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
let settled = false;
|
|
122
|
+
let responseResolver = null;
|
|
123
|
+
let pendingResult = null;
|
|
124
|
+
const server = createServer((request, response) => {
|
|
125
|
+
const requestUrl = new URL(request.url ?? "/", `http://${CALLBACK_HOST}`);
|
|
126
|
+
if (requestUrl.pathname !== "/callback") {
|
|
127
|
+
response.statusCode = 404;
|
|
128
|
+
response.end("Not found");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const code = requestUrl.searchParams.get("code") ?? "";
|
|
132
|
+
const returnedState = requestUrl.searchParams.get("state") ?? "";
|
|
133
|
+
const error = requestUrl.searchParams.get("error");
|
|
134
|
+
const result = { code, error, state: returnedState };
|
|
135
|
+
if (responseResolver) {
|
|
136
|
+
const resolver = responseResolver;
|
|
137
|
+
responseResolver = null;
|
|
138
|
+
resolver(result);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
pendingResult = result;
|
|
142
|
+
}
|
|
143
|
+
response.statusCode = 200;
|
|
144
|
+
response.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
145
|
+
response.end("<!doctype html><html><body><h1>BuildSpace CLI login complete</h1><p>You can return to your terminal.</p></body></html>");
|
|
146
|
+
});
|
|
147
|
+
server.on("error", (error) => {
|
|
148
|
+
if (!settled) {
|
|
149
|
+
settled = true;
|
|
150
|
+
reject(error);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
server.listen(0, CALLBACK_HOST, () => {
|
|
154
|
+
const address = server.address();
|
|
155
|
+
if (!(address && typeof address === "object")) {
|
|
156
|
+
reject(new Error("Failed to start local callback server."));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const redirectUri = `http://${CALLBACK_HOST}:${address.port}/callback`;
|
|
160
|
+
settled = true;
|
|
161
|
+
resolve({
|
|
162
|
+
redirectUri,
|
|
163
|
+
awaitResult: (timeoutMs) => new Promise((resolveResult, rejectResult) => {
|
|
164
|
+
if (pendingResult) {
|
|
165
|
+
const result = pendingResult;
|
|
166
|
+
pendingResult = null;
|
|
167
|
+
resolveResult(result);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const timeout = setTimeout(() => {
|
|
171
|
+
responseResolver = null;
|
|
172
|
+
rejectResult(new Error("Login timed out while waiting for browser callback."));
|
|
173
|
+
}, timeoutMs);
|
|
174
|
+
responseResolver = (value) => {
|
|
175
|
+
clearTimeout(timeout);
|
|
176
|
+
resolveResult(value);
|
|
177
|
+
};
|
|
178
|
+
}),
|
|
179
|
+
close: () => new Promise((resolveClose, rejectClose) => {
|
|
180
|
+
server.close((error) => {
|
|
181
|
+
if (error) {
|
|
182
|
+
rejectClose(error);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
resolveClose();
|
|
186
|
+
});
|
|
187
|
+
}),
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function exchangeCliLoginCode(input) {
|
|
193
|
+
const response = await fetch(new URL("/api/v1/auth/cli/exchange", `${input.apiBaseUrl}/`), {
|
|
194
|
+
method: "POST",
|
|
195
|
+
headers: {
|
|
196
|
+
"Content-Type": "application/json",
|
|
197
|
+
},
|
|
198
|
+
body: JSON.stringify({
|
|
199
|
+
code: input.code,
|
|
200
|
+
codeVerifier: input.codeVerifier,
|
|
201
|
+
redirectUri: input.redirectUri,
|
|
202
|
+
}),
|
|
203
|
+
});
|
|
204
|
+
const payload = (await response.json().catch(() => null));
|
|
205
|
+
if (!(response.ok && payload?.token)) {
|
|
206
|
+
throw new Error(payload?.error ?? `Failed to complete login (${response.status})`);
|
|
207
|
+
}
|
|
208
|
+
return payload.token;
|
|
209
|
+
}
|
|
210
|
+
async function runInteractiveLogin(args) {
|
|
211
|
+
if (hasFlag(args, "--help", "-h", "help")) {
|
|
212
|
+
printLoginUsage();
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
const existingConfig = await readConfig();
|
|
216
|
+
const apiOverrideRaw = readFlag(args, "--url");
|
|
217
|
+
const gitOverrideRaw = readFlag(args, "--git-url");
|
|
218
|
+
const noOpen = args.includes("--no-open");
|
|
219
|
+
let apiBaseUrl = resolveApiBaseUrl(existingConfig);
|
|
220
|
+
let gitBaseUrl = resolveGitBaseUrl(existingConfig);
|
|
221
|
+
try {
|
|
222
|
+
if (apiOverrideRaw) {
|
|
223
|
+
apiBaseUrl = normalizeUrl(apiOverrideRaw);
|
|
224
|
+
}
|
|
225
|
+
if (gitOverrideRaw) {
|
|
226
|
+
gitBaseUrl = normalizeUrl(gitOverrideRaw);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
console.error("Invalid URL passed to --url or --git-url.");
|
|
231
|
+
return 1;
|
|
232
|
+
}
|
|
233
|
+
let expiresDays = DEFAULT_TOKEN_EXPIRY_DAYS;
|
|
234
|
+
let timeoutMs = CLI_LOGIN_TIMEOUT_MS;
|
|
235
|
+
try {
|
|
236
|
+
expiresDays = parseExpiresDays(readFlag(args, "--expires-days"));
|
|
237
|
+
timeoutMs = parseTimeoutMs(readFlag(args, "--timeout"));
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
console.error(error instanceof Error ? error.message : "Invalid login options");
|
|
241
|
+
return 1;
|
|
242
|
+
}
|
|
243
|
+
const tokenName = resolveTokenName(readFlag(args, "--name"));
|
|
244
|
+
const state = base64Url(randomBytes(24));
|
|
245
|
+
const codeVerifier = createPkceVerifier();
|
|
246
|
+
const codeChallenge = createPkceChallenge(codeVerifier);
|
|
247
|
+
const callbackServer = await startCallbackServer().catch((error) => {
|
|
248
|
+
const message = error instanceof Error ? error.message : "Failed to start callback server";
|
|
249
|
+
throw new Error(`${message}. Make sure local ports are available.`);
|
|
250
|
+
});
|
|
251
|
+
try {
|
|
252
|
+
const authorizeUrl = new URL("/auth/cli/authorize", `${apiBaseUrl}/`);
|
|
253
|
+
authorizeUrl.searchParams.set("state", state);
|
|
254
|
+
authorizeUrl.searchParams.set("code_challenge", codeChallenge);
|
|
255
|
+
authorizeUrl.searchParams.set("redirect_uri", callbackServer.redirectUri);
|
|
256
|
+
authorizeUrl.searchParams.set("name", tokenName);
|
|
257
|
+
authorizeUrl.searchParams.set("expires_days", String(expiresDays));
|
|
258
|
+
console.log("Starting browser login...");
|
|
259
|
+
console.log(`API URL: ${apiBaseUrl}`);
|
|
260
|
+
console.log(`Git URL: ${gitBaseUrl}`);
|
|
261
|
+
if (noOpen) {
|
|
262
|
+
console.log("Open this URL in your browser to continue:");
|
|
263
|
+
console.log(authorizeUrl.toString());
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
const opened = await openBrowser(authorizeUrl.toString());
|
|
267
|
+
if (!opened) {
|
|
268
|
+
console.log("Could not open browser automatically. Open this URL manually:");
|
|
269
|
+
console.log(authorizeUrl.toString());
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const callback = await callbackServer.awaitResult(timeoutMs);
|
|
273
|
+
if (callback.error) {
|
|
274
|
+
console.error(`Login failed: ${callback.error}`);
|
|
275
|
+
return 1;
|
|
276
|
+
}
|
|
277
|
+
if (callback.state !== state) {
|
|
278
|
+
console.error("Login failed: state mismatch.");
|
|
279
|
+
return 1;
|
|
280
|
+
}
|
|
281
|
+
if (!callback.code) {
|
|
282
|
+
console.error("Login failed: missing auth code.");
|
|
283
|
+
return 1;
|
|
284
|
+
}
|
|
285
|
+
const token = await exchangeCliLoginCode({
|
|
286
|
+
apiBaseUrl,
|
|
287
|
+
code: callback.code,
|
|
288
|
+
codeVerifier,
|
|
289
|
+
redirectUri: callbackServer.redirectUri,
|
|
290
|
+
});
|
|
291
|
+
await writeConfig({
|
|
292
|
+
...existingConfig,
|
|
293
|
+
apiBaseUrl,
|
|
294
|
+
gitBaseUrl,
|
|
295
|
+
pat: token,
|
|
296
|
+
updatedAt: new Date().toISOString(),
|
|
297
|
+
});
|
|
298
|
+
console.log("BuildSpace CLI login complete.");
|
|
299
|
+
console.log(`Token: ${maskToken(token)}`);
|
|
300
|
+
console.log(`Config: ${getConfigPath()}`);
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
const message = error instanceof Error ? error.message : "CLI login failed";
|
|
305
|
+
console.error(message);
|
|
306
|
+
return 1;
|
|
307
|
+
}
|
|
308
|
+
finally {
|
|
309
|
+
await callbackServer.close().catch(() => undefined);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async function resolveTokenFromPrompt() {
|
|
313
|
+
const rl = createInterface({ input, output });
|
|
314
|
+
try {
|
|
315
|
+
const answer = await rl.question("Enter BuildSpace PAT: ");
|
|
316
|
+
return answer.trim();
|
|
317
|
+
}
|
|
318
|
+
finally {
|
|
319
|
+
rl.close();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
async function setAuth(args) {
|
|
323
|
+
const fromFlag = readFlag(args, "--token");
|
|
324
|
+
const token = (fromFlag ?? (await resolveTokenFromPrompt())).trim();
|
|
325
|
+
if (token.length === 0) {
|
|
326
|
+
console.error("No token provided. Run `buildspace auth set --token <bs_pat_...>`.");
|
|
327
|
+
return 1;
|
|
328
|
+
}
|
|
329
|
+
const current = await readConfig();
|
|
330
|
+
await writeConfig({
|
|
331
|
+
...current,
|
|
332
|
+
pat: token,
|
|
333
|
+
updatedAt: new Date().toISOString(),
|
|
334
|
+
});
|
|
335
|
+
console.log("BuildSpace token saved.");
|
|
336
|
+
console.log(`Config: ${getConfigPath()}`);
|
|
337
|
+
return 0;
|
|
338
|
+
}
|
|
339
|
+
async function showAuth() {
|
|
340
|
+
const config = await readConfig();
|
|
341
|
+
if (!config.pat) {
|
|
342
|
+
console.log("No BuildSpace token configured.");
|
|
343
|
+
console.log("Run: buildspace auth set");
|
|
344
|
+
return 1;
|
|
345
|
+
}
|
|
346
|
+
console.log(`Token: ${maskToken(config.pat)}`);
|
|
347
|
+
console.log(`API URL: ${resolveApiBaseUrl(config)}`);
|
|
348
|
+
console.log(`Git URL: ${resolveGitBaseUrl(config)}`);
|
|
349
|
+
console.log(`Config: ${getConfigPath()}`);
|
|
350
|
+
return 0;
|
|
351
|
+
}
|
|
352
|
+
async function clearAuth() {
|
|
353
|
+
const config = await readConfig();
|
|
354
|
+
if (!config.pat) {
|
|
355
|
+
console.log("No BuildSpace token configured.");
|
|
356
|
+
return 0;
|
|
357
|
+
}
|
|
358
|
+
await writeConfig({
|
|
359
|
+
...config,
|
|
360
|
+
pat: undefined,
|
|
361
|
+
updatedAt: new Date().toISOString(),
|
|
362
|
+
});
|
|
363
|
+
console.log("BuildSpace token cleared.");
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
export async function runAuthCommand(args) {
|
|
367
|
+
const subcommand = args[0];
|
|
368
|
+
switch (subcommand) {
|
|
369
|
+
case "login":
|
|
370
|
+
return await runInteractiveLogin(args.slice(1));
|
|
371
|
+
case "set":
|
|
372
|
+
return await setAuth(args.slice(1));
|
|
373
|
+
case "show":
|
|
374
|
+
return await showAuth();
|
|
375
|
+
case "clear":
|
|
376
|
+
return await clearAuth();
|
|
377
|
+
case undefined:
|
|
378
|
+
case "help":
|
|
379
|
+
case "--help":
|
|
380
|
+
case "-h":
|
|
381
|
+
printUsage();
|
|
382
|
+
return 0;
|
|
383
|
+
default:
|
|
384
|
+
console.error(`Unknown auth subcommand: ${subcommand}`);
|
|
385
|
+
printUsage();
|
|
386
|
+
return 1;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAwGA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BtE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { hasFlag, readFlag } from "../lib/args.js";
|
|
2
|
+
import { getConfigPath, getDefaultApiBaseUrl, getDefaultGitBaseUrl, readConfig, resolveApiBaseUrl, resolveGitBaseUrl, writeConfig, } from "../lib/config.js";
|
|
3
|
+
const TRAILING_SLASH_REGEX = /\/$/;
|
|
4
|
+
function printUsage() {
|
|
5
|
+
console.log("Usage: buildspace config <show|set-url|reset>");
|
|
6
|
+
console.log("");
|
|
7
|
+
console.log("Commands:");
|
|
8
|
+
console.log(" show Show current CLI config");
|
|
9
|
+
console.log(" set-url --url <api> [--git-url <git>] Set API/Git base URLs");
|
|
10
|
+
console.log(" reset Reset URLs to defaults");
|
|
11
|
+
}
|
|
12
|
+
function normalizeUrl(value) {
|
|
13
|
+
const parsed = new URL(value.trim());
|
|
14
|
+
return parsed.toString().replace(TRAILING_SLASH_REGEX, "");
|
|
15
|
+
}
|
|
16
|
+
function showConfigDetails(input) {
|
|
17
|
+
console.log(`API URL: ${input.apiBaseUrl}`);
|
|
18
|
+
console.log(`Git URL: ${input.gitBaseUrl}`);
|
|
19
|
+
console.log(`Token configured: ${input.hasPat ? "yes" : "no"}`);
|
|
20
|
+
console.log(`Active app: ${input.activeApp ? `${input.activeApp.name} (${input.activeApp.slug})` : "none"}`);
|
|
21
|
+
console.log(`Config: ${getConfigPath()}`);
|
|
22
|
+
}
|
|
23
|
+
async function showConfig() {
|
|
24
|
+
const config = await readConfig();
|
|
25
|
+
showConfigDetails({
|
|
26
|
+
activeApp: config.activeApp ?? null,
|
|
27
|
+
apiBaseUrl: resolveApiBaseUrl(config),
|
|
28
|
+
gitBaseUrl: resolveGitBaseUrl(config),
|
|
29
|
+
hasPat: Boolean(config.pat),
|
|
30
|
+
});
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
async function setUrl(args) {
|
|
34
|
+
const apiUrl = readFlag(args, "--url");
|
|
35
|
+
const gitUrl = readFlag(args, "--git-url");
|
|
36
|
+
if (!apiUrl) {
|
|
37
|
+
console.error("Missing required --url <api-base-url>.");
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
let normalizedApiUrl = "";
|
|
41
|
+
let normalizedGitUrl = null;
|
|
42
|
+
try {
|
|
43
|
+
normalizedApiUrl = normalizeUrl(apiUrl);
|
|
44
|
+
normalizedGitUrl = gitUrl ? normalizeUrl(gitUrl) : null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.error("Invalid URL provided. Example: --url https://buildspace.studio");
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
const config = await readConfig();
|
|
51
|
+
await writeConfig({
|
|
52
|
+
...config,
|
|
53
|
+
apiBaseUrl: normalizedApiUrl,
|
|
54
|
+
gitBaseUrl: normalizedGitUrl ?? config.gitBaseUrl,
|
|
55
|
+
updatedAt: new Date().toISOString(),
|
|
56
|
+
});
|
|
57
|
+
console.log("BuildSpace CLI URLs updated.");
|
|
58
|
+
showConfigDetails({
|
|
59
|
+
activeApp: config.activeApp ?? null,
|
|
60
|
+
apiBaseUrl: normalizedApiUrl,
|
|
61
|
+
gitBaseUrl: normalizedGitUrl ?? resolveGitBaseUrl(config),
|
|
62
|
+
hasPat: Boolean(config.pat),
|
|
63
|
+
});
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
async function resetConfig() {
|
|
67
|
+
const config = await readConfig();
|
|
68
|
+
await writeConfig({
|
|
69
|
+
...config,
|
|
70
|
+
apiBaseUrl: getDefaultApiBaseUrl(),
|
|
71
|
+
gitBaseUrl: getDefaultGitBaseUrl(),
|
|
72
|
+
updatedAt: new Date().toISOString(),
|
|
73
|
+
});
|
|
74
|
+
console.log("BuildSpace CLI URLs reset to defaults.");
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
export async function runConfigCommand(args) {
|
|
78
|
+
const subcommand = args[0];
|
|
79
|
+
if (subcommand && hasFlag(args, "--help", "-h", "help")) {
|
|
80
|
+
printUsage();
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
switch (subcommand) {
|
|
84
|
+
case "show":
|
|
85
|
+
return await showConfig();
|
|
86
|
+
case "set-url":
|
|
87
|
+
return await setUrl(args.slice(1));
|
|
88
|
+
case "reset":
|
|
89
|
+
return await resetConfig();
|
|
90
|
+
case undefined:
|
|
91
|
+
case "help":
|
|
92
|
+
case "--help":
|
|
93
|
+
case "-h":
|
|
94
|
+
printUsage();
|
|
95
|
+
return 0;
|
|
96
|
+
default:
|
|
97
|
+
console.error(`Unknown config subcommand: ${subcommand}`);
|
|
98
|
+
printUsage();
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAEnC,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAK1B;IACC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CACT,eAAe,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAChG,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,iBAAiB,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;QACnC,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC;QACrC,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,IAAI,CAAC;QACH,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,WAAW,CAAC;QAChB,GAAG,MAAM;QACT,UAAU,EAAE,gBAAgB;QAC5B,UAAU,EAAE,gBAAgB,IAAI,MAAM,CAAC,UAAU;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,iBAAiB,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;QACnC,UAAU,EAAE,gBAAgB;QAC5B,UAAU,EAAE,gBAAgB,IAAI,iBAAiB,CAAC,MAAM,CAAC;QACzD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;KAC5B,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,WAAW,CAAC;QAChB,GAAG,MAAM;QACT,UAAU,EAAE,oBAAoB,EAAE;QAClC,UAAU,EAAE,oBAAoB,EAAE;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QACxD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,MAAM,UAAU,EAAE,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,OAAO;YACV,OAAO,MAAM,WAAW,EAAE,CAAC;QAC7B,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;YAC1D,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAucA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhE"}
|