@getpara/cli 2.15.0 → 2.16.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/api/client.d.ts +2 -2
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +1 -1
- package/dist/auth/polling-flow.d.ts +2 -2
- package/dist/auth/polling-flow.d.ts.map +1 -1
- package/dist/auth/polling-flow.js +3 -3
- package/dist/auth/session-manager.d.ts +3 -3
- package/dist/auth/session-manager.d.ts.map +1 -1
- package/dist/auth/session-manager.js +8 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +28 -7
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +8 -9
- package/dist/commands/auth/logout.d.ts.map +1 -1
- package/dist/commands/auth/logout.js +7 -8
- package/dist/commands/auth/status.d.ts.map +1 -1
- package/dist/commands/auth/status.js +4 -5
- package/dist/commands/config.js +5 -5
- package/dist/commands/create.js +5 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -5
- package/dist/commands/keys/archive.d.ts.map +1 -1
- package/dist/commands/keys/archive.js +20 -10
- package/dist/commands/keys/config/branding.js +5 -5
- package/dist/commands/keys/config/categories.d.ts.map +1 -1
- package/dist/commands/keys/config/categories.js +19 -1
- package/dist/commands/keys/config/index.d.ts.map +1 -1
- package/dist/commands/keys/config/index.js +12 -4
- package/dist/commands/keys/config/ramps.js +5 -5
- package/dist/commands/keys/config/security.js +5 -5
- package/dist/commands/keys/config/setup.js +5 -5
- package/dist/commands/keys/config/webhooks.d.ts +1 -1
- package/dist/commands/keys/config/webhooks.d.ts.map +1 -1
- package/dist/commands/keys/config/webhooks.js +15 -14
- package/dist/commands/keys/create.js +3 -3
- package/dist/commands/keys/get.d.ts.map +1 -1
- package/dist/commands/keys/get.js +62 -57
- package/dist/commands/keys/list.js +3 -3
- package/dist/commands/keys/rotate.d.ts.map +1 -1
- package/dist/commands/keys/rotate.js +22 -12
- package/dist/commands/orgs/list.js +2 -2
- package/dist/commands/orgs/switch.js +2 -2
- package/dist/commands/projects/archive.js +2 -2
- package/dist/commands/projects/create.js +2 -2
- package/dist/commands/projects/list.js +2 -2
- package/dist/commands/projects/restore.js +2 -2
- package/dist/commands/projects/switch.js +2 -2
- package/dist/commands/projects/update.js +2 -2
- package/dist/commands/whoami.js +5 -5
- package/dist/config/config-manager.d.ts.map +1 -1
- package/dist/config/config-manager.js +16 -10
- package/dist/config/credential-store.d.ts +4 -4
- package/dist/config/credential-store.d.ts.map +1 -1
- package/dist/config/credential-store.js +10 -10
- package/dist/core/constants.d.ts +11 -5
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +33 -18
- package/dist/core/types.d.ts +5 -3
- package/dist/core/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/api/client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Backend } from '../core/constants.js';
|
|
2
2
|
import type { Organization, Project, ApiKey, ApiKeyConfig, AuthStatus, WebhookConfig, WebhookConfigWithSecretResponse, WebhookTestResponse, WebhookRotateSecretResponse, UpdateWebhookBody } from './types.js';
|
|
3
3
|
interface ClientConfig {
|
|
4
|
-
|
|
4
|
+
backend: Backend;
|
|
5
5
|
sessionId: string;
|
|
6
6
|
}
|
|
7
7
|
export declare class ParaApiClient {
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/api/client.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Backend } from '../core/constants.js';
|
|
2
2
|
import type { SessionInfo } from '../core/types.js';
|
|
3
3
|
export interface PollingLoginOptions {
|
|
4
4
|
openBrowser?: boolean;
|
|
5
5
|
}
|
|
6
|
-
export declare function startPollingLogin(
|
|
6
|
+
export declare function startPollingLogin(backend: Backend, opts?: PollingLoginOptions): Promise<SessionInfo>;
|
|
7
7
|
//# sourceMappingURL=polling-flow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polling-flow.d.ts","sourceRoot":"","sources":["../../src/auth/polling-flow.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,
|
|
1
|
+
{"version":3,"file":"polling-flow.d.ts","sourceRoot":"","sources":["../../src/auth/polling-flow.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEhG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAepD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsE9G"}
|
|
@@ -9,12 +9,12 @@ function generateCodeVerifier() {
|
|
|
9
9
|
function generateCodeChallenge(verifier) {
|
|
10
10
|
return createHash("sha256").update(verifier).digest("base64url");
|
|
11
11
|
}
|
|
12
|
-
async function startPollingLogin(
|
|
12
|
+
async function startPollingLogin(backend, opts = {}) {
|
|
13
13
|
const { openBrowser = true } = opts;
|
|
14
14
|
const codeVerifier = generateCodeVerifier();
|
|
15
15
|
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
16
|
-
const portalUrl = PORTAL_URLS[
|
|
17
|
-
const baseUrl = BASE_URLS[
|
|
16
|
+
const portalUrl = PORTAL_URLS[backend];
|
|
17
|
+
const baseUrl = BASE_URLS[backend];
|
|
18
18
|
const createResponse = await fetch(`${baseUrl}/cli/auth/session-lookup`, {
|
|
19
19
|
method: "POST",
|
|
20
20
|
headers: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Backend } from '../core/constants.js';
|
|
2
2
|
import type { SessionInfo } from '../core/types.js';
|
|
3
3
|
import { storeSession, clearSession } from '../config/credential-store.js';
|
|
4
|
-
export declare function resolveSession(
|
|
5
|
-
export declare function ensureAuthenticated(
|
|
4
|
+
export declare function resolveSession(backend: Backend): Promise<SessionInfo | null>;
|
|
5
|
+
export declare function ensureAuthenticated(backend: Backend): Promise<SessionInfo>;
|
|
6
6
|
export { storeSession, clearSession };
|
|
7
7
|
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/auth/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/auth/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAc,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGvF,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAElF;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAuChF;AAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { AuthError } from "../core/error-handler.js";
|
|
2
2
|
import { getSession, storeSession, clearSession } from "../config/credential-store.js";
|
|
3
3
|
import { ParaApiClient } from "../api/client.js";
|
|
4
|
-
async function resolveSession(
|
|
5
|
-
return getSession(
|
|
4
|
+
async function resolveSession(backend) {
|
|
5
|
+
return getSession(backend);
|
|
6
6
|
}
|
|
7
|
-
async function ensureAuthenticated(
|
|
8
|
-
const session = await resolveSession(
|
|
7
|
+
async function ensureAuthenticated(backend) {
|
|
8
|
+
const session = await resolveSession(backend);
|
|
9
9
|
if (!session) {
|
|
10
10
|
throw new AuthError("Not authenticated. Run `para login` to authenticate.");
|
|
11
11
|
}
|
|
12
12
|
if (session.expiresAt && Date.now() > session.expiresAt) {
|
|
13
|
-
await clearSession(
|
|
13
|
+
await clearSession(backend);
|
|
14
14
|
throw new AuthError("Session expired. Run `para login` to re-authenticate.", true);
|
|
15
15
|
}
|
|
16
16
|
try {
|
|
17
|
-
const client = new ParaApiClient({
|
|
17
|
+
const client = new ParaApiClient({ backend, sessionId: session.sessionId });
|
|
18
18
|
const status = await client.getAuthStatus();
|
|
19
19
|
const updated = {
|
|
20
20
|
sessionId: session.sessionId,
|
|
@@ -23,12 +23,12 @@ async function ensureAuthenticated(environment) {
|
|
|
23
23
|
expiresAt: status.sessionExpiresAt ?? session.expiresAt
|
|
24
24
|
};
|
|
25
25
|
if (updated.email !== session.email || updated.userId !== session.userId || updated.expiresAt !== session.expiresAt) {
|
|
26
|
-
await storeSession(
|
|
26
|
+
await storeSession(backend, updated);
|
|
27
27
|
}
|
|
28
28
|
return updated;
|
|
29
29
|
} catch (error) {
|
|
30
30
|
if (error instanceof AuthError) {
|
|
31
|
-
await clearSession(
|
|
31
|
+
await clearSession(backend);
|
|
32
32
|
throw new AuthError("Session is no longer valid. Run `para login` to re-authenticate.", true);
|
|
33
33
|
}
|
|
34
34
|
throw error;
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAwBxD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEhE;AAwFD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAyC3E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAKpE;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CvD"}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
CLI_VERSION,
|
|
4
|
+
CLI_NAME,
|
|
5
|
+
DEFAULT_BACKEND,
|
|
6
|
+
DEFAULT_KEY_ENVIRONMENT,
|
|
7
|
+
parseBackend,
|
|
8
|
+
parseKeyEnvironment
|
|
9
|
+
} from "./core/constants.js";
|
|
3
10
|
import { OutputFormatter } from "./output/formatter.js";
|
|
4
11
|
import { handleError, setJsonMode } from "./core/error-handler.js";
|
|
5
12
|
import { setNonInteractive } from "./output/prompts.js";
|
|
@@ -11,7 +18,7 @@ function isCi() {
|
|
|
11
18
|
}
|
|
12
19
|
const GLOBAL_OPTIONS_TEXT = `
|
|
13
20
|
Global Options:
|
|
14
|
-
-e, --environment <env>
|
|
21
|
+
-e, --environment <env> Key environment: beta or prod (default: beta)
|
|
15
22
|
--json Output as JSON
|
|
16
23
|
--org <id> Organization ID override
|
|
17
24
|
--project <id> Project ID override
|
|
@@ -51,7 +58,11 @@ Setup:
|
|
|
51
58
|
Run "para <command> --help" for more information on a specific command.
|
|
52
59
|
`;
|
|
53
60
|
function createProgram() {
|
|
54
|
-
const program = new Command().name(CLI_NAME).description("Unified CLI for Para SDK").version(CLI_VERSION, "-v, --version").option("--json", "Output as JSON", false).option(
|
|
61
|
+
const program = new Command().name(CLI_NAME).description("Unified CLI for Para SDK").version(CLI_VERSION, "-v, --version").option("--json", "Output as JSON", false).option(
|
|
62
|
+
"-e, --environment <env>",
|
|
63
|
+
"Key environment: beta or prod (default: beta)",
|
|
64
|
+
(value) => parseKeyEnvironment(value)
|
|
65
|
+
).option("--org <id>", "Organization ID override").option("--project <id>", "Project ID override").option("-q, --quiet", "Suppress non-essential output", false).option("--no-input", "Disable interactive prompts (auto-detected in CI)").showHelpAfterError('Run "para --help" for available commands.').exitOverride();
|
|
55
66
|
const originalHelpInfo = program.helpInformation.bind(program);
|
|
56
67
|
program.helpInformation = function() {
|
|
57
68
|
if (this.parent) {
|
|
@@ -82,14 +93,23 @@ function createProgram() {
|
|
|
82
93
|
}
|
|
83
94
|
async function getGlobalOptions(cmd) {
|
|
84
95
|
const opts = cmd.optsWithGlobals();
|
|
85
|
-
let
|
|
96
|
+
let keyEnvironment;
|
|
86
97
|
if (opts.environment) {
|
|
87
|
-
|
|
98
|
+
keyEnvironment = parseKeyEnvironment(opts.environment);
|
|
99
|
+
} else if (process.env["PARA_ENVIRONMENT"]) {
|
|
100
|
+
keyEnvironment = parseKeyEnvironment(process.env["PARA_ENVIRONMENT"]);
|
|
88
101
|
} else {
|
|
89
102
|
const projectConfig = await readProjectConfig(process.cwd()).catch(() => ({}));
|
|
90
103
|
const globalConfig = await readGlobalConfig();
|
|
91
104
|
const configEnv = projectConfig.environment ?? globalConfig.defaultEnvironment;
|
|
92
|
-
|
|
105
|
+
keyEnvironment = configEnv ? parseKeyEnvironment(configEnv) : DEFAULT_KEY_ENVIRONMENT;
|
|
106
|
+
}
|
|
107
|
+
let backend;
|
|
108
|
+
const backendEnv = process.env["PARA_BACKEND"];
|
|
109
|
+
if (backendEnv) {
|
|
110
|
+
backend = parseBackend(backendEnv);
|
|
111
|
+
} else {
|
|
112
|
+
backend = DEFAULT_BACKEND;
|
|
93
113
|
}
|
|
94
114
|
const json = opts.json ?? false;
|
|
95
115
|
if (json) setJsonMode(true);
|
|
@@ -97,7 +117,8 @@ async function getGlobalOptions(cmd) {
|
|
|
97
117
|
if (noInput) setNonInteractive(true);
|
|
98
118
|
return {
|
|
99
119
|
json,
|
|
100
|
-
|
|
120
|
+
backend,
|
|
121
|
+
keyEnvironment,
|
|
101
122
|
org: opts.org,
|
|
102
123
|
project: opts.project,
|
|
103
124
|
quiet: opts.quiet ?? false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA6C1D"}
|
|
@@ -9,7 +9,7 @@ function registerLoginCommand(parent) {
|
|
|
9
9
|
const opts = await getGlobalOptions(actionCmd);
|
|
10
10
|
const formatter = createFormatter(opts);
|
|
11
11
|
try {
|
|
12
|
-
const existing = await ensureAuthenticated(opts.
|
|
12
|
+
const existing = await ensureAuthenticated(opts.backend);
|
|
13
13
|
formatter.success(`Already authenticated as ${existing.email || existing.userId}`);
|
|
14
14
|
formatter.flush();
|
|
15
15
|
return;
|
|
@@ -17,27 +17,26 @@ function registerLoginCommand(parent) {
|
|
|
17
17
|
}
|
|
18
18
|
const spinner = createSpinner();
|
|
19
19
|
spinner.start("Waiting for browser authentication...");
|
|
20
|
-
const session = await startPollingLogin(opts.
|
|
20
|
+
const session = await startPollingLogin(opts.backend, {
|
|
21
21
|
openBrowser: cmdOpts.browser
|
|
22
22
|
});
|
|
23
23
|
spinner.stop("Browser authentication complete.");
|
|
24
|
-
await storeSession(opts.
|
|
25
|
-
formatter.json({ email: session.email, userId: session.userId,
|
|
24
|
+
await storeSession(opts.backend, session);
|
|
25
|
+
formatter.json({ email: session.email, userId: session.userId, backend: opts.backend });
|
|
26
26
|
formatter.success(`Authenticated as ${session.email || session.userId}`);
|
|
27
|
-
await autoResolveContext(session, opts.
|
|
27
|
+
await autoResolveContext(session, opts.backend, formatter);
|
|
28
28
|
formatter.flush();
|
|
29
29
|
});
|
|
30
30
|
addExamples(
|
|
31
31
|
cmd,
|
|
32
32
|
`Examples:
|
|
33
33
|
$ para login Opens the developer portal \u2014 sign in and the CLI picks up your session
|
|
34
|
-
$ para login --no-browser Prints a URL to open manually (useful for SSH/CI)
|
|
35
|
-
$ para login -e DEV Sign in against a local dev server`
|
|
34
|
+
$ para login --no-browser Prints a URL to open manually (useful for SSH/CI)`
|
|
36
35
|
);
|
|
37
36
|
}
|
|
38
|
-
async function autoResolveContext(session,
|
|
37
|
+
async function autoResolveContext(session, backend, formatter) {
|
|
39
38
|
try {
|
|
40
|
-
const client = new ParaApiClient({
|
|
39
|
+
const client = new ParaApiClient({ backend, sessionId: session.sessionId });
|
|
41
40
|
let userId = session.userId;
|
|
42
41
|
if (!userId) {
|
|
43
42
|
const status = await client.getAuthStatus();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA6C3D"}
|
|
@@ -8,10 +8,10 @@ function registerLogoutCommand(parent) {
|
|
|
8
8
|
const opts = await getGlobalOptions(actionCmd);
|
|
9
9
|
const formatter = createFormatter(opts);
|
|
10
10
|
try {
|
|
11
|
-
const session = await resolveSession(opts.
|
|
11
|
+
const session = await resolveSession(opts.backend);
|
|
12
12
|
if (session?.sessionId) {
|
|
13
13
|
const client = new ParaApiClient({
|
|
14
|
-
|
|
14
|
+
backend: opts.backend,
|
|
15
15
|
sessionId: session.sessionId
|
|
16
16
|
});
|
|
17
17
|
await client.logout().catch(() => {
|
|
@@ -25,19 +25,18 @@ function registerLogoutCommand(parent) {
|
|
|
25
25
|
formatter.json({ loggedOut: true, scope: "all" });
|
|
26
26
|
formatter.success("Cleared all stored sessions and context.");
|
|
27
27
|
} else {
|
|
28
|
-
await clearSession(opts.
|
|
28
|
+
await clearSession(opts.backend);
|
|
29
29
|
await updateGlobalConfig({ defaultOrganizationId: void 0, defaultProjectId: void 0 });
|
|
30
|
-
formatter.json({ loggedOut: true, scope: opts.
|
|
31
|
-
formatter.success(`Cleared session and context for ${opts.
|
|
30
|
+
formatter.json({ loggedOut: true, scope: opts.backend });
|
|
31
|
+
formatter.success(`Cleared session and context for ${opts.backend} backend.`);
|
|
32
32
|
}
|
|
33
33
|
formatter.flush();
|
|
34
34
|
});
|
|
35
35
|
addExamples(
|
|
36
36
|
cmd,
|
|
37
37
|
`Examples:
|
|
38
|
-
$ para logout Sign out of the current
|
|
39
|
-
$ para logout --all Sign out of every
|
|
40
|
-
$ para logout -e PROD Sign out of production only`
|
|
38
|
+
$ para logout Sign out of the current backend
|
|
39
|
+
$ para logout --all Sign out of every backend at once`
|
|
41
40
|
);
|
|
42
41
|
}
|
|
43
42
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAsD/D"}
|
|
@@ -6,11 +6,11 @@ function registerAuthStatusCommand(parent) {
|
|
|
6
6
|
const opts = await getGlobalOptions(actionCmd);
|
|
7
7
|
const formatter = createFormatter(opts);
|
|
8
8
|
try {
|
|
9
|
-
const session = await ensureAuthenticated(opts.
|
|
9
|
+
const session = await ensureAuthenticated(opts.backend);
|
|
10
10
|
if (opts.json) {
|
|
11
11
|
formatter.json({
|
|
12
12
|
authenticated: true,
|
|
13
|
-
|
|
13
|
+
backend: opts.backend,
|
|
14
14
|
email: session.email || void 0,
|
|
15
15
|
userId: session.userId || void 0,
|
|
16
16
|
expiresAt: session.expiresAt || void 0
|
|
@@ -18,7 +18,7 @@ function registerAuthStatusCommand(parent) {
|
|
|
18
18
|
} else {
|
|
19
19
|
formatter.detail([
|
|
20
20
|
{ label: "Status", value: "Authenticated" },
|
|
21
|
-
{ label: "
|
|
21
|
+
{ label: "Backend", value: opts.backend },
|
|
22
22
|
...session.email ? [{ label: "Email", value: session.email }] : [],
|
|
23
23
|
...session.expiresAt ? [
|
|
24
24
|
{
|
|
@@ -31,7 +31,7 @@ function registerAuthStatusCommand(parent) {
|
|
|
31
31
|
} catch (error) {
|
|
32
32
|
if (error instanceof AuthError) {
|
|
33
33
|
if (opts.json) {
|
|
34
|
-
formatter.json({ authenticated: false,
|
|
34
|
+
formatter.json({ authenticated: false, backend: opts.backend });
|
|
35
35
|
} else {
|
|
36
36
|
formatter.warn(error.message);
|
|
37
37
|
}
|
|
@@ -45,7 +45,6 @@ function registerAuthStatusCommand(parent) {
|
|
|
45
45
|
cmd,
|
|
46
46
|
`Examples:
|
|
47
47
|
$ para auth status Show session validity, email, and expiration
|
|
48
|
-
$ para auth status -e PROD Check auth for a specific environment
|
|
49
48
|
$ para auth status --json Output status as JSON (useful in scripts)`
|
|
50
49
|
);
|
|
51
50
|
}
|
package/dist/commands/config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getGlobalOptions, createFormatter, helpText } from "../cli.js";
|
|
2
2
|
import { readGlobalConfig, updateGlobalConfig, removeGlobalConfigKey } from "../config/config-store.js";
|
|
3
3
|
import { readProjectConfig, writeProjectConfig } from "../config/project-config.js";
|
|
4
|
-
import {
|
|
4
|
+
import { parseKeyEnvironment } from "../core/constants.js";
|
|
5
5
|
const VALID_KEYS = ["defaultOrganizationId", "defaultProjectId", "defaultEnvironment"];
|
|
6
6
|
function registerConfigCommand(program) {
|
|
7
7
|
const config = program.command("config").description("View or update CLI configuration");
|
|
@@ -62,8 +62,8 @@ Valid keys: defaultOrganizationId, defaultProjectId, defaultEnvironment`)
|
|
|
62
62
|
config.command("set").description("Set a configuration value").argument("<key>", "Configuration key").argument("<value>", "Configuration value").option("--local", "Write to project .pararc instead of global config").addHelpText(
|
|
63
63
|
"after",
|
|
64
64
|
helpText(`Examples:
|
|
65
|
-
$ para config set defaultEnvironment
|
|
66
|
-
$ para config set defaultEnvironment
|
|
65
|
+
$ para config set defaultEnvironment beta Set global default environment
|
|
66
|
+
$ para config set defaultEnvironment prod --local Set for this project only
|
|
67
67
|
|
|
68
68
|
Valid keys: defaultOrganizationId, defaultProjectId, defaultEnvironment`)
|
|
69
69
|
).action(async (key, value, cmdOpts, cmd) => {
|
|
@@ -75,9 +75,9 @@ Valid keys: defaultOrganizationId, defaultProjectId, defaultEnvironment`)
|
|
|
75
75
|
}
|
|
76
76
|
if (key === "defaultEnvironment" || key === "environment") {
|
|
77
77
|
try {
|
|
78
|
-
|
|
78
|
+
parseKeyEnvironment(value);
|
|
79
79
|
} catch {
|
|
80
|
-
formatter.error(`Invalid environment "${value}". Valid values:
|
|
80
|
+
formatter.error(`Invalid environment "${value}". Valid values: beta, prod`);
|
|
81
81
|
process.exit(2);
|
|
82
82
|
}
|
|
83
83
|
}
|
package/dist/commands/create.js
CHANGED
|
@@ -295,7 +295,7 @@ function isNonInteractive(appName, opts) {
|
|
|
295
295
|
const CREATE_NEW = "__create_new__";
|
|
296
296
|
async function connectProjectApiKey(targetDir, scaffoldConfig, opts, silent) {
|
|
297
297
|
try {
|
|
298
|
-
const session = await ensureAuthenticated(opts.
|
|
298
|
+
const session = await ensureAuthenticated(opts.backend);
|
|
299
299
|
if (!silent) {
|
|
300
300
|
const shouldConnect = await confirm(
|
|
301
301
|
`Signed in as ${session.email || session.userId}. Connect to a Para project to auto-configure your API key?`
|
|
@@ -303,7 +303,7 @@ async function connectProjectApiKey(targetDir, scaffoldConfig, opts, silent) {
|
|
|
303
303
|
if (!shouldConnect) return false;
|
|
304
304
|
}
|
|
305
305
|
const client = new ParaApiClient({
|
|
306
|
-
|
|
306
|
+
backend: opts.backend,
|
|
307
307
|
sessionId: session.sessionId
|
|
308
308
|
});
|
|
309
309
|
const config = await resolveConfig(opts);
|
|
@@ -370,7 +370,7 @@ async function connectProjectApiKey(targetDir, scaffoldConfig, opts, silent) {
|
|
|
370
370
|
p.log.success(`Created project "${newProject.name}"`);
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
|
-
const keys = await client.getApiKeys(orgId, projectId, opts.
|
|
373
|
+
const keys = await client.getApiKeys(orgId, projectId, opts.keyEnvironment);
|
|
374
374
|
const activeKeys = keys.filter((k) => !k.archived);
|
|
375
375
|
let apiKeyValue;
|
|
376
376
|
if (silent) {
|
|
@@ -401,7 +401,7 @@ async function connectProjectApiKey(targetDir, scaffoldConfig, opts, silent) {
|
|
|
401
401
|
if (!v.trim()) return "Name is required.";
|
|
402
402
|
}
|
|
403
403
|
});
|
|
404
|
-
const newKey = await client.createApiKey(orgId, projectId, opts.
|
|
404
|
+
const newKey = await client.createApiKey(orgId, projectId, opts.keyEnvironment, { name: keyName });
|
|
405
405
|
apiKeyValue = newKey.apiKey;
|
|
406
406
|
p.log.success(`Created API key "${keyName}"`);
|
|
407
407
|
}
|
|
@@ -409,7 +409,7 @@ async function connectProjectApiKey(targetDir, scaffoldConfig, opts, silent) {
|
|
|
409
409
|
const envExamplePath = path.join(targetDir, ".env.example");
|
|
410
410
|
const envPath = path.join(targetDir, ".env");
|
|
411
411
|
const envContent = await readFile(envExamplePath);
|
|
412
|
-
const envWithKey = envContent.replaceAll("your_api_key_here", apiKeyValue).replace(/PARA_ENVIRONMENT=\w+/, `PARA_ENVIRONMENT=${opts.
|
|
412
|
+
const envWithKey = envContent.replaceAll("your_api_key_here", apiKeyValue).replace(/PARA_ENVIRONMENT=\w+/, `PARA_ENVIRONMENT=${opts.keyEnvironment}`);
|
|
413
413
|
await writeFile(envPath, envWithKey);
|
|
414
414
|
if (silent) {
|
|
415
415
|
console.log(pc.green("\u2713"), "API key written to .env");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6C1D"}
|
package/dist/commands/init.js
CHANGED
|
@@ -24,11 +24,9 @@ multiple projects so each repo automatically uses the right context.`)
|
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
const config = await resolveConfig(opts, cwd);
|
|
27
|
-
const environment = opts.noInput ? opts.
|
|
28
|
-
{ value: "
|
|
29
|
-
{ value: "
|
|
30
|
-
{ value: "SANDBOX", label: "Sandbox (internal testing)" },
|
|
31
|
-
{ value: "DEV", label: "Development (local)" }
|
|
27
|
+
const environment = opts.noInput ? opts.keyEnvironment : await select("Select default key environment:", [
|
|
28
|
+
{ value: "beta", label: "Beta (default)" },
|
|
29
|
+
{ value: "prod", label: "Production" }
|
|
32
30
|
]);
|
|
33
31
|
await writeProjectConfig(cwd, {
|
|
34
32
|
environment,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA4DhE"}
|
|
@@ -4,25 +4,39 @@ import { resolveConfig } from "../../config/config-manager.js";
|
|
|
4
4
|
import { ParaApiClient } from "../../api/client.js";
|
|
5
5
|
import { CliError } from "../../core/error-handler.js";
|
|
6
6
|
import { confirm } from "../../output/prompts.js";
|
|
7
|
+
import { resolveKeyId } from "./config/categories.js";
|
|
7
8
|
function registerKeysArchiveCommand(parent) {
|
|
8
|
-
parent.command("archive").description("Archive (revoke) an API key").argument("
|
|
9
|
+
parent.command("archive").description("Archive (revoke) an API key").argument("[key-id]", "API key ID to archive (resolved from project + environment if omitted)").option("-y, --yes", "Skip confirmation prompt").addHelpText(
|
|
9
10
|
"after",
|
|
10
11
|
helpText(`Examples:
|
|
11
|
-
$ para keys archive
|
|
12
|
+
$ para keys archive Archive the beta key (asks for confirmation)
|
|
13
|
+
$ para keys archive -e prod Archive the prod key
|
|
14
|
+
$ para keys archive abc-123 Archive a specific key by ID
|
|
12
15
|
$ para keys archive abc-123 -y Skip confirmation (for scripts)
|
|
13
16
|
|
|
14
17
|
This is irreversible \u2014 the archived key stops working immediately.
|
|
15
18
|
Use "para keys list --include-archived" to see archived keys.`)
|
|
16
|
-
).action(async (
|
|
19
|
+
).action(async (keyIdArg, cmdOpts, cmd) => {
|
|
17
20
|
const opts = await getGlobalOptions(cmd);
|
|
18
21
|
const formatter = createFormatter(opts);
|
|
19
22
|
const config = await resolveConfig(opts);
|
|
20
|
-
const session = await ensureAuthenticated(config.
|
|
23
|
+
const session = await ensureAuthenticated(config.backend);
|
|
21
24
|
if (!config.organizationId || !config.projectId) {
|
|
22
25
|
throw new CliError(
|
|
23
26
|
"Organization and project required. Run `para orgs switch` and `para projects switch`, or pass --org and --project."
|
|
24
27
|
);
|
|
25
28
|
}
|
|
29
|
+
const client = new ParaApiClient({
|
|
30
|
+
backend: config.backend,
|
|
31
|
+
sessionId: session.sessionId
|
|
32
|
+
});
|
|
33
|
+
const { keyId, key } = await resolveKeyId(
|
|
34
|
+
client,
|
|
35
|
+
config.organizationId,
|
|
36
|
+
config.projectId,
|
|
37
|
+
config.keyEnvironment,
|
|
38
|
+
keyIdArg
|
|
39
|
+
);
|
|
26
40
|
if (!cmdOpts.yes) {
|
|
27
41
|
const confirmed = await confirm("Are you sure you want to archive this API key? It will stop working immediately.");
|
|
28
42
|
if (!confirmed) {
|
|
@@ -31,15 +45,11 @@ Use "para keys list --include-archived" to see archived keys.`)
|
|
|
31
45
|
return;
|
|
32
46
|
}
|
|
33
47
|
}
|
|
34
|
-
|
|
35
|
-
environment: config.environment,
|
|
36
|
-
sessionId: session.sessionId
|
|
37
|
-
});
|
|
38
|
-
await client.deleteApiKey(config.organizationId, config.projectId, config.environment, keyId);
|
|
48
|
+
await client.deleteApiKey(config.organizationId, config.projectId, config.keyEnvironment, keyId);
|
|
39
49
|
if (opts.json) {
|
|
40
50
|
formatter.json({ id: keyId, archived: true });
|
|
41
51
|
} else {
|
|
42
|
-
formatter.success(`Archived
|
|
52
|
+
formatter.success(`Archived ${key.displayName || key.name} (${key.environment})`);
|
|
43
53
|
}
|
|
44
54
|
formatter.flush();
|
|
45
55
|
});
|
|
@@ -26,28 +26,28 @@ function registerBrandingConfigCommand(parent) {
|
|
|
26
26
|
const opts = await getGlobalOptions(cmd);
|
|
27
27
|
const formatter = createFormatter(opts);
|
|
28
28
|
const config = await resolveConfig(opts);
|
|
29
|
-
const session = await ensureAuthenticated(config.
|
|
29
|
+
const session = await ensureAuthenticated(config.backend);
|
|
30
30
|
if (!config.organizationId || !config.projectId) {
|
|
31
31
|
throw new CliError(
|
|
32
32
|
"Organization and project required. Run `para orgs switch` and `para projects switch`, or pass --org and --project."
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
const client = new ParaApiClient({
|
|
36
|
-
|
|
36
|
+
backend: config.backend,
|
|
37
37
|
sessionId: session.sessionId
|
|
38
38
|
});
|
|
39
39
|
const { keyId, key } = await resolveKeyId(
|
|
40
40
|
client,
|
|
41
41
|
config.organizationId,
|
|
42
42
|
config.projectId,
|
|
43
|
-
config.
|
|
43
|
+
config.keyEnvironment,
|
|
44
44
|
keyIdArg
|
|
45
45
|
);
|
|
46
46
|
await runBrandingAction(
|
|
47
47
|
client,
|
|
48
48
|
config.organizationId,
|
|
49
49
|
config.projectId,
|
|
50
|
-
config.
|
|
50
|
+
config.keyEnvironment,
|
|
51
51
|
keyId,
|
|
52
52
|
key,
|
|
53
53
|
formatter,
|
|
@@ -237,7 +237,7 @@ async function runBrandingAction(client, orgId, projectId, environment, keyId, c
|
|
|
237
237
|
}
|
|
238
238
|
await client.updateApiKey(orgId, projectId, environment, keyId, updates);
|
|
239
239
|
formatter.json({ keyId, updated: updates });
|
|
240
|
-
formatter.success(
|
|
240
|
+
formatter.success(`Updated branding on ${currentKey.displayName || currentKey.name} (${currentKey.environment})`);
|
|
241
241
|
formatter.flush();
|
|
242
242
|
}
|
|
243
243
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../../../src/commands/keys/config/categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAMpE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,UAAU,EAAE,WAAW,EAMnC,CAAC;AAIF,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../../../src/commands/keys/config/categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAMpE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,UAAU,EAAE,WAAW,EAMnC,CAAC;AAIF,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAsDzC;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
|
@@ -20,6 +20,24 @@ async function resolveKeyId(client, orgId, projectId, environment, keyIdArg) {
|
|
|
20
20
|
if (active.length === 0) {
|
|
21
21
|
throw new CliError("No API keys found. Run `para keys create` first.");
|
|
22
22
|
}
|
|
23
|
+
const envMatch = active.filter((k) => k.environment.toLowerCase() === environment.toLowerCase());
|
|
24
|
+
if (envMatch.length === 1) {
|
|
25
|
+
p.log.info(`Using ${envMatch[0].environment} key (${maskSecret(envMatch[0].apiKey)})`);
|
|
26
|
+
return { keyId: envMatch[0].id, key: envMatch[0] };
|
|
27
|
+
}
|
|
28
|
+
if (envMatch.length > 1) {
|
|
29
|
+
const selected2 = await select(
|
|
30
|
+
`Multiple ${environment} keys found. Select one:`,
|
|
31
|
+
envMatch.map((k) => ({
|
|
32
|
+
value: k.id,
|
|
33
|
+
label: k.displayName || k.name,
|
|
34
|
+
hint: maskSecret(k.apiKey)
|
|
35
|
+
}))
|
|
36
|
+
);
|
|
37
|
+
const key2 = envMatch.find((k) => k.id === selected2);
|
|
38
|
+
if (!key2) throw new CliError("Selected API key no longer exists. Please try again.");
|
|
39
|
+
return { keyId: selected2, key: key2 };
|
|
40
|
+
}
|
|
23
41
|
if (active.length === 1) {
|
|
24
42
|
p.log.info(`Using key ${active[0].displayName || active[0].name} (${maskSecret(active[0].apiKey)})`);
|
|
25
43
|
return { keyId: active[0].id, key: active[0] };
|
|
@@ -28,7 +46,7 @@ async function resolveKeyId(client, orgId, projectId, environment, keyIdArg) {
|
|
|
28
46
|
"Select API key:",
|
|
29
47
|
active.map((k) => ({
|
|
30
48
|
value: k.id,
|
|
31
|
-
label: k.displayName || k.name
|
|
49
|
+
label: `${k.displayName || k.name} (${k.environment})`,
|
|
32
50
|
hint: maskSecret(k.apiKey)
|
|
33
51
|
}))
|
|
34
52
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/keys/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/keys/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2D/D"}
|