@cimplify/cli 0.3.1 → 0.4.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/{add-OUMIT4YX.mjs → add-KKIYBATR.mjs} +2 -2
- package/dist/{assets-DMK2QOPD.mjs → assets-EBEMMENZ.mjs} +3 -3
- package/dist/auth-step-up-BIUYQJP6.mjs +82 -0
- package/dist/{chunk-IQJ45AK3.mjs → chunk-ASZVWVMM.mjs} +1 -1
- package/dist/{chunk-YI7UMMM7.mjs → chunk-DBZ3UOQ2.mjs} +1 -1
- package/dist/{chunk-I3XQSSOT.mjs → chunk-E2T2SBP5.mjs} +6 -2
- package/dist/{login-7O7ZXKU3.mjs → chunk-GLXONXS3.mjs} +10 -126
- package/dist/{chunk-RZQTHTXX.mjs → chunk-ITAFAORS.mjs} +1 -1
- package/dist/{chunk-RRY3NEZZ.mjs → chunk-K5464A3L.mjs} +1 -1
- package/dist/{chunk-D7WMSGKK.mjs → chunk-MAOO6ZZ5.mjs} +22 -3
- package/dist/{chunk-QGBXGDA5.mjs → chunk-R3FDBXR6.mjs} +4 -4
- package/dist/{chunk-I6P3I2YJ.mjs → chunk-SDSOORT6.mjs} +5 -5
- package/dist/{chunk-LS2VTSMQ.mjs → chunk-UBAI443T.mjs} +9 -2
- package/dist/{chunk-MOZQODQS.mjs → chunk-VTR5R5NQ.mjs} +1 -1
- package/dist/{deploy-UKOOPJAE.mjs → deploy-3IFXUWPM.mjs} +7 -7
- package/dist/{dev-FD4PM3UD.mjs → dev-ONW2S77K.mjs} +4 -4
- package/dist/dispatcher.mjs +38 -25
- package/dist/{doctor-AY7VDIJZ.mjs → doctor-BC6CMVRW.mjs} +8 -8
- package/dist/{domains-JQMV6GAP.mjs → domains-AHH56CL7.mjs} +4 -4
- package/dist/{env-EVMYQUIK.mjs → env-7ISJ73YI.mjs} +5 -5
- package/dist/{explain-QZVAK5I3.mjs → explain-MZOCDFZE.mjs} +2 -2
- package/dist/introspect-IVI65FEV.mjs +8 -0
- package/dist/{link-X3E4UZBF.mjs → link-DZSILT5N.mjs} +3 -3
- package/dist/{list-TEQ73IR7.mjs → list-JOQRPYX4.mjs} +1 -1
- package/dist/login-3OD4ND2H.mjs +153 -0
- package/dist/{logout-DJDINVDF.mjs → logout-3RLBZ33M.mjs} +2 -2
- package/dist/{logs-KUKGEXR2.mjs → logs-YNN2PQ24.mjs} +3 -3
- package/dist/{projects-364HGWHO.mjs → projects-JSEC2YCX.mjs} +3 -3
- package/dist/repo-WOBWKEAO.mjs +8 -0
- package/dist/{rollback-5YALPQXL.mjs → rollback-DD4RNRFM.mjs} +4 -4
- package/dist/{status-W4HW3CX3.mjs → status-JSYXM5RT.mjs} +3 -3
- package/dist/{unlink-HIIW57OO.mjs → unlink-RFK74SFP.mjs} +2 -2
- package/dist/{update-2DCENLHM.mjs → update-EDTG73FK.mjs} +3 -3
- package/dist/{whoami-LACWBSNL.mjs → whoami-DNZ7RUTH.mjs} +3 -3
- package/package.json +1 -1
- package/dist/introspect-MNTC26UY.mjs +0 -8
- package/dist/repo-26N2CHF6.mjs +0 -8
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { REGISTRY_INDEX, REGISTRY } from './chunk-42PFJBC6.mjs';
|
|
3
|
-
import { promptYesNo } from './chunk-
|
|
3
|
+
import { promptYesNo } from './chunk-ITAFAORS.mjs';
|
|
4
4
|
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
5
|
-
import { CliError, CLI_ERROR_CODE, info, bold, dim, success, result, yellow } from './chunk-
|
|
5
|
+
import { CliError, CLI_ERROR_CODE, info, bold, dim, success, result, yellow } from './chunk-E2T2SBP5.mjs';
|
|
6
6
|
import { mkdirSync, existsSync, writeFileSync } from 'fs';
|
|
7
7
|
import { resolve, join, dirname } from 'path';
|
|
8
8
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
3
|
-
import { ApiClient } from './chunk-
|
|
4
|
-
import { readAuth } from './chunk-
|
|
5
|
-
import { CliError, CLI_ERROR_CODE, step, yellow, dim, success, info, result, bold, green } from './chunk-
|
|
3
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
4
|
+
import { readAuth } from './chunk-UBAI443T.mjs';
|
|
5
|
+
import { CliError, CLI_ERROR_CODE, step, yellow, dim, success, info, result, bold, green } from './chunk-E2T2SBP5.mjs';
|
|
6
6
|
import { createHash } from 'crypto';
|
|
7
7
|
import { promises } from 'fs';
|
|
8
8
|
import path from 'path';
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { startLoopbackServer, generateState, openBrowser } from './chunk-GLXONXS3.mjs';
|
|
3
|
+
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
4
|
+
import { resolveBaseUrl } from './chunk-MAOO6ZZ5.mjs';
|
|
5
|
+
import { readAuth, writeStepUp } from './chunk-UBAI443T.mjs';
|
|
6
|
+
import { isJsonMode, CliError, CLI_ERROR_CODE, step, info, dim, success, result } from './chunk-E2T2SBP5.mjs';
|
|
7
|
+
|
|
8
|
+
// src/commands/auth-step-up.ts
|
|
9
|
+
var FLAG_NO_BROWSER = "no-browser";
|
|
10
|
+
var FLAG_BASE_URL = "base-url";
|
|
11
|
+
var STEP_UP_PATH = "/cli/step-up";
|
|
12
|
+
var STEP_UP_JWT_TTL_MS = 5 * 6e4;
|
|
13
|
+
var CALLBACK_TIMEOUT_MS = 10 * 6e4;
|
|
14
|
+
async function run(argv) {
|
|
15
|
+
if (isJsonMode()) {
|
|
16
|
+
throw new CliError(
|
|
17
|
+
CLI_ERROR_CODE.INTERACTIVE_REQUIRED,
|
|
18
|
+
"step-up needs an interactive browser; --json mode is unsupported.",
|
|
19
|
+
{ remediation: "Run from a terminal with a browser available." }
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
const args = parseArgs(argv);
|
|
23
|
+
const baseUrl = resolveBaseUrl(flagString(args, FLAG_BASE_URL));
|
|
24
|
+
const auth = await readAuth();
|
|
25
|
+
const dashboardUrl = deriveDashboardUrl(baseUrl);
|
|
26
|
+
const loopback = await startLoopbackServer(baseUrl);
|
|
27
|
+
const state = generateState();
|
|
28
|
+
const requestId = generateState();
|
|
29
|
+
const url = new URL(`${dashboardUrl}${STEP_UP_PATH}`);
|
|
30
|
+
url.searchParams.set("request_id", requestId);
|
|
31
|
+
url.searchParams.set("redirect_uri", loopback.redirectUri);
|
|
32
|
+
url.searchParams.set("state", state);
|
|
33
|
+
step("Opening browser for fresh-auth...");
|
|
34
|
+
info(dim(url.toString()));
|
|
35
|
+
if (!flagBool(args, FLAG_NO_BROWSER)) {
|
|
36
|
+
openBrowser(url.toString());
|
|
37
|
+
} else {
|
|
38
|
+
info("");
|
|
39
|
+
info(dim("Open the URL above in any browser to continue."));
|
|
40
|
+
}
|
|
41
|
+
let callback;
|
|
42
|
+
try {
|
|
43
|
+
callback = await loopback.awaitCallback(CALLBACK_TIMEOUT_MS);
|
|
44
|
+
} catch (err) {
|
|
45
|
+
loopback.close();
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
if (callback.state !== state) {
|
|
49
|
+
throw new CliError(
|
|
50
|
+
CLI_ERROR_CODE.UNAUTHORIZED,
|
|
51
|
+
"Step-up state mismatch. Possible CSRF attempt \u2014 try again."
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (!callback.step_up_token) {
|
|
55
|
+
throw new CliError(
|
|
56
|
+
CLI_ERROR_CODE.UNAUTHORIZED,
|
|
57
|
+
"Step-up callback missing step_up_token."
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const token = {
|
|
61
|
+
token: callback.step_up_token,
|
|
62
|
+
expiresAt: Date.now() + STEP_UP_JWT_TTL_MS,
|
|
63
|
+
savedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
64
|
+
};
|
|
65
|
+
await writeStepUp(token);
|
|
66
|
+
success(
|
|
67
|
+
`Step-up complete. Re-run your destructive command within ${Math.round(STEP_UP_JWT_TTL_MS / 6e4)} minutes.`
|
|
68
|
+
);
|
|
69
|
+
result({
|
|
70
|
+
step_up_active: true,
|
|
71
|
+
expires_at: new Date(token.expiresAt).toISOString(),
|
|
72
|
+
account: { id: auth.accountId }
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function deriveDashboardUrl(apiBaseUrl) {
|
|
76
|
+
return apiBaseUrl.replace(
|
|
77
|
+
/^https?:\/\/api\./,
|
|
78
|
+
(m) => m.replace("api.", "app.")
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export { run as default };
|
|
@@ -16,7 +16,9 @@ var CLI_ERROR_CODE = {
|
|
|
16
16
|
/** Operation needs interactive confirmation and the shell is non-interactive. */
|
|
17
17
|
INTERACTIVE_REQUIRED: "INTERACTIVE_REQUIRED",
|
|
18
18
|
/** Generic resource-not-found (e.g. unknown registry component, missing local fixture). */
|
|
19
|
-
NOT_FOUND: "NOT_FOUND"
|
|
19
|
+
NOT_FOUND: "NOT_FOUND",
|
|
20
|
+
/** Destructive op needs a fresh user re-auth — run `cimplify auth step-up`. */
|
|
21
|
+
STEP_UP_REQUIRED: "STEP_UP_REQUIRED"
|
|
20
22
|
};
|
|
21
23
|
var EXIT_CODE = {
|
|
22
24
|
OK: 0,
|
|
@@ -35,6 +37,7 @@ var EXIT_CODE = {
|
|
|
35
37
|
NOT_LOGGED_IN: 20,
|
|
36
38
|
AUTH_FAILED: 21,
|
|
37
39
|
UNAUTHORIZED: 22,
|
|
40
|
+
STEP_UP_REQUIRED: 23,
|
|
38
41
|
INVALID_INPUT: 30
|
|
39
42
|
};
|
|
40
43
|
var EXIT_CODE_FOR = {
|
|
@@ -51,7 +54,8 @@ var EXIT_CODE_FOR = {
|
|
|
51
54
|
UNAUTHORIZED: EXIT_CODE.UNAUTHORIZED,
|
|
52
55
|
TIMEOUT: EXIT_CODE.TIMEOUT,
|
|
53
56
|
INTERACTIVE_REQUIRED: EXIT_CODE.INTERACTIVE_REQUIRED,
|
|
54
|
-
NOT_FOUND: EXIT_CODE.NOT_FOUND
|
|
57
|
+
NOT_FOUND: EXIT_CODE.NOT_FOUND,
|
|
58
|
+
STEP_UP_REQUIRED: EXIT_CODE.STEP_UP_REQUIRED
|
|
55
59
|
};
|
|
56
60
|
var CliError = class extends Error {
|
|
57
61
|
code;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { resolveBaseUrl, ApiClient } from './chunk-D7WMSGKK.mjs';
|
|
4
|
-
import { writeAuth } from './chunk-LS2VTSMQ.mjs';
|
|
5
|
-
import { CliError, CLI_ERROR_CODE, success, result, isJsonMode, step, info, dim } from './chunk-I3XQSSOT.mjs';
|
|
6
|
-
import os from 'os';
|
|
2
|
+
import { CliError, CLI_ERROR_CODE } from './chunk-E2T2SBP5.mjs';
|
|
7
3
|
import { randomBytes, createHash } from 'crypto';
|
|
8
4
|
import { createServer } from 'http';
|
|
9
5
|
import { spawn } from 'child_process';
|
|
@@ -73,6 +69,7 @@ async function startLoopbackServer(apiBaseUrl) {
|
|
|
73
69
|
return;
|
|
74
70
|
}
|
|
75
71
|
const code = parsed.searchParams.get("code");
|
|
72
|
+
const stepUpToken = parsed.searchParams.get("step_up_token");
|
|
76
73
|
const state = parsed.searchParams.get("state");
|
|
77
74
|
const error = parsed.searchParams.get("error");
|
|
78
75
|
if (error) {
|
|
@@ -80,13 +77,17 @@ async function startLoopbackServer(apiBaseUrl) {
|
|
|
80
77
|
rejectCb?.(new CliError(CLI_ERROR_CODE.UNAUTHORIZED, `OAuth error: ${error}`));
|
|
81
78
|
return;
|
|
82
79
|
}
|
|
83
|
-
if (!
|
|
84
|
-
res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }).end(HTML_ERROR("Missing code or
|
|
80
|
+
if (!state || !code && !stepUpToken) {
|
|
81
|
+
res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" }).end(HTML_ERROR("Missing code or token in callback"));
|
|
85
82
|
rejectCb?.(new CliError(CLI_ERROR_CODE.UNAUTHORIZED, "Malformed callback"));
|
|
86
83
|
return;
|
|
87
84
|
}
|
|
88
85
|
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }).end(HTML_SUCCESS(apiBaseUrl));
|
|
89
|
-
resolveCb?.({
|
|
86
|
+
resolveCb?.({
|
|
87
|
+
code: code ?? void 0,
|
|
88
|
+
step_up_token: stepUpToken ?? void 0,
|
|
89
|
+
state
|
|
90
|
+
});
|
|
90
91
|
});
|
|
91
92
|
await new Promise((resolve, reject) => {
|
|
92
93
|
server.once("error", reject);
|
|
@@ -150,121 +151,4 @@ function openBrowser(url) {
|
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
|
|
153
|
-
|
|
154
|
-
var FLAG_API_KEY = "api-key";
|
|
155
|
-
var FLAG_BASE_URL = "base-url";
|
|
156
|
-
var FLAG_NO_BROWSER = "no-browser";
|
|
157
|
-
var ENDPOINT_AUTH_ME = "/v1/auth/me";
|
|
158
|
-
var ENDPOINT_CLI_START = "/v1/auth/cli/start";
|
|
159
|
-
var ENDPOINT_CLI_TOKEN = "/v1/auth/cli/token";
|
|
160
|
-
var KEY_PREFIX_DK = "dk_";
|
|
161
|
-
var KEY_PREFIX_SK = "sk_";
|
|
162
|
-
var PRODUCT_NAME = "cimplify-cli";
|
|
163
|
-
async function run(argv) {
|
|
164
|
-
const args = parseArgs(argv);
|
|
165
|
-
const baseUrl = resolveBaseUrl(flagString(args, FLAG_BASE_URL));
|
|
166
|
-
const explicitKey = flagString(args, FLAG_API_KEY);
|
|
167
|
-
if (explicitKey) {
|
|
168
|
-
await loginWithKey(baseUrl, explicitKey);
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
await loginWithBrowser(baseUrl, flagBool(args, FLAG_NO_BROWSER));
|
|
172
|
-
}
|
|
173
|
-
async function loginWithKey(baseUrl, apiKey) {
|
|
174
|
-
if (!apiKey.startsWith(KEY_PREFIX_DK) && !apiKey.startsWith(KEY_PREFIX_SK)) {
|
|
175
|
-
throw new CliError(
|
|
176
|
-
CLI_ERROR_CODE.INVALID_INPUT,
|
|
177
|
-
`API key must start with "${KEY_PREFIX_DK}" or "${KEY_PREFIX_SK}".`
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
const client = ApiClient.withKey(apiKey, baseUrl);
|
|
181
|
-
const me = await client.get(ENDPOINT_AUTH_ME);
|
|
182
|
-
await writeAuth({
|
|
183
|
-
apiKey,
|
|
184
|
-
apiBaseUrl: baseUrl,
|
|
185
|
-
accountId: me.id,
|
|
186
|
-
businessId: me.business_id,
|
|
187
|
-
email: me.email,
|
|
188
|
-
name: me.name,
|
|
189
|
-
savedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
190
|
-
});
|
|
191
|
-
success(`Logged in as ${me.email ?? me.name ?? me.id} (business ${me.business_id})`);
|
|
192
|
-
result({
|
|
193
|
-
logged_in: true,
|
|
194
|
-
account: { id: me.id, email: me.email ?? null, name: me.name ?? null },
|
|
195
|
-
business: { id: me.business_id },
|
|
196
|
-
method: "api_key"
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
async function loginWithBrowser(baseUrl, noBrowser) {
|
|
200
|
-
if (isJsonMode()) {
|
|
201
|
-
throw new CliError(
|
|
202
|
-
CLI_ERROR_CODE.INTERACTIVE_REQUIRED,
|
|
203
|
-
"browser login is not supported in --json mode",
|
|
204
|
-
{ remediation: "pass --api-key dk_\u2026 (create one in the dashboard or via `cimplify auth keys create`)" }
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
const pkce = generatePkcePair();
|
|
208
|
-
const state = generateState();
|
|
209
|
-
const loopback = await startLoopbackServer(baseUrl);
|
|
210
|
-
const startBody = {
|
|
211
|
-
code_challenge: pkce.codeChallenge,
|
|
212
|
-
code_challenge_method: pkce.codeChallengeMethod,
|
|
213
|
-
redirect_uri: loopback.redirectUri,
|
|
214
|
-
state,
|
|
215
|
-
client_meta: {
|
|
216
|
-
hostname: os.hostname(),
|
|
217
|
-
platform: process.platform,
|
|
218
|
-
arch: process.arch,
|
|
219
|
-
node_version: process.version,
|
|
220
|
-
product: PRODUCT_NAME
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
const unauthClient = ApiClient.unauthenticated(baseUrl);
|
|
224
|
-
const startResponse = await unauthClient.post(
|
|
225
|
-
ENDPOINT_CLI_START,
|
|
226
|
-
startBody
|
|
227
|
-
);
|
|
228
|
-
step("Opening browser to authorize this CLI...");
|
|
229
|
-
info(dim(startResponse.approval_url));
|
|
230
|
-
if (!noBrowser) {
|
|
231
|
-
openBrowser(startResponse.approval_url);
|
|
232
|
-
} else {
|
|
233
|
-
info("");
|
|
234
|
-
info(dim("Open the URL above in any browser to continue."));
|
|
235
|
-
}
|
|
236
|
-
let callback;
|
|
237
|
-
try {
|
|
238
|
-
callback = await loopback.awaitCallback(startResponse.expires_in_secs * 1e3);
|
|
239
|
-
} catch (err) {
|
|
240
|
-
loopback.close();
|
|
241
|
-
throw err;
|
|
242
|
-
}
|
|
243
|
-
if (callback.state !== state) {
|
|
244
|
-
throw new CliError(
|
|
245
|
-
CLI_ERROR_CODE.UNAUTHORIZED,
|
|
246
|
-
"OAuth state mismatch. Possible CSRF attempt \u2014 try again."
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
const token = await unauthClient.post(ENDPOINT_CLI_TOKEN, {
|
|
250
|
-
auth_code: callback.code,
|
|
251
|
-
code_verifier: pkce.codeVerifier,
|
|
252
|
-
redirect_uri: loopback.redirectUri
|
|
253
|
-
});
|
|
254
|
-
await writeAuth({
|
|
255
|
-
apiKey: token.access_token,
|
|
256
|
-
apiBaseUrl: baseUrl,
|
|
257
|
-
accountId: token.account_id,
|
|
258
|
-
businessId: token.business_id,
|
|
259
|
-
savedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
260
|
-
});
|
|
261
|
-
success(`Logged in (business ${token.business_id})`);
|
|
262
|
-
result({
|
|
263
|
-
logged_in: true,
|
|
264
|
-
account: { id: token.account_id, email: null, name: null },
|
|
265
|
-
business: { id: token.business_id },
|
|
266
|
-
method: "oauth_pkce"
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
export { run as default };
|
|
154
|
+
export { generatePkcePair, generateState, openBrowser, startLoopbackServer };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { isAutoYes, isInteractive, CliError, CLI_ERROR_CODE } from './chunk-
|
|
2
|
+
import { isAutoYes, isInteractive, CliError, CLI_ERROR_CODE } from './chunk-E2T2SBP5.mjs';
|
|
3
3
|
import readline from 'readline';
|
|
4
4
|
|
|
5
5
|
async function promptLine(question) {
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { CliError, CLI_ERROR_CODE } from './chunk-
|
|
2
|
+
import { CliError, CLI_ERROR_CODE } from './chunk-E2T2SBP5.mjs';
|
|
3
3
|
|
|
4
4
|
// src/api-client.ts
|
|
5
5
|
var DEFAULT_API_BASE_URL = "https://api.cimplify.io";
|
|
6
6
|
var ENV_API_BASE_URL = "CIMPLIFY_API_URL";
|
|
7
7
|
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
8
8
|
var HEADER_AUTHORIZATION = "Authorization";
|
|
9
|
+
var HEADER_STEP_UP = "X-Step-Up-Authorization";
|
|
9
10
|
var HEADER_CONTENT_TYPE = "Content-Type";
|
|
10
11
|
var HEADER_ACCEPT = "Accept";
|
|
11
12
|
var HEADER_USER_AGENT = "User-Agent";
|
|
@@ -25,12 +26,20 @@ var STATUS_SERVER_ERROR_MIN = 500;
|
|
|
25
26
|
var ApiClient = class _ApiClient {
|
|
26
27
|
baseUrl;
|
|
27
28
|
apiKey;
|
|
29
|
+
stepUpToken = null;
|
|
28
30
|
constructor(baseUrl, apiKey) {
|
|
29
31
|
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
30
32
|
this.apiKey = apiKey;
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
/** Attach a step-up JWT to subsequent requests via X-Step-Up-Authorization. */
|
|
35
|
+
withStepUp(token) {
|
|
36
|
+
this.stepUpToken = token;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
static fromAuth(auth, stepUpToken = null) {
|
|
40
|
+
const client = new _ApiClient(auth.apiBaseUrl, auth.apiKey);
|
|
41
|
+
if (stepUpToken) client.withStepUp(stepUpToken);
|
|
42
|
+
return client;
|
|
34
43
|
}
|
|
35
44
|
static unauthenticated(baseUrl = resolveBaseUrl()) {
|
|
36
45
|
return new _ApiClient(baseUrl, "");
|
|
@@ -59,6 +68,9 @@ var ApiClient = class _ApiClient {
|
|
|
59
68
|
if (this.apiKey) {
|
|
60
69
|
headers[HEADER_AUTHORIZATION] = `${BEARER_PREFIX}${this.apiKey}`;
|
|
61
70
|
}
|
|
71
|
+
if (this.stepUpToken) {
|
|
72
|
+
headers[HEADER_STEP_UP] = `${BEARER_PREFIX}${this.stepUpToken}`;
|
|
73
|
+
}
|
|
62
74
|
let payload;
|
|
63
75
|
if (body !== void 0) {
|
|
64
76
|
headers[HEADER_CONTENT_TYPE] = CONTENT_TYPE_JSON;
|
|
@@ -120,6 +132,13 @@ async function parseResponse(response) {
|
|
|
120
132
|
}
|
|
121
133
|
const code = mapStatusToCode(response.status);
|
|
122
134
|
const message = extractErrorMessage(body, response.status);
|
|
135
|
+
if (response.status === STATUS_UNAUTHORIZED && /step_up_required/i.test(message)) {
|
|
136
|
+
throw new CliError(
|
|
137
|
+
CLI_ERROR_CODE.STEP_UP_REQUIRED,
|
|
138
|
+
"This action requires fresh re-authentication. Run `cimplify auth step-up`, then retry.",
|
|
139
|
+
{ remediation: "cimplify auth step-up" }
|
|
140
|
+
);
|
|
141
|
+
}
|
|
123
142
|
throw new CliError(code, message);
|
|
124
143
|
}
|
|
125
144
|
function mapStatusToCode(status) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { promptYesNo } from './chunk-
|
|
2
|
+
import { promptYesNo } from './chunk-ITAFAORS.mjs';
|
|
3
3
|
import { TOKEN_PURPOSE, REPO_PROVIDER, REPO_PROVIDER_VALUES } from './chunk-MXYUAJEW.mjs';
|
|
4
4
|
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
5
|
-
import { ApiClient } from './chunk-
|
|
6
|
-
import { readAuth, readProjectLink } from './chunk-
|
|
7
|
-
import { CliError, CLI_ERROR_CODE, isJsonMode, result, dim, success, info, bold } from './chunk-
|
|
5
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
6
|
+
import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
|
|
7
|
+
import { CliError, CLI_ERROR_CODE, isJsonMode, result, dim, success, info, bold } from './chunk-E2T2SBP5.mjs';
|
|
8
8
|
|
|
9
9
|
// src/commands/repo.ts
|
|
10
10
|
var SUB_PROVISION = "provision";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { gitDetectRoot, gitCurrentBranch, gitCurrentSha, gitStatusPorcelain } from './chunk-
|
|
3
|
-
import { parseEnvFile } from './chunk-
|
|
4
|
-
import { package_default } from './chunk-
|
|
2
|
+
import { gitDetectRoot, gitCurrentBranch, gitCurrentSha, gitStatusPorcelain } from './chunk-K5464A3L.mjs';
|
|
3
|
+
import { parseEnvFile } from './chunk-DBZ3UOQ2.mjs';
|
|
4
|
+
import { package_default } from './chunk-ASZVWVMM.mjs';
|
|
5
5
|
import { parseArgs } from './chunk-C4M3DXKC.mjs';
|
|
6
|
-
import { readAuthOrNull, readProjectLinkOrNull, readProjectState } from './chunk-
|
|
7
|
-
import { bold, dim, yellow, green, info, result, red } from './chunk-
|
|
6
|
+
import { readAuthOrNull, readProjectLinkOrNull, readProjectState } from './chunk-UBAI443T.mjs';
|
|
7
|
+
import { bold, dim, yellow, green, info, result, red } from './chunk-E2T2SBP5.mjs';
|
|
8
8
|
import { promises } from 'fs';
|
|
9
9
|
import path from 'path';
|
|
10
10
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { CliError, CLI_ERROR_CODE } from './chunk-
|
|
2
|
+
import { CliError, CLI_ERROR_CODE } from './chunk-E2T2SBP5.mjs';
|
|
3
3
|
import { promises } from 'fs';
|
|
4
4
|
import os from 'os';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
|
|
7
7
|
var AUTH_FILE_NAME = "auth.json";
|
|
8
|
+
var STEP_UP_FILE_NAME = "step-up.json";
|
|
8
9
|
var PROJECT_FILE_NAME = "project.json";
|
|
9
10
|
var STATE_FILE_NAME = "state.json";
|
|
10
11
|
var PROJECT_DIR_NAME = ".cimplify";
|
|
@@ -24,6 +25,9 @@ function authConfigDir() {
|
|
|
24
25
|
function authConfigPath() {
|
|
25
26
|
return path.join(authConfigDir(), AUTH_FILE_NAME);
|
|
26
27
|
}
|
|
28
|
+
function stepUpConfigPath() {
|
|
29
|
+
return path.join(authConfigDir(), STEP_UP_FILE_NAME);
|
|
30
|
+
}
|
|
27
31
|
function projectConfigDir(cwd = process.cwd()) {
|
|
28
32
|
return path.join(cwd, PROJECT_DIR_NAME);
|
|
29
33
|
}
|
|
@@ -76,6 +80,9 @@ async function clearAuth() {
|
|
|
76
80
|
throw err;
|
|
77
81
|
}
|
|
78
82
|
}
|
|
83
|
+
async function writeStepUp(token) {
|
|
84
|
+
await writeJsonFile(stepUpConfigPath(), token, FILE_MODE_PRIVATE);
|
|
85
|
+
}
|
|
79
86
|
async function readProjectLink(cwd = process.cwd()) {
|
|
80
87
|
const data = await readJsonFile(projectConfigPath(cwd));
|
|
81
88
|
if (!data) {
|
|
@@ -130,4 +137,4 @@ ${STATE_GITIGNORE_LINE}
|
|
|
130
137
|
await promises.writeFile(gitignore, next, ENCODING_UTF8);
|
|
131
138
|
}
|
|
132
139
|
|
|
133
|
-
export { clearAuth, clearProjectLink, readAuth, readAuthOrNull, readProjectLink, readProjectLinkOrNull, readProjectState, writeAuth, writeProjectLink, writeProjectState };
|
|
140
|
+
export { clearAuth, clearProjectLink, readAuth, readAuthOrNull, readProjectLink, readProjectLinkOrNull, readProjectState, writeAuth, writeProjectLink, writeProjectState, writeStepUp };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { TERMINAL_DEPLOYMENT_STATUSES, DEPLOYMENT_STATUS } from './chunk-MXYUAJEW.mjs';
|
|
3
|
-
import { dim, CliError, CLI_ERROR_CODE, failure, success, isJsonMode } from './chunk-
|
|
3
|
+
import { dim, CliError, CLI_ERROR_CODE, failure, success, isJsonMode } from './chunk-E2T2SBP5.mjs';
|
|
4
4
|
|
|
5
5
|
// src/progress.ts
|
|
6
6
|
var POLL_INTERVAL_MS = 1e3;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { pollDeployment } from './chunk-
|
|
3
|
-
import { gitDetectRoot, gitStatusPorcelain, gitCurrentBranch, gitCurrentSha, gitGetRemoteUrl, isFreestyleRemote, gitPushToUrl, gitPush } from './chunk-
|
|
4
|
-
import { fetchCloneToken } from './chunk-
|
|
5
|
-
import { promptYesNo } from './chunk-
|
|
2
|
+
import { pollDeployment } from './chunk-VTR5R5NQ.mjs';
|
|
3
|
+
import { gitDetectRoot, gitStatusPorcelain, gitCurrentBranch, gitCurrentSha, gitGetRemoteUrl, isFreestyleRemote, gitPushToUrl, gitPush } from './chunk-K5464A3L.mjs';
|
|
4
|
+
import { fetchCloneToken } from './chunk-R3FDBXR6.mjs';
|
|
5
|
+
import { promptYesNo } from './chunk-ITAFAORS.mjs';
|
|
6
6
|
import { TOKEN_PURPOSE, ENV_SCOPE, DEPLOY_TRIGGER, DEPLOYMENT_STATUS } from './chunk-MXYUAJEW.mjs';
|
|
7
7
|
import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
|
|
8
|
-
import { ApiClient } from './chunk-
|
|
9
|
-
import { readAuth, readProjectLink, writeProjectState } from './chunk-
|
|
10
|
-
import { CliError, CLI_ERROR_CODE, step, info, dim, success, result, EXIT_CODE } from './chunk-
|
|
8
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
9
|
+
import { readAuth, readProjectLink, writeProjectState } from './chunk-UBAI443T.mjs';
|
|
10
|
+
import { CliError, CLI_ERROR_CODE, step, info, dim, success, result, EXIT_CODE } from './chunk-E2T2SBP5.mjs';
|
|
11
11
|
|
|
12
12
|
// src/commands/deploy.ts
|
|
13
13
|
var FLAG_PROD = "prod";
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { parseEnvFile, formatEnvFile } from './chunk-
|
|
2
|
+
import { parseEnvFile, formatEnvFile } from './chunk-DBZ3UOQ2.mjs';
|
|
3
3
|
import { ENV_SCOPE, PUBLIC_ENV_PREFIX } from './chunk-MXYUAJEW.mjs';
|
|
4
4
|
import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
5
|
-
import { ApiClient } from './chunk-
|
|
6
|
-
import { readAuth, readProjectLink } from './chunk-
|
|
7
|
-
import { info, CliError, CLI_ERROR_CODE, dim } from './chunk-
|
|
5
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
6
|
+
import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
|
|
7
|
+
import { info, CliError, CLI_ERROR_CODE, dim } from './chunk-E2T2SBP5.mjs';
|
|
8
8
|
import { spawn } from 'child_process';
|
|
9
9
|
import { promises } from 'fs';
|
|
10
10
|
import path from 'path';
|
package/dist/dispatcher.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { TEMPLATES } from './chunk-42PFJBC6.mjs';
|
|
3
|
-
import { package_default } from './chunk-
|
|
3
|
+
import { package_default } from './chunk-ASZVWVMM.mjs';
|
|
4
4
|
|
|
5
5
|
// src/dispatcher.ts
|
|
6
6
|
var VERSION = package_default.version ?? "unknown";
|
|
@@ -121,28 +121,32 @@ Need the mock storefront server? It ships with @cimplify/sdk:
|
|
|
121
121
|
bunx @cimplify/sdk mock [flags] Boot the local Cimplify API mock
|
|
122
122
|
`;
|
|
123
123
|
var COMMANDS = {
|
|
124
|
-
login: () => import('./login-
|
|
125
|
-
logout: () => import('./logout-
|
|
126
|
-
whoami: () => import('./whoami-
|
|
127
|
-
projects: () => import('./projects-
|
|
128
|
-
link: () => import('./link-
|
|
129
|
-
unlink: () => import('./unlink-
|
|
130
|
-
deploy: () => import('./deploy-
|
|
131
|
-
rollback: () => import('./rollback-
|
|
132
|
-
env: () => import('./env-
|
|
133
|
-
domains: () => import('./domains-
|
|
134
|
-
logs: () => import('./logs-
|
|
135
|
-
status: () => import('./status-
|
|
136
|
-
dev: () => import('./dev-
|
|
137
|
-
introspect: () => import('./introspect-
|
|
138
|
-
doctor: () => import('./doctor-
|
|
139
|
-
explain: () => import('./explain-
|
|
140
|
-
assets: () => import('./assets-
|
|
141
|
-
repo: () => import('./repo-
|
|
142
|
-
list: () => import('./list-
|
|
143
|
-
add: () => import('./add-
|
|
144
|
-
update: () => import('./update-
|
|
145
|
-
upgrade: () => import('./update-
|
|
124
|
+
login: () => import('./login-3OD4ND2H.mjs'),
|
|
125
|
+
logout: () => import('./logout-3RLBZ33M.mjs'),
|
|
126
|
+
whoami: () => import('./whoami-DNZ7RUTH.mjs'),
|
|
127
|
+
projects: () => import('./projects-JSEC2YCX.mjs'),
|
|
128
|
+
link: () => import('./link-DZSILT5N.mjs'),
|
|
129
|
+
unlink: () => import('./unlink-RFK74SFP.mjs'),
|
|
130
|
+
deploy: () => import('./deploy-3IFXUWPM.mjs'),
|
|
131
|
+
rollback: () => import('./rollback-DD4RNRFM.mjs'),
|
|
132
|
+
env: () => import('./env-7ISJ73YI.mjs'),
|
|
133
|
+
domains: () => import('./domains-AHH56CL7.mjs'),
|
|
134
|
+
logs: () => import('./logs-YNN2PQ24.mjs'),
|
|
135
|
+
status: () => import('./status-JSYXM5RT.mjs'),
|
|
136
|
+
dev: () => import('./dev-ONW2S77K.mjs'),
|
|
137
|
+
introspect: () => import('./introspect-IVI65FEV.mjs'),
|
|
138
|
+
doctor: () => import('./doctor-BC6CMVRW.mjs'),
|
|
139
|
+
explain: () => import('./explain-MZOCDFZE.mjs'),
|
|
140
|
+
assets: () => import('./assets-EBEMMENZ.mjs'),
|
|
141
|
+
repo: () => import('./repo-WOBWKEAO.mjs'),
|
|
142
|
+
list: () => import('./list-JOQRPYX4.mjs'),
|
|
143
|
+
add: () => import('./add-KKIYBATR.mjs'),
|
|
144
|
+
update: () => import('./update-EDTG73FK.mjs'),
|
|
145
|
+
upgrade: () => import('./update-EDTG73FK.mjs'),
|
|
146
|
+
"auth-step-up": () => import('./auth-step-up-BIUYQJP6.mjs')
|
|
147
|
+
};
|
|
148
|
+
var COMMAND_PREFIXES = {
|
|
149
|
+
auth: { "step-up": "auth-step-up" }
|
|
146
150
|
};
|
|
147
151
|
var GLOBAL_FLAGS = /* @__PURE__ */ new Set(["--json", "--yes", "-y"]);
|
|
148
152
|
function extractGlobalFlags(argv) {
|
|
@@ -180,12 +184,21 @@ async function main() {
|
|
|
180
184
|
if (TOP_LEVEL_FLAGS.has(maybeSub)) {
|
|
181
185
|
return await runDispatcherFlag(maybeSub, cleaned.json);
|
|
182
186
|
}
|
|
183
|
-
|
|
184
|
-
|
|
187
|
+
let sub = maybeSub;
|
|
188
|
+
let args = rest;
|
|
185
189
|
if (sub === "init") {
|
|
186
190
|
await runInit(args);
|
|
187
191
|
return;
|
|
188
192
|
}
|
|
193
|
+
const prefixMap = COMMAND_PREFIXES[sub];
|
|
194
|
+
if (prefixMap && args.length > 0) {
|
|
195
|
+
const sub2 = args[0];
|
|
196
|
+
const mapped = prefixMap[sub2];
|
|
197
|
+
if (mapped) {
|
|
198
|
+
sub = mapped;
|
|
199
|
+
args = args.slice(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
189
202
|
const loader = COMMANDS[sub];
|
|
190
203
|
if (!loader) {
|
|
191
204
|
console.error(`cimplify: unknown command "${sub}"`);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { gatherIntrospection } from './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
2
|
+
import { gatherIntrospection } from './chunk-SDSOORT6.mjs';
|
|
3
|
+
import './chunk-K5464A3L.mjs';
|
|
4
|
+
import './chunk-DBZ3UOQ2.mjs';
|
|
5
|
+
import './chunk-ASZVWVMM.mjs';
|
|
6
6
|
import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
7
|
-
import { ApiClient } from './chunk-
|
|
8
|
-
import { readAuthOrNull } from './chunk-
|
|
9
|
-
import { bold, dim, info, result, isCliError, CLI_ERROR_CODE, red, yellow, green } from './chunk-
|
|
7
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
8
|
+
import { readAuthOrNull } from './chunk-UBAI443T.mjs';
|
|
9
|
+
import { bold, dim, info, result, isCliError, CLI_ERROR_CODE, red, yellow, green } from './chunk-E2T2SBP5.mjs';
|
|
10
10
|
import { promises } from 'fs';
|
|
11
11
|
import path from 'path';
|
|
12
12
|
|
|
@@ -200,7 +200,7 @@ async function runRemoteChecks(snapshot, auth) {
|
|
|
200
200
|
let authValid;
|
|
201
201
|
try {
|
|
202
202
|
const me = await client.get(ENDPOINT_AUTH_ME);
|
|
203
|
-
const env = auth.apiKey.
|
|
203
|
+
const env = auth.apiKey.includes("_test_") ? "test" : "live";
|
|
204
204
|
authValid = ok("auth_valid", `${env} token \xB7 business ${me.business_id}`);
|
|
205
205
|
} catch (err) {
|
|
206
206
|
if (isCliError(err) && err.code === CLI_ERROR_CODE.AUTH_FAILED) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { promptYesNo } from './chunk-
|
|
2
|
+
import { promptYesNo } from './chunk-ITAFAORS.mjs';
|
|
3
3
|
import { ENV_SCOPE, DOMAIN_TYPE } from './chunk-MXYUAJEW.mjs';
|
|
4
4
|
import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
|
|
5
|
-
import { ApiClient } from './chunk-
|
|
6
|
-
import { readAuth, readProjectLink } from './chunk-
|
|
7
|
-
import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-
|
|
5
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
6
|
+
import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
|
|
7
|
+
import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-E2T2SBP5.mjs';
|
|
8
8
|
|
|
9
9
|
// src/commands/domains.ts
|
|
10
10
|
var SUB_LS = "ls";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { formatEnvFile, parseEnvFile, parseKeyValueArg } from './chunk-
|
|
3
|
-
import { promptYesNo } from './chunk-
|
|
2
|
+
import { formatEnvFile, parseEnvFile, parseKeyValueArg } from './chunk-DBZ3UOQ2.mjs';
|
|
3
|
+
import { promptYesNo } from './chunk-ITAFAORS.mjs';
|
|
4
4
|
import { ENV_SCOPE, PUBLIC_ENV_PREFIX, SECRET_MASK } from './chunk-MXYUAJEW.mjs';
|
|
5
5
|
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
6
|
-
import { ApiClient } from './chunk-
|
|
7
|
-
import { readAuth, readProjectLink } from './chunk-
|
|
8
|
-
import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-
|
|
6
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
7
|
+
import { readAuth, readProjectLink } from './chunk-UBAI443T.mjs';
|
|
8
|
+
import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-E2T2SBP5.mjs';
|
|
9
9
|
import { promises } from 'fs';
|
|
10
10
|
import path from 'path';
|
|
11
11
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { package_default } from './chunk-
|
|
2
|
+
import { package_default } from './chunk-ASZVWVMM.mjs';
|
|
3
3
|
import { parseArgs } from './chunk-C4M3DXKC.mjs';
|
|
4
|
-
import { bold, dim, info, result, CliError, CLI_ERROR_CODE } from './chunk-
|
|
4
|
+
import { bold, dim, info, result, CliError, CLI_ERROR_CODE } from './chunk-E2T2SBP5.mjs';
|
|
5
5
|
|
|
6
6
|
// src/embedded-docs.ts
|
|
7
7
|
var TOPICS = [
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export { run as default, extractMockSeed, gatherIntrospection, renderIntrospection } from './chunk-SDSOORT6.mjs';
|
|
3
|
+
import './chunk-K5464A3L.mjs';
|
|
4
|
+
import './chunk-DBZ3UOQ2.mjs';
|
|
5
|
+
import './chunk-ASZVWVMM.mjs';
|
|
6
|
+
import './chunk-C4M3DXKC.mjs';
|
|
7
|
+
import './chunk-UBAI443T.mjs';
|
|
8
|
+
import './chunk-E2T2SBP5.mjs';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from './chunk-C4M3DXKC.mjs';
|
|
3
|
-
import { ApiClient } from './chunk-
|
|
4
|
-
import { readAuth, writeProjectLink } from './chunk-
|
|
5
|
-
import { CliError, CLI_ERROR_CODE, success, info, dim, result } from './chunk-
|
|
3
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
4
|
+
import { readAuth, writeProjectLink } from './chunk-UBAI443T.mjs';
|
|
5
|
+
import { CliError, CLI_ERROR_CODE, success, info, dim, result } from './chunk-E2T2SBP5.mjs';
|
|
6
6
|
|
|
7
7
|
// src/commands/link.ts
|
|
8
8
|
function projectEndpoint(businessId, projectId) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { REGISTRY_INDEX } from './chunk-42PFJBC6.mjs';
|
|
3
3
|
import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
4
|
-
import { CliError, CLI_ERROR_CODE, info, bold, dim, green, result } from './chunk-
|
|
4
|
+
import { CliError, CLI_ERROR_CODE, info, bold, dim, green, result } from './chunk-E2T2SBP5.mjs';
|
|
5
5
|
|
|
6
6
|
// src/commands/list.ts
|
|
7
7
|
async function run(argv) {
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { generatePkcePair, generateState, startLoopbackServer, openBrowser } from './chunk-GLXONXS3.mjs';
|
|
3
|
+
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
4
|
+
import { resolveBaseUrl, ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
5
|
+
import { writeAuth } from './chunk-UBAI443T.mjs';
|
|
6
|
+
import { CliError, CLI_ERROR_CODE, success, result, isJsonMode, step, info, dim } from './chunk-E2T2SBP5.mjs';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
|
|
9
|
+
var FLAG_API_KEY = "api-key";
|
|
10
|
+
var FLAG_BASE_URL = "base-url";
|
|
11
|
+
var FLAG_NO_BROWSER = "no-browser";
|
|
12
|
+
var FLAG_SCOPE = "scope";
|
|
13
|
+
var VALID_CLI_SCOPES = /* @__PURE__ */ new Set([
|
|
14
|
+
"cli:read",
|
|
15
|
+
"cli:write",
|
|
16
|
+
"cli:deploy",
|
|
17
|
+
"cli:admin"
|
|
18
|
+
]);
|
|
19
|
+
var ENDPOINT_AUTH_ME = "/v1/auth/me";
|
|
20
|
+
var ENDPOINT_CLI_START = "/v1/auth/cli/start";
|
|
21
|
+
var ENDPOINT_CLI_TOKEN = "/v1/auth/cli/token";
|
|
22
|
+
var KEY_PREFIX_CAK = "cak_";
|
|
23
|
+
var KEY_PREFIX_CSK = "csk_";
|
|
24
|
+
var PRODUCT_NAME = "cimplify-cli";
|
|
25
|
+
async function run(argv) {
|
|
26
|
+
const args = parseArgs(argv);
|
|
27
|
+
const baseUrl = resolveBaseUrl(flagString(args, FLAG_BASE_URL));
|
|
28
|
+
const explicitKey = flagString(args, FLAG_API_KEY);
|
|
29
|
+
if (explicitKey) {
|
|
30
|
+
await loginWithKey(baseUrl, explicitKey);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const scopes = parseScopeFlag(flagString(args, FLAG_SCOPE));
|
|
34
|
+
await loginWithBrowser(baseUrl, flagBool(args, FLAG_NO_BROWSER), scopes);
|
|
35
|
+
}
|
|
36
|
+
function parseScopeFlag(raw) {
|
|
37
|
+
if (!raw) return [];
|
|
38
|
+
const items = raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
39
|
+
for (const s of items) {
|
|
40
|
+
if (!VALID_CLI_SCOPES.has(s)) {
|
|
41
|
+
throw new CliError(
|
|
42
|
+
CLI_ERROR_CODE.INVALID_INPUT,
|
|
43
|
+
`Unknown scope "${s}". Valid: ${Array.from(VALID_CLI_SCOPES).join(", ")}.`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return items;
|
|
48
|
+
}
|
|
49
|
+
async function loginWithKey(baseUrl, apiKey) {
|
|
50
|
+
if (!apiKey.startsWith(KEY_PREFIX_CAK) && !apiKey.startsWith(KEY_PREFIX_CSK)) {
|
|
51
|
+
throw new CliError(
|
|
52
|
+
CLI_ERROR_CODE.INVALID_INPUT,
|
|
53
|
+
`API key must start with "${KEY_PREFIX_CAK}" or "${KEY_PREFIX_CSK}".`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
const client = ApiClient.withKey(apiKey, baseUrl);
|
|
57
|
+
const me = await client.get(ENDPOINT_AUTH_ME);
|
|
58
|
+
await writeAuth({
|
|
59
|
+
apiKey,
|
|
60
|
+
apiBaseUrl: baseUrl,
|
|
61
|
+
accountId: me.id,
|
|
62
|
+
businessId: me.business_id,
|
|
63
|
+
email: me.email,
|
|
64
|
+
name: me.name,
|
|
65
|
+
savedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
66
|
+
});
|
|
67
|
+
success(`Logged in as ${me.email ?? me.name ?? me.id} (business ${me.business_id})`);
|
|
68
|
+
result({
|
|
69
|
+
logged_in: true,
|
|
70
|
+
account: { id: me.id, email: me.email ?? null, name: me.name ?? null },
|
|
71
|
+
business: { id: me.business_id },
|
|
72
|
+
method: "api_key"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function loginWithBrowser(baseUrl, noBrowser, requestedScopes) {
|
|
76
|
+
if (isJsonMode()) {
|
|
77
|
+
throw new CliError(
|
|
78
|
+
CLI_ERROR_CODE.INTERACTIVE_REQUIRED,
|
|
79
|
+
"browser login is not supported in --json mode",
|
|
80
|
+
{ remediation: "pass --api-key dk_\u2026 (create one in the dashboard or via `cimplify auth keys create`)" }
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
const pkce = generatePkcePair();
|
|
84
|
+
const state = generateState();
|
|
85
|
+
const loopback = await startLoopbackServer(baseUrl);
|
|
86
|
+
const startBody = {
|
|
87
|
+
code_challenge: pkce.codeChallenge,
|
|
88
|
+
code_challenge_method: pkce.codeChallengeMethod,
|
|
89
|
+
redirect_uri: loopback.redirectUri,
|
|
90
|
+
state,
|
|
91
|
+
client_meta: {
|
|
92
|
+
hostname: os.hostname(),
|
|
93
|
+
platform: process.platform,
|
|
94
|
+
arch: process.arch,
|
|
95
|
+
node_version: process.version,
|
|
96
|
+
product: PRODUCT_NAME
|
|
97
|
+
},
|
|
98
|
+
requested_scopes: requestedScopes
|
|
99
|
+
};
|
|
100
|
+
const unauthClient = ApiClient.unauthenticated(baseUrl);
|
|
101
|
+
const startResponse = await unauthClient.post(
|
|
102
|
+
ENDPOINT_CLI_START,
|
|
103
|
+
startBody
|
|
104
|
+
);
|
|
105
|
+
step("Opening browser to authorize this CLI...");
|
|
106
|
+
info(dim(startResponse.approval_url));
|
|
107
|
+
if (!noBrowser) {
|
|
108
|
+
openBrowser(startResponse.approval_url);
|
|
109
|
+
} else {
|
|
110
|
+
info("");
|
|
111
|
+
info(dim("Open the URL above in any browser to continue."));
|
|
112
|
+
}
|
|
113
|
+
let callback;
|
|
114
|
+
try {
|
|
115
|
+
callback = await loopback.awaitCallback(startResponse.expires_in_secs * 1e3);
|
|
116
|
+
} catch (err) {
|
|
117
|
+
loopback.close();
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
if (callback.state !== state) {
|
|
121
|
+
throw new CliError(
|
|
122
|
+
CLI_ERROR_CODE.UNAUTHORIZED,
|
|
123
|
+
"OAuth state mismatch. Possible CSRF attempt \u2014 try again."
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
if (!callback.code) {
|
|
127
|
+
throw new CliError(
|
|
128
|
+
CLI_ERROR_CODE.UNAUTHORIZED,
|
|
129
|
+
"Login callback missing auth_code."
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
const token = await unauthClient.post(ENDPOINT_CLI_TOKEN, {
|
|
133
|
+
auth_code: callback.code,
|
|
134
|
+
code_verifier: pkce.codeVerifier,
|
|
135
|
+
redirect_uri: loopback.redirectUri
|
|
136
|
+
});
|
|
137
|
+
await writeAuth({
|
|
138
|
+
apiKey: token.access_token,
|
|
139
|
+
apiBaseUrl: baseUrl,
|
|
140
|
+
accountId: token.account_id,
|
|
141
|
+
businessId: token.business_id,
|
|
142
|
+
savedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
143
|
+
});
|
|
144
|
+
success(`Logged in (business ${token.business_id})`);
|
|
145
|
+
result({
|
|
146
|
+
logged_in: true,
|
|
147
|
+
account: { id: token.account_id, email: null, name: null },
|
|
148
|
+
business: { id: token.business_id },
|
|
149
|
+
method: "oauth_pkce"
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export { run as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { clearAuth } from './chunk-
|
|
3
|
-
import { success, info, result } from './chunk-
|
|
2
|
+
import { clearAuth } from './chunk-UBAI443T.mjs';
|
|
3
|
+
import { success, info, result } from './chunk-E2T2SBP5.mjs';
|
|
4
4
|
|
|
5
5
|
// src/commands/logout.ts
|
|
6
6
|
async function run(_argv) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { TERMINAL_DEPLOYMENT_STATUSES } from './chunk-MXYUAJEW.mjs';
|
|
3
3
|
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
4
|
-
import { ApiClient } from './chunk-
|
|
5
|
-
import { readAuth, readProjectLink, readProjectState } from './chunk-
|
|
6
|
-
import { CliError, CLI_ERROR_CODE, isJsonMode, failure, result, red } from './chunk-
|
|
4
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
5
|
+
import { readAuth, readProjectLink, readProjectState } from './chunk-UBAI443T.mjs';
|
|
6
|
+
import { CliError, CLI_ERROR_CODE, isJsonMode, failure, result, red } from './chunk-E2T2SBP5.mjs';
|
|
7
7
|
|
|
8
8
|
// src/commands/logs.ts
|
|
9
9
|
var FLAG_DEPLOYMENT = "deployment";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { REPO_PROVIDER } from './chunk-MXYUAJEW.mjs';
|
|
3
3
|
import { parseArgs, flagString, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
4
|
-
import { ApiClient } from './chunk-
|
|
5
|
-
import { readAuth } from './chunk-
|
|
6
|
-
import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-
|
|
4
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
5
|
+
import { readAuth } from './chunk-UBAI443T.mjs';
|
|
6
|
+
import { CliError, CLI_ERROR_CODE, info, dim, result, bold, success } from './chunk-E2T2SBP5.mjs';
|
|
7
7
|
|
|
8
8
|
// src/commands/projects.ts
|
|
9
9
|
var SUB_LS = "ls";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export { run as default, fetchCloneToken } from './chunk-R3FDBXR6.mjs';
|
|
3
|
+
import './chunk-ITAFAORS.mjs';
|
|
4
|
+
import './chunk-MXYUAJEW.mjs';
|
|
5
|
+
import './chunk-C4M3DXKC.mjs';
|
|
6
|
+
import './chunk-MAOO6ZZ5.mjs';
|
|
7
|
+
import './chunk-UBAI443T.mjs';
|
|
8
|
+
import './chunk-E2T2SBP5.mjs';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { pollDeployment } from './chunk-
|
|
2
|
+
import { pollDeployment } from './chunk-VTR5R5NQ.mjs';
|
|
3
3
|
import { DEPLOYMENT_STATUS, DEPLOY_TRIGGER } from './chunk-MXYUAJEW.mjs';
|
|
4
4
|
import { parseArgs, flagBool } from './chunk-C4M3DXKC.mjs';
|
|
5
|
-
import { ApiClient } from './chunk-
|
|
6
|
-
import { readAuth, readProjectLink, writeProjectState } from './chunk-
|
|
7
|
-
import { CliError, CLI_ERROR_CODE, step, success, info, dim, result, EXIT_CODE } from './chunk-
|
|
5
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
6
|
+
import { readAuth, readProjectLink, writeProjectState } from './chunk-UBAI443T.mjs';
|
|
7
|
+
import { CliError, CLI_ERROR_CODE, step, success, info, dim, result, EXIT_CODE } from './chunk-E2T2SBP5.mjs';
|
|
8
8
|
|
|
9
9
|
// src/commands/rollback.ts
|
|
10
10
|
var FLAG_NO_POLL = "no-poll";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { DEPLOYMENT_STATUS } from './chunk-MXYUAJEW.mjs';
|
|
3
3
|
import { parseArgs } from './chunk-C4M3DXKC.mjs';
|
|
4
|
-
import { ApiClient } from './chunk-
|
|
5
|
-
import { readAuth, readProjectLink, readProjectState } from './chunk-
|
|
6
|
-
import { bold, dim, info, result } from './chunk-
|
|
4
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
5
|
+
import { readAuth, readProjectLink, readProjectState } from './chunk-UBAI443T.mjs';
|
|
6
|
+
import { bold, dim, info, result } from './chunk-E2T2SBP5.mjs';
|
|
7
7
|
|
|
8
8
|
// src/commands/status.ts
|
|
9
9
|
var QUERY_LIMIT = "limit";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { clearProjectLink } from './chunk-
|
|
3
|
-
import { success, info, result } from './chunk-
|
|
2
|
+
import { clearProjectLink } from './chunk-UBAI443T.mjs';
|
|
3
|
+
import { success, info, result } from './chunk-E2T2SBP5.mjs';
|
|
4
4
|
|
|
5
5
|
// src/commands/unlink.ts
|
|
6
6
|
async function run(_argv) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { package_default } from './chunk-
|
|
3
|
-
import { promptYesNo } from './chunk-
|
|
2
|
+
import { package_default } from './chunk-ASZVWVMM.mjs';
|
|
3
|
+
import { promptYesNo } from './chunk-ITAFAORS.mjs';
|
|
4
4
|
import { parseArgs, flagBool, flagString } from './chunk-C4M3DXKC.mjs';
|
|
5
|
-
import { success, bold, info, dim, result, failure, CliError, CLI_ERROR_CODE, step, isJsonMode } from './chunk-
|
|
5
|
+
import { success, bold, info, dim, result, failure, CliError, CLI_ERROR_CODE, step, isJsonMode } from './chunk-E2T2SBP5.mjs';
|
|
6
6
|
import { spawn } from 'child_process';
|
|
7
7
|
import { basename, dirname } from 'path';
|
|
8
8
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { ApiClient } from './chunk-
|
|
3
|
-
import { readAuth } from './chunk-
|
|
4
|
-
import { info, bold, dim, result } from './chunk-
|
|
2
|
+
import { ApiClient } from './chunk-MAOO6ZZ5.mjs';
|
|
3
|
+
import { readAuth } from './chunk-UBAI443T.mjs';
|
|
4
|
+
import { info, bold, dim, result } from './chunk-E2T2SBP5.mjs';
|
|
5
5
|
|
|
6
6
|
// src/commands/whoami.ts
|
|
7
7
|
var ENDPOINT_AUTH_ME = "/v1/auth/me";
|
package/package.json
CHANGED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export { run as default, extractMockSeed, gatherIntrospection, renderIntrospection } from './chunk-I6P3I2YJ.mjs';
|
|
3
|
-
import './chunk-RRY3NEZZ.mjs';
|
|
4
|
-
import './chunk-YI7UMMM7.mjs';
|
|
5
|
-
import './chunk-IQJ45AK3.mjs';
|
|
6
|
-
import './chunk-C4M3DXKC.mjs';
|
|
7
|
-
import './chunk-LS2VTSMQ.mjs';
|
|
8
|
-
import './chunk-I3XQSSOT.mjs';
|
package/dist/repo-26N2CHF6.mjs
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export { run as default, fetchCloneToken } from './chunk-QGBXGDA5.mjs';
|
|
3
|
-
import './chunk-RZQTHTXX.mjs';
|
|
4
|
-
import './chunk-MXYUAJEW.mjs';
|
|
5
|
-
import './chunk-C4M3DXKC.mjs';
|
|
6
|
-
import './chunk-D7WMSGKK.mjs';
|
|
7
|
-
import './chunk-LS2VTSMQ.mjs';
|
|
8
|
-
import './chunk-I3XQSSOT.mjs';
|