@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.
Files changed (331) hide show
  1. package/README.md +97 -0
  2. package/dist/api/client.d.ts +49 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +247 -0
  5. package/dist/api/errors.d.ts +9 -0
  6. package/dist/api/errors.d.ts.map +1 -0
  7. package/dist/api/errors.js +29 -0
  8. package/dist/api/types.d.ts +155 -0
  9. package/dist/api/types.d.ts.map +1 -0
  10. package/dist/api/types.js +58 -0
  11. package/dist/auth/polling-flow.d.ts +7 -0
  12. package/dist/auth/polling-flow.d.ts.map +1 -0
  13. package/dist/auth/polling-flow.js +94 -0
  14. package/dist/auth/session-manager.d.ts +7 -0
  15. package/dist/auth/session-manager.d.ts.map +1 -0
  16. package/dist/auth/session-manager.js +42 -0
  17. package/dist/cli.d.ts +16 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +151 -0
  20. package/dist/commands/auth/index.d.ts +3 -0
  21. package/dist/commands/auth/index.d.ts.map +1 -0
  22. package/dist/commands/auth/index.js +18 -0
  23. package/dist/commands/auth/login.d.ts +3 -0
  24. package/dist/commands/auth/login.d.ts.map +1 -0
  25. package/dist/commands/auth/login.js +70 -0
  26. package/dist/commands/auth/logout.d.ts +3 -0
  27. package/dist/commands/auth/logout.d.ts.map +1 -0
  28. package/dist/commands/auth/logout.js +45 -0
  29. package/dist/commands/auth/status.d.ts +3 -0
  30. package/dist/commands/auth/status.d.ts.map +1 -0
  31. package/dist/commands/auth/status.js +54 -0
  32. package/dist/commands/config.d.ts +3 -0
  33. package/dist/commands/config.d.ts.map +1 -0
  34. package/dist/commands/config.js +122 -0
  35. package/dist/commands/create.d.ts +3 -0
  36. package/dist/commands/create.d.ts.map +1 -0
  37. package/dist/commands/create.js +587 -0
  38. package/dist/commands/doctor.d.ts +3 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +67 -0
  41. package/dist/commands/init.d.ts +3 -0
  42. package/dist/commands/init.d.ts.map +1 -0
  43. package/dist/commands/init.js +45 -0
  44. package/dist/commands/keys/archive.d.ts +3 -0
  45. package/dist/commands/keys/archive.d.ts.map +1 -0
  46. package/dist/commands/keys/archive.js +49 -0
  47. package/dist/commands/keys/config/branding.d.ts +23 -0
  48. package/dist/commands/keys/config/branding.d.ts.map +1 -0
  49. package/dist/commands/keys/config/branding.js +246 -0
  50. package/dist/commands/keys/config/categories.d.ts +15 -0
  51. package/dist/commands/keys/config/categories.d.ts.map +1 -0
  52. package/dist/commands/keys/config/categories.js +67 -0
  53. package/dist/commands/keys/config/index.d.ts +3 -0
  54. package/dist/commands/keys/config/index.d.ts.map +1 -0
  55. package/dist/commands/keys/config/index.js +56 -0
  56. package/dist/commands/keys/config/ramps.d.ts +18 -0
  57. package/dist/commands/keys/config/ramps.d.ts.map +1 -0
  58. package/dist/commands/keys/config/ramps.js +185 -0
  59. package/dist/commands/keys/config/security.d.ts +15 -0
  60. package/dist/commands/keys/config/security.d.ts.map +1 -0
  61. package/dist/commands/keys/config/security.js +212 -0
  62. package/dist/commands/keys/config/setup.d.ts +16 -0
  63. package/dist/commands/keys/config/setup.d.ts.map +1 -0
  64. package/dist/commands/keys/config/setup.js +235 -0
  65. package/dist/commands/keys/config/webhooks.d.ts +18 -0
  66. package/dist/commands/keys/config/webhooks.d.ts.map +1 -0
  67. package/dist/commands/keys/config/webhooks.js +279 -0
  68. package/dist/commands/keys/create.d.ts +3 -0
  69. package/dist/commands/keys/create.d.ts.map +1 -0
  70. package/dist/commands/keys/create.js +64 -0
  71. package/dist/commands/keys/get.d.ts +3 -0
  72. package/dist/commands/keys/get.d.ts.map +1 -0
  73. package/dist/commands/keys/get.js +91 -0
  74. package/dist/commands/keys/index.d.ts +3 -0
  75. package/dist/commands/keys/index.d.ts.map +1 -0
  76. package/dist/commands/keys/index.js +22 -0
  77. package/dist/commands/keys/list.d.ts +3 -0
  78. package/dist/commands/keys/list.d.ts.map +1 -0
  79. package/dist/commands/keys/list.js +66 -0
  80. package/dist/commands/keys/rotate.d.ts +3 -0
  81. package/dist/commands/keys/rotate.d.ts.map +1 -0
  82. package/dist/commands/keys/rotate.js +59 -0
  83. package/dist/commands/orgs/index.d.ts +3 -0
  84. package/dist/commands/orgs/index.d.ts.map +1 -0
  85. package/dist/commands/orgs/index.js +15 -0
  86. package/dist/commands/orgs/list.d.ts +3 -0
  87. package/dist/commands/orgs/list.d.ts.map +1 -0
  88. package/dist/commands/orgs/list.js +53 -0
  89. package/dist/commands/orgs/switch.d.ts +3 -0
  90. package/dist/commands/orgs/switch.d.ts.map +1 -0
  91. package/dist/commands/orgs/switch.js +61 -0
  92. package/dist/commands/projects/archive.d.ts +3 -0
  93. package/dist/commands/projects/archive.d.ts.map +1 -0
  94. package/dist/commands/projects/archive.js +51 -0
  95. package/dist/commands/projects/create.d.ts +3 -0
  96. package/dist/commands/projects/create.d.ts.map +1 -0
  97. package/dist/commands/projects/create.js +48 -0
  98. package/dist/commands/projects/index.d.ts +3 -0
  99. package/dist/commands/projects/index.d.ts.map +1 -0
  100. package/dist/commands/projects/index.js +25 -0
  101. package/dist/commands/projects/list.d.ts +3 -0
  102. package/dist/commands/projects/list.d.ts.map +1 -0
  103. package/dist/commands/projects/list.js +52 -0
  104. package/dist/commands/projects/restore.d.ts +3 -0
  105. package/dist/commands/projects/restore.d.ts.map +1 -0
  106. package/dist/commands/projects/restore.js +36 -0
  107. package/dist/commands/projects/switch.d.ts +3 -0
  108. package/dist/commands/projects/switch.d.ts.map +1 -0
  109. package/dist/commands/projects/switch.js +57 -0
  110. package/dist/commands/projects/update.d.ts +3 -0
  111. package/dist/commands/projects/update.d.ts.map +1 -0
  112. package/dist/commands/projects/update.js +67 -0
  113. package/dist/commands/whoami.d.ts +3 -0
  114. package/dist/commands/whoami.d.ts.map +1 -0
  115. package/dist/commands/whoami.js +61 -0
  116. package/dist/config/config-manager.d.ts +3 -0
  117. package/dist/config/config-manager.d.ts.map +1 -0
  118. package/dist/config/config-manager.js +32 -0
  119. package/dist/config/config-store.d.ts +10 -0
  120. package/dist/config/config-store.d.ts.map +1 -0
  121. package/dist/config/config-store.js +37 -0
  122. package/dist/config/credential-store.d.ts +12 -0
  123. package/dist/config/credential-store.d.ts.map +1 -0
  124. package/dist/config/credential-store.js +94 -0
  125. package/dist/config/paths.d.ts +5 -0
  126. package/dist/config/paths.d.ts.map +1 -0
  127. package/dist/config/paths.js +29 -0
  128. package/dist/config/project-config.d.ts +8 -0
  129. package/dist/config/project-config.d.ts.map +1 -0
  130. package/dist/config/project-config.js +41 -0
  131. package/dist/core/constants.d.ts +27 -0
  132. package/dist/core/constants.d.ts.map +1 -0
  133. package/dist/core/constants.js +60 -0
  134. package/dist/core/error-handler.d.ts +24 -0
  135. package/dist/core/error-handler.d.ts.map +1 -0
  136. package/dist/core/error-handler.js +83 -0
  137. package/dist/core/types.d.ts +21 -0
  138. package/dist/core/types.d.ts.map +1 -0
  139. package/dist/core/types.js +0 -0
  140. package/dist/core/update-check.d.ts +6 -0
  141. package/dist/core/update-check.d.ts.map +1 -0
  142. package/dist/core/update-check.js +78 -0
  143. package/dist/diagnostics/checks/chain-dependencies.d.ts +2 -0
  144. package/dist/diagnostics/checks/chain-dependencies.d.ts.map +1 -0
  145. package/dist/diagnostics/checks/chain-dependencies.js +130 -0
  146. package/dist/diagnostics/checks/css-import.d.ts +2 -0
  147. package/dist/diagnostics/checks/css-import.d.ts.map +1 -0
  148. package/dist/diagnostics/checks/css-import.js +57 -0
  149. package/dist/diagnostics/checks/deprecated-packages.d.ts +2 -0
  150. package/dist/diagnostics/checks/deprecated-packages.d.ts.map +1 -0
  151. package/dist/diagnostics/checks/deprecated-packages.js +93 -0
  152. package/dist/diagnostics/checks/env-api-key.d.ts +2 -0
  153. package/dist/diagnostics/checks/env-api-key.d.ts.map +1 -0
  154. package/dist/diagnostics/checks/env-api-key.js +75 -0
  155. package/dist/diagnostics/checks/env-var-prefix.d.ts +2 -0
  156. package/dist/diagnostics/checks/env-var-prefix.d.ts.map +1 -0
  157. package/dist/diagnostics/checks/env-var-prefix.js +52 -0
  158. package/dist/diagnostics/checks/index.d.ts +13 -0
  159. package/dist/diagnostics/checks/index.d.ts.map +1 -0
  160. package/dist/diagnostics/checks/index.js +32 -0
  161. package/dist/diagnostics/checks/para-provider.d.ts +2 -0
  162. package/dist/diagnostics/checks/para-provider.d.ts.map +1 -0
  163. package/dist/diagnostics/checks/para-provider.js +42 -0
  164. package/dist/diagnostics/checks/query-client.d.ts +2 -0
  165. package/dist/diagnostics/checks/query-client.d.ts.map +1 -0
  166. package/dist/diagnostics/checks/query-client.js +58 -0
  167. package/dist/diagnostics/checks/use-client-directive.d.ts +2 -0
  168. package/dist/diagnostics/checks/use-client-directive.d.ts.map +1 -0
  169. package/dist/diagnostics/checks/use-client-directive.js +81 -0
  170. package/dist/diagnostics/checks/version-consistency.d.ts +2 -0
  171. package/dist/diagnostics/checks/version-consistency.d.ts.map +1 -0
  172. package/dist/diagnostics/checks/version-consistency.js +93 -0
  173. package/dist/diagnostics/context.d.ts +3 -0
  174. package/dist/diagnostics/context.d.ts.map +1 -0
  175. package/dist/diagnostics/context.js +56 -0
  176. package/dist/diagnostics/detectors/framework.d.ts +5 -0
  177. package/dist/diagnostics/detectors/framework.d.ts.map +1 -0
  178. package/dist/diagnostics/detectors/framework.js +73 -0
  179. package/dist/diagnostics/detectors/package-manager.d.ts +3 -0
  180. package/dist/diagnostics/detectors/package-manager.d.ts.map +1 -0
  181. package/dist/diagnostics/detectors/package-manager.js +17 -0
  182. package/dist/diagnostics/detectors/sdk.d.ts +7 -0
  183. package/dist/diagnostics/detectors/sdk.d.ts.map +1 -0
  184. package/dist/diagnostics/detectors/sdk.js +48 -0
  185. package/dist/diagnostics/runner.d.ts +3 -0
  186. package/dist/diagnostics/runner.d.ts.map +1 -0
  187. package/dist/diagnostics/runner.js +44 -0
  188. package/dist/diagnostics/types.d.ts +70 -0
  189. package/dist/diagnostics/types.d.ts.map +1 -0
  190. package/dist/diagnostics/types.js +14 -0
  191. package/dist/diagnostics/utils/code-search.d.ts +10 -0
  192. package/dist/diagnostics/utils/code-search.d.ts.map +1 -0
  193. package/dist/diagnostics/utils/code-search.js +98 -0
  194. package/dist/diagnostics/utils/file-system.d.ts +7 -0
  195. package/dist/diagnostics/utils/file-system.d.ts.map +1 -0
  196. package/dist/diagnostics/utils/file-system.js +72 -0
  197. package/dist/diagnostics/utils/package-json.d.ts +12 -0
  198. package/dist/diagnostics/utils/package-json.d.ts.map +1 -0
  199. package/dist/diagnostics/utils/package-json.js +51 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +20 -0
  203. package/dist/output/formatter.d.ts +25 -0
  204. package/dist/output/formatter.d.ts.map +1 -0
  205. package/dist/output/formatter.js +76 -0
  206. package/dist/output/mask.d.ts +2 -0
  207. package/dist/output/mask.d.ts.map +1 -0
  208. package/dist/output/mask.js +15 -0
  209. package/dist/output/prompts.d.ts +25 -0
  210. package/dist/output/prompts.d.ts.map +1 -0
  211. package/dist/output/prompts.js +86 -0
  212. package/dist/output/spinner.d.ts +6 -0
  213. package/dist/output/spinner.d.ts.map +1 -0
  214. package/dist/output/spinner.js +7 -0
  215. package/dist/output/table.d.ts +9 -0
  216. package/dist/output/table.d.ts.map +1 -0
  217. package/dist/output/table.js +21 -0
  218. package/dist/scaffolding/scaffolder.d.ts +3 -0
  219. package/dist/scaffolding/scaffolder.d.ts.map +1 -0
  220. package/dist/scaffolding/scaffolder.js +78 -0
  221. package/dist/scaffolding/strategies/expo-template.d.ts +16 -0
  222. package/dist/scaffolding/strategies/expo-template.d.ts.map +1 -0
  223. package/dist/scaffolding/strategies/expo-template.js +160 -0
  224. package/dist/scaffolding/strategies/index.d.ts +5 -0
  225. package/dist/scaffolding/strategies/index.d.ts.map +1 -0
  226. package/dist/scaffolding/strategies/index.js +25 -0
  227. package/dist/scaffolding/strategies/nextjs-template.d.ts +12 -0
  228. package/dist/scaffolding/strategies/nextjs-template.d.ts.map +1 -0
  229. package/dist/scaffolding/strategies/nextjs-template.js +122 -0
  230. package/dist/scaffolding/template-renderer.d.ts +11 -0
  231. package/dist/scaffolding/template-renderer.d.ts.map +1 -0
  232. package/dist/scaffolding/template-renderer.js +99 -0
  233. package/dist/scaffolding/types.d.ts +69 -0
  234. package/dist/scaffolding/types.d.ts.map +1 -0
  235. package/dist/scaffolding/types.js +21 -0
  236. package/dist/scaffolding/utils/detect-package-manager.d.ts +23 -0
  237. package/dist/scaffolding/utils/detect-package-manager.d.ts.map +1 -0
  238. package/dist/scaffolding/utils/detect-package-manager.js +57 -0
  239. package/dist/scaffolding/utils/fs.d.ts +11 -0
  240. package/dist/scaffolding/utils/fs.d.ts.map +1 -0
  241. package/dist/scaffolding/utils/fs.js +45 -0
  242. package/dist/scaffolding/utils/resolve-para-version.d.ts +7 -0
  243. package/dist/scaffolding/utils/resolve-para-version.d.ts.map +1 -0
  244. package/dist/scaffolding/utils/resolve-para-version.js +21 -0
  245. package/dist/validation/auth-methods.d.ts +14 -0
  246. package/dist/validation/auth-methods.d.ts.map +1 -0
  247. package/dist/validation/auth-methods.js +23 -0
  248. package/dist/validation/cidr.d.ts +11 -0
  249. package/dist/validation/cidr.d.ts.map +1 -0
  250. package/dist/validation/cidr.js +35 -0
  251. package/dist/validation/hex-color.d.ts +7 -0
  252. package/dist/validation/hex-color.d.ts.map +1 -0
  253. package/dist/validation/hex-color.js +10 -0
  254. package/dist/validation/index.d.ts +9 -0
  255. package/dist/validation/index.d.ts.map +1 -0
  256. package/dist/validation/index.js +49 -0
  257. package/dist/validation/native-passkey.d.ts +31 -0
  258. package/dist/validation/native-passkey.d.ts.map +1 -0
  259. package/dist/validation/native-passkey.js +45 -0
  260. package/dist/validation/session-length.d.ts +18 -0
  261. package/dist/validation/session-length.d.ts.map +1 -0
  262. package/dist/validation/session-length.js +30 -0
  263. package/dist/validation/url.d.ts +26 -0
  264. package/dist/validation/url.d.ts.map +1 -0
  265. package/dist/validation/url.js +50 -0
  266. package/dist/validation/wallet-types.d.ts +14 -0
  267. package/dist/validation/wallet-types.d.ts.map +1 -0
  268. package/dist/validation/wallet-types.js +22 -0
  269. package/dist/validation/webhook.d.ts +4 -0
  270. package/dist/validation/webhook.d.ts.map +1 -0
  271. package/dist/validation/webhook.js +33 -0
  272. package/package.json +60 -0
  273. package/templates/expo/_env.example +3 -0
  274. package/templates/expo/_gitignore +48 -0
  275. package/templates/expo/_yarnrc.yml +1 -0
  276. package/templates/expo/app/(auth)/_layout.tsx +12 -0
  277. package/templates/expo/app/(auth)/index.tsx.template +86 -0
  278. package/templates/expo/app/(tabs)/_layout.tsx +16 -0
  279. package/templates/expo/app/(tabs)/index.tsx +112 -0
  280. package/templates/expo/app/(tabs)/send.tsx +111 -0
  281. package/templates/expo/app/_layout.tsx +17 -0
  282. package/templates/expo/app/index.tsx +22 -0
  283. package/templates/expo/app.json.template +32 -0
  284. package/templates/expo/assets/adaptive-icon.png +0 -0
  285. package/templates/expo/assets/favicon.png +0 -0
  286. package/templates/expo/assets/icon.png +0 -0
  287. package/templates/expo/assets/splash.png +0 -0
  288. package/templates/expo/babel.config.cjs +12 -0
  289. package/templates/expo/components/features/AuthForm.tsx.template +138 -0
  290. package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
  291. package/templates/expo/components/features/index.ts.template +4 -0
  292. package/templates/expo/components/ui/Button.tsx +58 -0
  293. package/templates/expo/components/ui/Card.tsx +11 -0
  294. package/templates/expo/components/ui/Divider.tsx +19 -0
  295. package/templates/expo/components/ui/Input.tsx +23 -0
  296. package/templates/expo/components/ui/WalletCard.tsx +44 -0
  297. package/templates/expo/components/ui/index.ts +5 -0
  298. package/templates/expo/eslint.config.cjs +15 -0
  299. package/templates/expo/global.css +3 -0
  300. package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
  301. package/templates/expo/hooks/useViemClient.ts +118 -0
  302. package/templates/expo/hooks/useWallets.ts +52 -0
  303. package/templates/expo/index.js +2 -0
  304. package/templates/expo/lib/auth.ts +54 -0
  305. package/templates/expo/lib/constants.ts.template +2 -0
  306. package/templates/expo/lib/para.ts +14 -0
  307. package/templates/expo/metro.config.cjs +14 -0
  308. package/templates/expo/nativewind-env.d.ts +2 -0
  309. package/templates/expo/prettier.config.cjs +10 -0
  310. package/templates/expo/providers/ParaProvider.tsx +140 -0
  311. package/templates/expo/tailwind.config.cjs +23 -0
  312. package/templates/expo/tsconfig.json +11 -0
  313. package/templates/expo/types/index.ts +28 -0
  314. package/templates/nextjs/README.md +69 -0
  315. package/templates/nextjs/_env.example +8 -0
  316. package/templates/nextjs/_gitignore +36 -0
  317. package/templates/nextjs/_yarnrc.yml +1 -0
  318. package/templates/nextjs/eslint.config.mjs +10 -0
  319. package/templates/nextjs/next.config.ts +5 -0
  320. package/templates/nextjs/postcss.config.mjs +7 -0
  321. package/templates/nextjs/public/para.svg +3 -0
  322. package/templates/nextjs/src/app/layout.tsx +30 -0
  323. package/templates/nextjs/src/app/page.tsx +40 -0
  324. package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
  325. package/templates/nextjs/src/components/layout/Header.tsx +44 -0
  326. package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
  327. package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
  328. package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
  329. package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
  330. package/templates/nextjs/src/styles/globals.css +1 -0
  331. 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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerLoginCommand(parent: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerLogoutCommand(parent: Command): void;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAuthStatusCommand(parent: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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"}