@getpara/cli 2.15.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/README.md +97 -0
- package/dist/api/client.d.ts +49 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +247 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +29 -0
- package/dist/api/types.d.ts +155 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +58 -0
- package/dist/auth/polling-flow.d.ts +7 -0
- package/dist/auth/polling-flow.d.ts.map +1 -0
- package/dist/auth/polling-flow.js +94 -0
- package/dist/auth/session-manager.d.ts +7 -0
- package/dist/auth/session-manager.d.ts.map +1 -0
- package/dist/auth/session-manager.js +42 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +151 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +18 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +70 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +45 -0
- package/dist/commands/auth/status.d.ts +3 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +54 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +122 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +587 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +67 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +45 -0
- package/dist/commands/keys/archive.d.ts +3 -0
- package/dist/commands/keys/archive.d.ts.map +1 -0
- package/dist/commands/keys/archive.js +49 -0
- package/dist/commands/keys/config/branding.d.ts +23 -0
- package/dist/commands/keys/config/branding.d.ts.map +1 -0
- package/dist/commands/keys/config/branding.js +246 -0
- package/dist/commands/keys/config/categories.d.ts +15 -0
- package/dist/commands/keys/config/categories.d.ts.map +1 -0
- package/dist/commands/keys/config/categories.js +67 -0
- package/dist/commands/keys/config/index.d.ts +3 -0
- package/dist/commands/keys/config/index.d.ts.map +1 -0
- package/dist/commands/keys/config/index.js +56 -0
- package/dist/commands/keys/config/ramps.d.ts +18 -0
- package/dist/commands/keys/config/ramps.d.ts.map +1 -0
- package/dist/commands/keys/config/ramps.js +185 -0
- package/dist/commands/keys/config/security.d.ts +15 -0
- package/dist/commands/keys/config/security.d.ts.map +1 -0
- package/dist/commands/keys/config/security.js +212 -0
- package/dist/commands/keys/config/setup.d.ts +16 -0
- package/dist/commands/keys/config/setup.d.ts.map +1 -0
- package/dist/commands/keys/config/setup.js +235 -0
- package/dist/commands/keys/config/webhooks.d.ts +18 -0
- package/dist/commands/keys/config/webhooks.d.ts.map +1 -0
- package/dist/commands/keys/config/webhooks.js +279 -0
- package/dist/commands/keys/create.d.ts +3 -0
- package/dist/commands/keys/create.d.ts.map +1 -0
- package/dist/commands/keys/create.js +64 -0
- package/dist/commands/keys/get.d.ts +3 -0
- package/dist/commands/keys/get.d.ts.map +1 -0
- package/dist/commands/keys/get.js +91 -0
- package/dist/commands/keys/index.d.ts +3 -0
- package/dist/commands/keys/index.d.ts.map +1 -0
- package/dist/commands/keys/index.js +22 -0
- package/dist/commands/keys/list.d.ts +3 -0
- package/dist/commands/keys/list.d.ts.map +1 -0
- package/dist/commands/keys/list.js +66 -0
- package/dist/commands/keys/rotate.d.ts +3 -0
- package/dist/commands/keys/rotate.d.ts.map +1 -0
- package/dist/commands/keys/rotate.js +59 -0
- package/dist/commands/orgs/index.d.ts +3 -0
- package/dist/commands/orgs/index.d.ts.map +1 -0
- package/dist/commands/orgs/index.js +15 -0
- package/dist/commands/orgs/list.d.ts +3 -0
- package/dist/commands/orgs/list.d.ts.map +1 -0
- package/dist/commands/orgs/list.js +53 -0
- package/dist/commands/orgs/switch.d.ts +3 -0
- package/dist/commands/orgs/switch.d.ts.map +1 -0
- package/dist/commands/orgs/switch.js +61 -0
- package/dist/commands/projects/archive.d.ts +3 -0
- package/dist/commands/projects/archive.d.ts.map +1 -0
- package/dist/commands/projects/archive.js +51 -0
- package/dist/commands/projects/create.d.ts +3 -0
- package/dist/commands/projects/create.d.ts.map +1 -0
- package/dist/commands/projects/create.js +48 -0
- package/dist/commands/projects/index.d.ts +3 -0
- package/dist/commands/projects/index.d.ts.map +1 -0
- package/dist/commands/projects/index.js +25 -0
- package/dist/commands/projects/list.d.ts +3 -0
- package/dist/commands/projects/list.d.ts.map +1 -0
- package/dist/commands/projects/list.js +52 -0
- package/dist/commands/projects/restore.d.ts +3 -0
- package/dist/commands/projects/restore.d.ts.map +1 -0
- package/dist/commands/projects/restore.js +36 -0
- package/dist/commands/projects/switch.d.ts +3 -0
- package/dist/commands/projects/switch.d.ts.map +1 -0
- package/dist/commands/projects/switch.js +57 -0
- package/dist/commands/projects/update.d.ts +3 -0
- package/dist/commands/projects/update.d.ts.map +1 -0
- package/dist/commands/projects/update.js +67 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +61 -0
- package/dist/config/config-manager.d.ts +3 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +32 -0
- package/dist/config/config-store.d.ts +10 -0
- package/dist/config/config-store.d.ts.map +1 -0
- package/dist/config/config-store.js +37 -0
- package/dist/config/credential-store.d.ts +12 -0
- package/dist/config/credential-store.d.ts.map +1 -0
- package/dist/config/credential-store.js +94 -0
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +29 -0
- package/dist/config/project-config.d.ts +8 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +41 -0
- package/dist/core/constants.d.ts +27 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +60 -0
- package/dist/core/error-handler.d.ts +24 -0
- package/dist/core/error-handler.d.ts.map +1 -0
- package/dist/core/error-handler.js +83 -0
- package/dist/core/types.d.ts +21 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +0 -0
- package/dist/core/update-check.d.ts +6 -0
- package/dist/core/update-check.d.ts.map +1 -0
- package/dist/core/update-check.js +78 -0
- package/dist/diagnostics/checks/chain-dependencies.d.ts +2 -0
- package/dist/diagnostics/checks/chain-dependencies.d.ts.map +1 -0
- package/dist/diagnostics/checks/chain-dependencies.js +130 -0
- package/dist/diagnostics/checks/css-import.d.ts +2 -0
- package/dist/diagnostics/checks/css-import.d.ts.map +1 -0
- package/dist/diagnostics/checks/css-import.js +57 -0
- package/dist/diagnostics/checks/deprecated-packages.d.ts +2 -0
- package/dist/diagnostics/checks/deprecated-packages.d.ts.map +1 -0
- package/dist/diagnostics/checks/deprecated-packages.js +93 -0
- package/dist/diagnostics/checks/env-api-key.d.ts +2 -0
- package/dist/diagnostics/checks/env-api-key.d.ts.map +1 -0
- package/dist/diagnostics/checks/env-api-key.js +75 -0
- package/dist/diagnostics/checks/env-var-prefix.d.ts +2 -0
- package/dist/diagnostics/checks/env-var-prefix.d.ts.map +1 -0
- package/dist/diagnostics/checks/env-var-prefix.js +52 -0
- package/dist/diagnostics/checks/index.d.ts +13 -0
- package/dist/diagnostics/checks/index.d.ts.map +1 -0
- package/dist/diagnostics/checks/index.js +32 -0
- package/dist/diagnostics/checks/para-provider.d.ts +2 -0
- package/dist/diagnostics/checks/para-provider.d.ts.map +1 -0
- package/dist/diagnostics/checks/para-provider.js +42 -0
- package/dist/diagnostics/checks/query-client.d.ts +2 -0
- package/dist/diagnostics/checks/query-client.d.ts.map +1 -0
- package/dist/diagnostics/checks/query-client.js +58 -0
- package/dist/diagnostics/checks/use-client-directive.d.ts +2 -0
- package/dist/diagnostics/checks/use-client-directive.d.ts.map +1 -0
- package/dist/diagnostics/checks/use-client-directive.js +81 -0
- package/dist/diagnostics/checks/version-consistency.d.ts +2 -0
- package/dist/diagnostics/checks/version-consistency.d.ts.map +1 -0
- package/dist/diagnostics/checks/version-consistency.js +93 -0
- package/dist/diagnostics/context.d.ts +3 -0
- package/dist/diagnostics/context.d.ts.map +1 -0
- package/dist/diagnostics/context.js +56 -0
- package/dist/diagnostics/detectors/framework.d.ts +5 -0
- package/dist/diagnostics/detectors/framework.d.ts.map +1 -0
- package/dist/diagnostics/detectors/framework.js +73 -0
- package/dist/diagnostics/detectors/package-manager.d.ts +3 -0
- package/dist/diagnostics/detectors/package-manager.d.ts.map +1 -0
- package/dist/diagnostics/detectors/package-manager.js +17 -0
- package/dist/diagnostics/detectors/sdk.d.ts +7 -0
- package/dist/diagnostics/detectors/sdk.d.ts.map +1 -0
- package/dist/diagnostics/detectors/sdk.js +48 -0
- package/dist/diagnostics/runner.d.ts +3 -0
- package/dist/diagnostics/runner.d.ts.map +1 -0
- package/dist/diagnostics/runner.js +44 -0
- package/dist/diagnostics/types.d.ts +70 -0
- package/dist/diagnostics/types.d.ts.map +1 -0
- package/dist/diagnostics/types.js +14 -0
- package/dist/diagnostics/utils/code-search.d.ts +10 -0
- package/dist/diagnostics/utils/code-search.d.ts.map +1 -0
- package/dist/diagnostics/utils/code-search.js +98 -0
- package/dist/diagnostics/utils/file-system.d.ts +7 -0
- package/dist/diagnostics/utils/file-system.d.ts.map +1 -0
- package/dist/diagnostics/utils/file-system.js +72 -0
- package/dist/diagnostics/utils/package-json.d.ts +12 -0
- package/dist/diagnostics/utils/package-json.d.ts.map +1 -0
- package/dist/diagnostics/utils/package-json.js +51 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/output/formatter.d.ts +25 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +76 -0
- package/dist/output/mask.d.ts +2 -0
- package/dist/output/mask.d.ts.map +1 -0
- package/dist/output/mask.js +15 -0
- package/dist/output/prompts.d.ts +25 -0
- package/dist/output/prompts.d.ts.map +1 -0
- package/dist/output/prompts.js +86 -0
- package/dist/output/spinner.d.ts +6 -0
- package/dist/output/spinner.d.ts.map +1 -0
- package/dist/output/spinner.js +7 -0
- package/dist/output/table.d.ts +9 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +21 -0
- package/dist/scaffolding/scaffolder.d.ts +3 -0
- package/dist/scaffolding/scaffolder.d.ts.map +1 -0
- package/dist/scaffolding/scaffolder.js +78 -0
- package/dist/scaffolding/strategies/expo-template.d.ts +16 -0
- package/dist/scaffolding/strategies/expo-template.d.ts.map +1 -0
- package/dist/scaffolding/strategies/expo-template.js +160 -0
- package/dist/scaffolding/strategies/index.d.ts +5 -0
- package/dist/scaffolding/strategies/index.d.ts.map +1 -0
- package/dist/scaffolding/strategies/index.js +25 -0
- package/dist/scaffolding/strategies/nextjs-template.d.ts +12 -0
- package/dist/scaffolding/strategies/nextjs-template.d.ts.map +1 -0
- package/dist/scaffolding/strategies/nextjs-template.js +122 -0
- package/dist/scaffolding/template-renderer.d.ts +11 -0
- package/dist/scaffolding/template-renderer.d.ts.map +1 -0
- package/dist/scaffolding/template-renderer.js +99 -0
- package/dist/scaffolding/types.d.ts +69 -0
- package/dist/scaffolding/types.d.ts.map +1 -0
- package/dist/scaffolding/types.js +21 -0
- package/dist/scaffolding/utils/detect-package-manager.d.ts +23 -0
- package/dist/scaffolding/utils/detect-package-manager.d.ts.map +1 -0
- package/dist/scaffolding/utils/detect-package-manager.js +57 -0
- package/dist/scaffolding/utils/fs.d.ts +11 -0
- package/dist/scaffolding/utils/fs.d.ts.map +1 -0
- package/dist/scaffolding/utils/fs.js +45 -0
- package/dist/scaffolding/utils/resolve-para-version.d.ts +7 -0
- package/dist/scaffolding/utils/resolve-para-version.d.ts.map +1 -0
- package/dist/scaffolding/utils/resolve-para-version.js +21 -0
- package/dist/validation/auth-methods.d.ts +14 -0
- package/dist/validation/auth-methods.d.ts.map +1 -0
- package/dist/validation/auth-methods.js +23 -0
- package/dist/validation/cidr.d.ts +11 -0
- package/dist/validation/cidr.d.ts.map +1 -0
- package/dist/validation/cidr.js +35 -0
- package/dist/validation/hex-color.d.ts +7 -0
- package/dist/validation/hex-color.d.ts.map +1 -0
- package/dist/validation/hex-color.js +10 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +49 -0
- package/dist/validation/native-passkey.d.ts +31 -0
- package/dist/validation/native-passkey.d.ts.map +1 -0
- package/dist/validation/native-passkey.js +45 -0
- package/dist/validation/session-length.d.ts +18 -0
- package/dist/validation/session-length.d.ts.map +1 -0
- package/dist/validation/session-length.js +30 -0
- package/dist/validation/url.d.ts +26 -0
- package/dist/validation/url.d.ts.map +1 -0
- package/dist/validation/url.js +50 -0
- package/dist/validation/wallet-types.d.ts +14 -0
- package/dist/validation/wallet-types.d.ts.map +1 -0
- package/dist/validation/wallet-types.js +22 -0
- package/dist/validation/webhook.d.ts +4 -0
- package/dist/validation/webhook.d.ts.map +1 -0
- package/dist/validation/webhook.js +33 -0
- package/package.json +60 -0
- package/templates/expo/_env.example +3 -0
- package/templates/expo/_gitignore +48 -0
- package/templates/expo/_yarnrc.yml +1 -0
- package/templates/expo/app/(auth)/_layout.tsx +12 -0
- package/templates/expo/app/(auth)/index.tsx.template +86 -0
- package/templates/expo/app/(tabs)/_layout.tsx +16 -0
- package/templates/expo/app/(tabs)/index.tsx +112 -0
- package/templates/expo/app/(tabs)/send.tsx +111 -0
- package/templates/expo/app/_layout.tsx +17 -0
- package/templates/expo/app/index.tsx +22 -0
- package/templates/expo/app.json.template +32 -0
- package/templates/expo/assets/adaptive-icon.png +0 -0
- package/templates/expo/assets/favicon.png +0 -0
- package/templates/expo/assets/icon.png +0 -0
- package/templates/expo/assets/splash.png +0 -0
- package/templates/expo/babel.config.cjs +12 -0
- package/templates/expo/components/features/AuthForm.tsx.template +138 -0
- package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
- package/templates/expo/components/features/index.ts.template +4 -0
- package/templates/expo/components/ui/Button.tsx +58 -0
- package/templates/expo/components/ui/Card.tsx +11 -0
- package/templates/expo/components/ui/Divider.tsx +19 -0
- package/templates/expo/components/ui/Input.tsx +23 -0
- package/templates/expo/components/ui/WalletCard.tsx +44 -0
- package/templates/expo/components/ui/index.ts +5 -0
- package/templates/expo/eslint.config.cjs +15 -0
- package/templates/expo/global.css +3 -0
- package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
- package/templates/expo/hooks/useViemClient.ts +118 -0
- package/templates/expo/hooks/useWallets.ts +52 -0
- package/templates/expo/index.js +2 -0
- package/templates/expo/lib/auth.ts +54 -0
- package/templates/expo/lib/constants.ts.template +2 -0
- package/templates/expo/lib/para.ts +14 -0
- package/templates/expo/metro.config.cjs +14 -0
- package/templates/expo/nativewind-env.d.ts +2 -0
- package/templates/expo/prettier.config.cjs +10 -0
- package/templates/expo/providers/ParaProvider.tsx +140 -0
- package/templates/expo/tailwind.config.cjs +23 -0
- package/templates/expo/tsconfig.json +11 -0
- package/templates/expo/types/index.ts +28 -0
- package/templates/nextjs/README.md +69 -0
- package/templates/nextjs/_env.example +8 -0
- package/templates/nextjs/_gitignore +36 -0
- package/templates/nextjs/_yarnrc.yml +1 -0
- package/templates/nextjs/eslint.config.mjs +10 -0
- package/templates/nextjs/next.config.ts +5 -0
- package/templates/nextjs/postcss.config.mjs +7 -0
- package/templates/nextjs/public/para.svg +3 -0
- package/templates/nextjs/src/app/layout.tsx +30 -0
- package/templates/nextjs/src/app/page.tsx +40 -0
- package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
- package/templates/nextjs/src/components/layout/Header.tsx +44 -0
- package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
- package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
- package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
- package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
- package/templates/nextjs/src/styles/globals.css +1 -0
- package/templates/nextjs/tsconfig.json +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling-flow.d.ts","sourceRoot":"","sources":["../../src/auth/polling-flow.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAepD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsEtH"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { randomBytes, createHash } from "node:crypto";
|
|
2
|
+
import { PORTAL_URLS, BASE_URLS, DEV_PORTAL_API_KEY } from "../core/constants.js";
|
|
3
|
+
import { AuthError } from "../core/error-handler.js";
|
|
4
|
+
const POLL_INTERVAL_MS = 2e3;
|
|
5
|
+
const POLL_TIMEOUT_MS = 60 * 1e3;
|
|
6
|
+
function generateCodeVerifier() {
|
|
7
|
+
return randomBytes(32).toString("base64url").slice(0, 64);
|
|
8
|
+
}
|
|
9
|
+
function generateCodeChallenge(verifier) {
|
|
10
|
+
return createHash("sha256").update(verifier).digest("base64url");
|
|
11
|
+
}
|
|
12
|
+
async function startPollingLogin(environment, opts = {}) {
|
|
13
|
+
const { openBrowser = true } = opts;
|
|
14
|
+
const codeVerifier = generateCodeVerifier();
|
|
15
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
16
|
+
const portalUrl = PORTAL_URLS[environment];
|
|
17
|
+
const baseUrl = BASE_URLS[environment];
|
|
18
|
+
const createResponse = await fetch(`${baseUrl}/cli/auth/session-lookup`, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: {
|
|
21
|
+
"Content-Type": "application/json",
|
|
22
|
+
"X-External-API-Key": DEV_PORTAL_API_KEY
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify({ codeChallenge, codeChallengeMethod: "S256" })
|
|
25
|
+
});
|
|
26
|
+
if (!createResponse.ok) {
|
|
27
|
+
throw new AuthError("Failed to create session lookup. Please try again.");
|
|
28
|
+
}
|
|
29
|
+
const { id: lookupId } = await createResponse.json();
|
|
30
|
+
if (!lookupId) {
|
|
31
|
+
throw new AuthError("Server returned an invalid session lookup response.");
|
|
32
|
+
}
|
|
33
|
+
const loginUrl = `${portalUrl}/cli-auth?lookup_id=${lookupId}`;
|
|
34
|
+
if (openBrowser) {
|
|
35
|
+
console.log("Opening browser for authentication...");
|
|
36
|
+
console.log(`If the browser doesn't open, visit: ${loginUrl}`);
|
|
37
|
+
try {
|
|
38
|
+
const { default: open } = await import("open");
|
|
39
|
+
await open(loginUrl);
|
|
40
|
+
} catch {
|
|
41
|
+
console.log(`Open this URL in your browser:
|
|
42
|
+
${loginUrl}`);
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
console.log(`Open this URL in any browser to authenticate:
|
|
46
|
+
${loginUrl}`);
|
|
47
|
+
}
|
|
48
|
+
const startTime = Date.now();
|
|
49
|
+
while (Date.now() - startTime < POLL_TIMEOUT_MS) {
|
|
50
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(`${baseUrl}/cli/auth/session-lookup/${lookupId}/status`, {
|
|
53
|
+
headers: {
|
|
54
|
+
"X-External-API-Key": DEV_PORTAL_API_KEY
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
if (response.ok) {
|
|
58
|
+
const data = await response.json();
|
|
59
|
+
if (data.authenticated && data.code) {
|
|
60
|
+
return await exchangeCodeForSession(baseUrl, data.code, codeVerifier);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw new AuthError("Authentication timed out. Please try again.");
|
|
67
|
+
}
|
|
68
|
+
async function exchangeCodeForSession(baseUrl, code, codeVerifier) {
|
|
69
|
+
const response = await fetch(`${baseUrl}/cli/auth/callback`, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: {
|
|
72
|
+
"Content-Type": "application/json",
|
|
73
|
+
"X-External-API-Key": DEV_PORTAL_API_KEY
|
|
74
|
+
},
|
|
75
|
+
body: JSON.stringify({ code, code_verifier: codeVerifier })
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new AuthError("Failed to exchange authorization code for session.");
|
|
79
|
+
}
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
const sessionId = response.headers.get("x-capsule-sid");
|
|
82
|
+
if (!sessionId) {
|
|
83
|
+
throw new AuthError("Server did not return session cookie in x-capsule-sid header");
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
sessionId,
|
|
87
|
+
userId: data.userId,
|
|
88
|
+
email: data.email,
|
|
89
|
+
expiresAt: data.sessionExpiresAt
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export {
|
|
93
|
+
startPollingLogin
|
|
94
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Environment } from '../core/constants.js';
|
|
2
|
+
import type { SessionInfo } from '../core/types.js';
|
|
3
|
+
import { storeSession, clearSession } from '../config/credential-store.js';
|
|
4
|
+
export declare function resolveSession(environment: Environment): Promise<SessionInfo | null>;
|
|
5
|
+
export declare function ensureAuthenticated(environment: Environment): Promise<SessionInfo>;
|
|
6
|
+
export { storeSession, clearSession };
|
|
7
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/auth/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAc,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGvF,wBAAsB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAE1F;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAuCxF;AAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AuthError } from "../core/error-handler.js";
|
|
2
|
+
import { getSession, storeSession, clearSession } from "../config/credential-store.js";
|
|
3
|
+
import { ParaApiClient } from "../api/client.js";
|
|
4
|
+
async function resolveSession(environment) {
|
|
5
|
+
return getSession(environment);
|
|
6
|
+
}
|
|
7
|
+
async function ensureAuthenticated(environment) {
|
|
8
|
+
const session = await resolveSession(environment);
|
|
9
|
+
if (!session) {
|
|
10
|
+
throw new AuthError("Not authenticated. Run `para login` to authenticate.");
|
|
11
|
+
}
|
|
12
|
+
if (session.expiresAt && Date.now() > session.expiresAt) {
|
|
13
|
+
await clearSession(environment);
|
|
14
|
+
throw new AuthError("Session expired. Run `para login` to re-authenticate.", true);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const client = new ParaApiClient({ environment, sessionId: session.sessionId });
|
|
18
|
+
const status = await client.getAuthStatus();
|
|
19
|
+
const updated = {
|
|
20
|
+
sessionId: session.sessionId,
|
|
21
|
+
userId: status.userId || session.userId,
|
|
22
|
+
email: status.email || session.email,
|
|
23
|
+
expiresAt: status.sessionExpiresAt ?? session.expiresAt
|
|
24
|
+
};
|
|
25
|
+
if (updated.email !== session.email || updated.userId !== session.userId || updated.expiresAt !== session.expiresAt) {
|
|
26
|
+
await storeSession(environment, updated);
|
|
27
|
+
}
|
|
28
|
+
return updated;
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if (error instanceof AuthError) {
|
|
31
|
+
await clearSession(environment);
|
|
32
|
+
throw new AuthError("Session is no longer valid. Run `para login` to re-authenticate.", true);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
clearSession,
|
|
39
|
+
ensureAuthenticated,
|
|
40
|
+
resolveSession,
|
|
41
|
+
storeSession
|
|
42
|
+
};
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import type { GlobalOptions } from './core/types.js';
|
|
3
|
+
import { OutputFormatter } from './output/formatter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build help text with global options + examples for a command.
|
|
6
|
+
* Use with `.addHelpText('after', helpText('Examples:\n $ para ...'))`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function helpText(examples: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Add examples and global options reference to a command's help output.
|
|
11
|
+
*/
|
|
12
|
+
export declare function addExamples(cmd: Command, examples: string): void;
|
|
13
|
+
export declare function getGlobalOptions(cmd: Command): Promise<GlobalOptions>;
|
|
14
|
+
export declare function createFormatter(opts: GlobalOptions): OutputFormatter;
|
|
15
|
+
export declare function cli(argv: string[]): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,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;AAsFD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CA6B3E;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
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { CLI_VERSION, CLI_NAME, DEFAULT_ENVIRONMENT, parseEnvironment } from "./core/constants.js";
|
|
3
|
+
import { OutputFormatter } from "./output/formatter.js";
|
|
4
|
+
import { handleError, setJsonMode } from "./core/error-handler.js";
|
|
5
|
+
import { setNonInteractive } from "./output/prompts.js";
|
|
6
|
+
import { startUpdateCheck } from "./core/update-check.js";
|
|
7
|
+
import { readGlobalConfig } from "./config/config-store.js";
|
|
8
|
+
import { readProjectConfig } from "./config/project-config.js";
|
|
9
|
+
function isCi() {
|
|
10
|
+
return !!(process.env["CI"] || process.env["CONTINUOUS_INTEGRATION"] || process.env["BUILD_NUMBER"]);
|
|
11
|
+
}
|
|
12
|
+
const GLOBAL_OPTIONS_TEXT = `
|
|
13
|
+
Global Options:
|
|
14
|
+
-e, --environment <env> Target environment (default: BETA)
|
|
15
|
+
--json Output as JSON
|
|
16
|
+
--org <id> Organization ID override
|
|
17
|
+
--project <id> Project ID override
|
|
18
|
+
-q, --quiet Suppress non-essential output
|
|
19
|
+
--no-input Disable interactive prompts (auto-detected in CI)`;
|
|
20
|
+
function helpText(examples) {
|
|
21
|
+
return `${GLOBAL_OPTIONS_TEXT}
|
|
22
|
+
${examples}`;
|
|
23
|
+
}
|
|
24
|
+
function addExamples(cmd, examples) {
|
|
25
|
+
cmd.addHelpText("after", `${GLOBAL_OPTIONS_TEXT}
|
|
26
|
+
${examples}`);
|
|
27
|
+
}
|
|
28
|
+
const GROUPED_COMMANDS_TEXT = `
|
|
29
|
+
Getting started:
|
|
30
|
+
1. para login Sign in via the developer portal
|
|
31
|
+
2. para orgs switch Pick your organization
|
|
32
|
+
3. para projects switch Pick your project
|
|
33
|
+
4. para keys list View your API keys
|
|
34
|
+
|
|
35
|
+
Auth:
|
|
36
|
+
login [options] Sign in via the Para developer portal
|
|
37
|
+
logout [options] Clear stored credentials
|
|
38
|
+
whoami Show current user, org, and project context
|
|
39
|
+
|
|
40
|
+
Resources:
|
|
41
|
+
orgs List and switch organizations
|
|
42
|
+
projects List, create, update, archive, and restore projects
|
|
43
|
+
keys Manage API keys: list, create, rotate, archive, config
|
|
44
|
+
|
|
45
|
+
Setup:
|
|
46
|
+
create [options] [name] Scaffold a new Para-powered app from a template
|
|
47
|
+
init [options] Save current org/project/env to .pararc
|
|
48
|
+
config View or update CLI defaults
|
|
49
|
+
doctor [options] [path] Check a project for common SDK issues
|
|
50
|
+
|
|
51
|
+
Run "para <command> --help" for more information on a specific command.
|
|
52
|
+
`;
|
|
53
|
+
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("-e, --environment <env>", "Target environment (default: BETA)", (value) => parseEnvironment(value)).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
|
+
const originalHelpInfo = program.helpInformation.bind(program);
|
|
56
|
+
program.helpInformation = function() {
|
|
57
|
+
if (this.parent) {
|
|
58
|
+
return originalHelpInfo.call(this);
|
|
59
|
+
}
|
|
60
|
+
const lines = [];
|
|
61
|
+
lines.push(`Usage: ${this.name()} [options] [command]
|
|
62
|
+
`);
|
|
63
|
+
lines.push(this.description() + "\n");
|
|
64
|
+
const opts = this.options;
|
|
65
|
+
const allFlags = [
|
|
66
|
+
...opts.map((o) => ({ flags: o.flags, desc: o.description })),
|
|
67
|
+
{ flags: "-h, --help", desc: "Display help for command" }
|
|
68
|
+
];
|
|
69
|
+
lines.push("Options:");
|
|
70
|
+
for (const { flags, desc } of allFlags) {
|
|
71
|
+
const padding = 27 - flags.length;
|
|
72
|
+
lines.push(` ${flags}${" ".repeat(Math.max(1, padding))}${desc}`);
|
|
73
|
+
}
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push(GROUPED_COMMANDS_TEXT);
|
|
76
|
+
return lines.join("\n");
|
|
77
|
+
};
|
|
78
|
+
if (process.env["NO_COLOR"]) {
|
|
79
|
+
process.env["FORCE_COLOR"] = "0";
|
|
80
|
+
}
|
|
81
|
+
return program;
|
|
82
|
+
}
|
|
83
|
+
async function getGlobalOptions(cmd) {
|
|
84
|
+
const opts = cmd.optsWithGlobals();
|
|
85
|
+
let environment;
|
|
86
|
+
if (opts.environment) {
|
|
87
|
+
environment = parseEnvironment(opts.environment);
|
|
88
|
+
} else {
|
|
89
|
+
const projectConfig = await readProjectConfig(process.cwd()).catch(() => ({}));
|
|
90
|
+
const globalConfig = await readGlobalConfig();
|
|
91
|
+
const configEnv = projectConfig.environment ?? globalConfig.defaultEnvironment;
|
|
92
|
+
environment = configEnv ? parseEnvironment(configEnv) : DEFAULT_ENVIRONMENT;
|
|
93
|
+
}
|
|
94
|
+
const json = opts.json ?? false;
|
|
95
|
+
if (json) setJsonMode(true);
|
|
96
|
+
const noInput = opts.input === false || isCi();
|
|
97
|
+
if (noInput) setNonInteractive(true);
|
|
98
|
+
return {
|
|
99
|
+
json,
|
|
100
|
+
environment,
|
|
101
|
+
org: opts.org,
|
|
102
|
+
project: opts.project,
|
|
103
|
+
quiet: opts.quiet ?? false,
|
|
104
|
+
noInput
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function createFormatter(opts) {
|
|
108
|
+
return new OutputFormatter({
|
|
109
|
+
json: opts.json,
|
|
110
|
+
quiet: opts.quiet
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function cli(argv) {
|
|
114
|
+
if (argv.includes("--json")) setJsonMode(true);
|
|
115
|
+
if (argv.includes("--no-input") || isCi()) setNonInteractive(true);
|
|
116
|
+
const isQuiet = argv.includes("--json") || argv.includes("-q") || argv.includes("--quiet");
|
|
117
|
+
const showUpdate = !isQuiet && !isCi() ? startUpdateCheck() : null;
|
|
118
|
+
const program = createProgram();
|
|
119
|
+
const { registerDoctorCommand } = await import("./commands/doctor.js");
|
|
120
|
+
registerDoctorCommand(program);
|
|
121
|
+
const { registerCreateCommand } = await import("./commands/create.js");
|
|
122
|
+
registerCreateCommand(program);
|
|
123
|
+
const { registerInitCommand } = await import("./commands/init.js");
|
|
124
|
+
registerInitCommand(program);
|
|
125
|
+
const { registerConfigCommand } = await import("./commands/config.js");
|
|
126
|
+
registerConfigCommand(program);
|
|
127
|
+
const { registerAuthCommands } = await import("./commands/auth/index.js");
|
|
128
|
+
registerAuthCommands(program);
|
|
129
|
+
const { registerWhoamiCommand } = await import("./commands/whoami.js");
|
|
130
|
+
registerWhoamiCommand(program);
|
|
131
|
+
const { registerOrgsCommands } = await import("./commands/orgs/index.js");
|
|
132
|
+
registerOrgsCommands(program);
|
|
133
|
+
const { registerProjectsCommands } = await import("./commands/projects/index.js");
|
|
134
|
+
registerProjectsCommands(program);
|
|
135
|
+
const { registerKeysCommands } = await import("./commands/keys/index.js");
|
|
136
|
+
registerKeysCommands(program);
|
|
137
|
+
try {
|
|
138
|
+
await program.parseAsync(argv);
|
|
139
|
+
await showUpdate?.();
|
|
140
|
+
} catch (error) {
|
|
141
|
+
await showUpdate?.();
|
|
142
|
+
handleError(error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export {
|
|
146
|
+
addExamples,
|
|
147
|
+
cli,
|
|
148
|
+
createFormatter,
|
|
149
|
+
getGlobalOptions,
|
|
150
|
+
helpText
|
|
151
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmB3D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { registerLoginCommand } from "./login.js";
|
|
2
|
+
import { registerLogoutCommand } from "./logout.js";
|
|
3
|
+
import { registerAuthStatusCommand } from "./status.js";
|
|
4
|
+
function registerAuthCommands(program) {
|
|
5
|
+
const auth = program.command("auth").description("Authentication commands (login, logout, status)").addHelpText(
|
|
6
|
+
"after",
|
|
7
|
+
`
|
|
8
|
+
Tip: "para login" and "para logout" also work as top-level shortcuts.`
|
|
9
|
+
);
|
|
10
|
+
registerLoginCommand(auth);
|
|
11
|
+
registerLogoutCommand(auth);
|
|
12
|
+
registerAuthStatusCommand(auth);
|
|
13
|
+
registerLoginCommand(program);
|
|
14
|
+
registerLogoutCommand(program);
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
registerAuthCommands
|
|
18
|
+
};
|
|
@@ -0,0 +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,CA8C1D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getGlobalOptions, createFormatter, addExamples } from "../../cli.js";
|
|
2
|
+
import { ensureAuthenticated, storeSession } from "../../auth/session-manager.js";
|
|
3
|
+
import { startPollingLogin } from "../../auth/polling-flow.js";
|
|
4
|
+
import { createSpinner } from "../../output/spinner.js";
|
|
5
|
+
import { ParaApiClient } from "../../api/client.js";
|
|
6
|
+
import { updateGlobalConfig } from "../../config/config-store.js";
|
|
7
|
+
function registerLoginCommand(parent) {
|
|
8
|
+
const cmd = parent.command("login").description("Authenticate with your Para developer account").option("--no-browser", "Use URL-based authentication (for headless environments)").action(async (cmdOpts, actionCmd) => {
|
|
9
|
+
const opts = await getGlobalOptions(actionCmd);
|
|
10
|
+
const formatter = createFormatter(opts);
|
|
11
|
+
try {
|
|
12
|
+
const existing = await ensureAuthenticated(opts.environment);
|
|
13
|
+
formatter.success(`Already authenticated as ${existing.email || existing.userId}`);
|
|
14
|
+
formatter.flush();
|
|
15
|
+
return;
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
const spinner = createSpinner();
|
|
19
|
+
spinner.start("Waiting for browser authentication...");
|
|
20
|
+
const session = await startPollingLogin(opts.environment, {
|
|
21
|
+
openBrowser: cmdOpts.browser
|
|
22
|
+
});
|
|
23
|
+
spinner.stop("Browser authentication complete.");
|
|
24
|
+
await storeSession(opts.environment, session);
|
|
25
|
+
formatter.json({ email: session.email, userId: session.userId, environment: opts.environment });
|
|
26
|
+
formatter.success(`Authenticated as ${session.email || session.userId}`);
|
|
27
|
+
await autoResolveContext(session, opts.environment, formatter);
|
|
28
|
+
formatter.flush();
|
|
29
|
+
});
|
|
30
|
+
addExamples(
|
|
31
|
+
cmd,
|
|
32
|
+
`Examples:
|
|
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`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
async function autoResolveContext(session, environment, formatter) {
|
|
39
|
+
try {
|
|
40
|
+
const client = new ParaApiClient({ environment, sessionId: session.sessionId });
|
|
41
|
+
let userId = session.userId;
|
|
42
|
+
if (!userId) {
|
|
43
|
+
const status = await client.getAuthStatus();
|
|
44
|
+
userId = status.userId ?? "";
|
|
45
|
+
}
|
|
46
|
+
if (!userId) return;
|
|
47
|
+
const orgs = await client.getOrganizations(userId);
|
|
48
|
+
if (orgs.length === 0) return;
|
|
49
|
+
const org = orgs[0];
|
|
50
|
+
const updates = { defaultOrganizationId: org.id };
|
|
51
|
+
formatter.info(`Active organization: ${org.name} (${org.id})`);
|
|
52
|
+
if (orgs.length > 1) {
|
|
53
|
+
formatter.info(` You have ${orgs.length} organizations. Run \`para orgs switch\` to change.`);
|
|
54
|
+
}
|
|
55
|
+
const projects = await client.getProjects(org.id);
|
|
56
|
+
const active = projects.filter((p) => !p.archived);
|
|
57
|
+
if (active.length > 0) {
|
|
58
|
+
updates.defaultProjectId = active[0].id;
|
|
59
|
+
formatter.info(`Active project: ${active[0].name} (${active[0].id})`);
|
|
60
|
+
if (active.length > 1) {
|
|
61
|
+
formatter.info(` You have ${active.length} projects. Run \`para projects switch\` to change.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
await updateGlobalConfig(updates);
|
|
65
|
+
} catch {
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
registerLoginCommand
|
|
70
|
+
};
|
|
@@ -0,0 +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,CA8C3D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getGlobalOptions, createFormatter, addExamples } from "../../cli.js";
|
|
2
|
+
import { resolveSession } from "../../auth/session-manager.js";
|
|
3
|
+
import { clearSession, clearAllSessions } from "../../config/credential-store.js";
|
|
4
|
+
import { updateGlobalConfig } from "../../config/config-store.js";
|
|
5
|
+
import { ParaApiClient } from "../../api/client.js";
|
|
6
|
+
function registerLogoutCommand(parent) {
|
|
7
|
+
const cmd = parent.command("logout").description("Clear stored authentication credentials").option("--all", "Clear sessions for all environments").action(async (cmdOpts, actionCmd) => {
|
|
8
|
+
const opts = await getGlobalOptions(actionCmd);
|
|
9
|
+
const formatter = createFormatter(opts);
|
|
10
|
+
try {
|
|
11
|
+
const session = await resolveSession(opts.environment);
|
|
12
|
+
if (session?.sessionId) {
|
|
13
|
+
const client = new ParaApiClient({
|
|
14
|
+
environment: opts.environment,
|
|
15
|
+
sessionId: session.sessionId
|
|
16
|
+
});
|
|
17
|
+
await client.logout().catch(() => {
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
} catch {
|
|
21
|
+
}
|
|
22
|
+
if (cmdOpts.all) {
|
|
23
|
+
await clearAllSessions();
|
|
24
|
+
await updateGlobalConfig({ defaultOrganizationId: void 0, defaultProjectId: void 0 });
|
|
25
|
+
formatter.json({ loggedOut: true, scope: "all" });
|
|
26
|
+
formatter.success("Cleared all stored sessions and context.");
|
|
27
|
+
} else {
|
|
28
|
+
await clearSession(opts.environment);
|
|
29
|
+
await updateGlobalConfig({ defaultOrganizationId: void 0, defaultProjectId: void 0 });
|
|
30
|
+
formatter.json({ loggedOut: true, scope: opts.environment });
|
|
31
|
+
formatter.success(`Cleared session and context for ${opts.environment} environment.`);
|
|
32
|
+
}
|
|
33
|
+
formatter.flush();
|
|
34
|
+
});
|
|
35
|
+
addExamples(
|
|
36
|
+
cmd,
|
|
37
|
+
`Examples:
|
|
38
|
+
$ para logout Sign out of the current environment (BETA by default)
|
|
39
|
+
$ para logout --all Sign out of every environment at once
|
|
40
|
+
$ para logout -e PROD Sign out of production only`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
registerLogoutCommand
|
|
45
|
+
};
|
|
@@ -0,0 +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,CAuD/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { getGlobalOptions, createFormatter, addExamples } from "../../cli.js";
|
|
2
|
+
import { ensureAuthenticated } from "../../auth/session-manager.js";
|
|
3
|
+
import { AuthError } from "../../core/error-handler.js";
|
|
4
|
+
function registerAuthStatusCommand(parent) {
|
|
5
|
+
const cmd = parent.command("status").description("Check authentication status (server-validated)").action(async (_, actionCmd) => {
|
|
6
|
+
const opts = await getGlobalOptions(actionCmd);
|
|
7
|
+
const formatter = createFormatter(opts);
|
|
8
|
+
try {
|
|
9
|
+
const session = await ensureAuthenticated(opts.environment);
|
|
10
|
+
if (opts.json) {
|
|
11
|
+
formatter.json({
|
|
12
|
+
authenticated: true,
|
|
13
|
+
environment: opts.environment,
|
|
14
|
+
email: session.email || void 0,
|
|
15
|
+
userId: session.userId || void 0,
|
|
16
|
+
expiresAt: session.expiresAt || void 0
|
|
17
|
+
});
|
|
18
|
+
} else {
|
|
19
|
+
formatter.detail([
|
|
20
|
+
{ label: "Status", value: "Authenticated" },
|
|
21
|
+
{ label: "Environment", value: opts.environment },
|
|
22
|
+
...session.email ? [{ label: "Email", value: session.email }] : [],
|
|
23
|
+
...session.expiresAt ? [
|
|
24
|
+
{
|
|
25
|
+
label: "Expires",
|
|
26
|
+
value: new Date(session.expiresAt).toLocaleString()
|
|
27
|
+
}
|
|
28
|
+
] : []
|
|
29
|
+
]);
|
|
30
|
+
}
|
|
31
|
+
} catch (error) {
|
|
32
|
+
if (error instanceof AuthError) {
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
formatter.json({ authenticated: false, environment: opts.environment });
|
|
35
|
+
} else {
|
|
36
|
+
formatter.warn(error.message);
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
formatter.flush();
|
|
43
|
+
});
|
|
44
|
+
addExamples(
|
|
45
|
+
cmd,
|
|
46
|
+
`Examples:
|
|
47
|
+
$ para auth status Show session validity, email, and expiration
|
|
48
|
+
$ para auth status -e PROD Check auth for a specific environment
|
|
49
|
+
$ para auth status --json Output status as JSON (useful in scripts)`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
registerAuthStatusCommand
|
|
54
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4I5D"}
|