@polardbx/pxbaas 0.0.0-stage → 0.1.0-beta.10

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 (312) hide show
  1. package/README.md +223 -2
  2. package/bin/pxbaas.js +13 -0
  3. package/dist/app/local-index.d.ts +70 -0
  4. package/dist/app/local-index.d.ts.map +1 -0
  5. package/dist/app/local-index.js +140 -0
  6. package/dist/app/local-index.js.map +1 -0
  7. package/dist/app/preflight.d.ts +61 -0
  8. package/dist/app/preflight.d.ts.map +1 -0
  9. package/dist/app/preflight.js +115 -0
  10. package/dist/app/preflight.js.map +1 -0
  11. package/dist/app/spec-lint.d.ts +45 -0
  12. package/dist/app/spec-lint.d.ts.map +1 -0
  13. package/dist/app/spec-lint.js +423 -0
  14. package/dist/app/spec-lint.js.map +1 -0
  15. package/dist/app/templates.d.ts +167 -0
  16. package/dist/app/templates.d.ts.map +1 -0
  17. package/dist/app/templates.js +151 -0
  18. package/dist/app/templates.js.map +1 -0
  19. package/dist/cli/help-guides.d.ts +17 -0
  20. package/dist/cli/help-guides.d.ts.map +1 -0
  21. package/dist/cli/help-guides.js +132 -0
  22. package/dist/cli/help-guides.js.map +1 -0
  23. package/dist/cli/root.d.ts +3 -0
  24. package/dist/cli/root.d.ts.map +1 -0
  25. package/dist/cli/root.js +75 -0
  26. package/dist/cli/root.js.map +1 -0
  27. package/dist/commands/app/index.d.ts +8 -0
  28. package/dist/commands/app/index.d.ts.map +1 -0
  29. package/dist/commands/app/index.js +1907 -0
  30. package/dist/commands/app/index.js.map +1 -0
  31. package/dist/commands/auth/index.d.ts +3 -0
  32. package/dist/commands/auth/index.d.ts.map +1 -0
  33. package/dist/commands/auth/index.js +198 -0
  34. package/dist/commands/auth/index.js.map +1 -0
  35. package/dist/commands/completion/index.d.ts +3 -0
  36. package/dist/commands/completion/index.d.ts.map +1 -0
  37. package/dist/commands/completion/index.js +14 -0
  38. package/dist/commands/completion/index.js.map +1 -0
  39. package/dist/commands/data/index.d.ts +55 -0
  40. package/dist/commands/data/index.d.ts.map +1 -0
  41. package/dist/commands/data/index.js +407 -0
  42. package/dist/commands/data/index.js.map +1 -0
  43. package/dist/commands/db/index.d.ts +29 -0
  44. package/dist/commands/db/index.d.ts.map +1 -0
  45. package/dist/commands/db/index.js +500 -0
  46. package/dist/commands/db/index.js.map +1 -0
  47. package/dist/commands/doctor/index.d.ts +3 -0
  48. package/dist/commands/doctor/index.d.ts.map +1 -0
  49. package/dist/commands/doctor/index.js +305 -0
  50. package/dist/commands/doctor/index.js.map +1 -0
  51. package/dist/commands/functions/delete.d.ts +3 -0
  52. package/dist/commands/functions/delete.d.ts.map +1 -0
  53. package/dist/commands/functions/delete.js +55 -0
  54. package/dist/commands/functions/delete.js.map +1 -0
  55. package/dist/commands/functions/deploy.d.ts +3 -0
  56. package/dist/commands/functions/deploy.d.ts.map +1 -0
  57. package/dist/commands/functions/deploy.js +118 -0
  58. package/dist/commands/functions/deploy.js.map +1 -0
  59. package/dist/commands/functions/index.d.ts +3 -0
  60. package/dist/commands/functions/index.d.ts.map +1 -0
  61. package/dist/commands/functions/index.js +15 -0
  62. package/dist/commands/functions/index.js.map +1 -0
  63. package/dist/commands/functions/list.d.ts +6 -0
  64. package/dist/commands/functions/list.d.ts.map +1 -0
  65. package/dist/commands/functions/list.js +63 -0
  66. package/dist/commands/functions/list.js.map +1 -0
  67. package/dist/commands/functions/new.d.ts +7 -0
  68. package/dist/commands/functions/new.d.ts.map +1 -0
  69. package/dist/commands/functions/new.js +72 -0
  70. package/dist/commands/functions/new.js.map +1 -0
  71. package/dist/commands/gen/index.d.ts +3 -0
  72. package/dist/commands/gen/index.d.ts.map +1 -0
  73. package/dist/commands/gen/index.js +323 -0
  74. package/dist/commands/gen/index.js.map +1 -0
  75. package/dist/commands/guide/index.d.ts +8 -0
  76. package/dist/commands/guide/index.d.ts.map +1 -0
  77. package/dist/commands/guide/index.js +20 -0
  78. package/dist/commands/guide/index.js.map +1 -0
  79. package/dist/commands/instance/index.d.ts +8 -0
  80. package/dist/commands/instance/index.d.ts.map +1 -0
  81. package/dist/commands/instance/index.js +481 -0
  82. package/dist/commands/instance/index.js.map +1 -0
  83. package/dist/commands/login/index.d.ts +3 -0
  84. package/dist/commands/login/index.d.ts.map +1 -0
  85. package/dist/commands/login/index.js +145 -0
  86. package/dist/commands/login/index.js.map +1 -0
  87. package/dist/commands/logout/index.d.ts +3 -0
  88. package/dist/commands/logout/index.d.ts.map +1 -0
  89. package/dist/commands/logout/index.js +41 -0
  90. package/dist/commands/logout/index.js.map +1 -0
  91. package/dist/commands/profile/import-env.d.ts +18 -0
  92. package/dist/commands/profile/import-env.d.ts.map +1 -0
  93. package/dist/commands/profile/import-env.js +206 -0
  94. package/dist/commands/profile/import-env.js.map +1 -0
  95. package/dist/commands/profile/index.d.ts +3 -0
  96. package/dist/commands/profile/index.d.ts.map +1 -0
  97. package/dist/commands/profile/index.js +124 -0
  98. package/dist/commands/profile/index.js.map +1 -0
  99. package/dist/commands/rest/index.d.ts +3 -0
  100. package/dist/commands/rest/index.d.ts.map +1 -0
  101. package/dist/commands/rest/index.js +102 -0
  102. package/dist/commands/rest/index.js.map +1 -0
  103. package/dist/commands/skill/index.d.ts +11 -0
  104. package/dist/commands/skill/index.d.ts.map +1 -0
  105. package/dist/commands/skill/index.js +228 -0
  106. package/dist/commands/skill/index.js.map +1 -0
  107. package/dist/commands/status/index.d.ts +3 -0
  108. package/dist/commands/status/index.d.ts.map +1 -0
  109. package/dist/commands/status/index.js +59 -0
  110. package/dist/commands/status/index.js.map +1 -0
  111. package/dist/commands/storage/index.d.ts +3 -0
  112. package/dist/commands/storage/index.d.ts.map +1 -0
  113. package/dist/commands/storage/index.js +400 -0
  114. package/dist/commands/storage/index.js.map +1 -0
  115. package/dist/commands/tenant/index.d.ts +19 -0
  116. package/dist/commands/tenant/index.d.ts.map +1 -0
  117. package/dist/commands/tenant/index.js +667 -0
  118. package/dist/commands/tenant/index.js.map +1 -0
  119. package/dist/commands/whoami/index.d.ts +3 -0
  120. package/dist/commands/whoami/index.d.ts.map +1 -0
  121. package/dist/commands/whoami/index.js +101 -0
  122. package/dist/commands/whoami/index.js.map +1 -0
  123. package/dist/credentials/commit.d.ts +38 -0
  124. package/dist/credentials/commit.d.ts.map +1 -0
  125. package/dist/credentials/commit.js +57 -0
  126. package/dist/credentials/commit.js.map +1 -0
  127. package/dist/credentials/credential-store.d.ts +86 -0
  128. package/dist/credentials/credential-store.d.ts.map +1 -0
  129. package/dist/credentials/credential-store.js +282 -0
  130. package/dist/credentials/credential-store.js.map +1 -0
  131. package/dist/credentials/env-file.d.ts +85 -0
  132. package/dist/credentials/env-file.d.ts.map +1 -0
  133. package/dist/credentials/env-file.js +193 -0
  134. package/dist/credentials/env-file.js.map +1 -0
  135. package/dist/credentials/formatter.d.ts +39 -0
  136. package/dist/credentials/formatter.d.ts.map +1 -0
  137. package/dist/credentials/formatter.js +79 -0
  138. package/dist/credentials/formatter.js.map +1 -0
  139. package/dist/credentials/index.d.ts +13 -0
  140. package/dist/credentials/index.d.ts.map +1 -0
  141. package/dist/credentials/index.js +13 -0
  142. package/dist/credentials/index.js.map +1 -0
  143. package/dist/credentials/jwt-introspect.d.ts +39 -0
  144. package/dist/credentials/jwt-introspect.d.ts.map +1 -0
  145. package/dist/credentials/jwt-introspect.js +64 -0
  146. package/dist/credentials/jwt-introspect.js.map +1 -0
  147. package/dist/credentials/masker.d.ts +23 -0
  148. package/dist/credentials/masker.d.ts.map +1 -0
  149. package/dist/credentials/masker.js +40 -0
  150. package/dist/credentials/masker.js.map +1 -0
  151. package/dist/credentials/profile.d.ts +95 -0
  152. package/dist/credentials/profile.d.ts.map +1 -0
  153. package/dist/credentials/profile.js +207 -0
  154. package/dist/credentials/profile.js.map +1 -0
  155. package/dist/credentials/tenant-guard.d.ts +16 -0
  156. package/dist/credentials/tenant-guard.d.ts.map +1 -0
  157. package/dist/credentials/tenant-guard.js +53 -0
  158. package/dist/credentials/tenant-guard.js.map +1 -0
  159. package/dist/credentials/tty-guard.d.ts +29 -0
  160. package/dist/credentials/tty-guard.d.ts.map +1 -0
  161. package/dist/credentials/tty-guard.js +79 -0
  162. package/dist/credentials/tty-guard.js.map +1 -0
  163. package/dist/db/apply-schema.d.ts +144 -0
  164. package/dist/db/apply-schema.d.ts.map +1 -0
  165. package/dist/db/apply-schema.js +359 -0
  166. package/dist/db/apply-schema.js.map +1 -0
  167. package/dist/db/introspect.d.ts +54 -0
  168. package/dist/db/introspect.d.ts.map +1 -0
  169. package/dist/db/introspect.js +140 -0
  170. package/dist/db/introspect.js.map +1 -0
  171. package/dist/db/sql-file.d.ts +104 -0
  172. package/dist/db/sql-file.d.ts.map +1 -0
  173. package/dist/db/sql-file.js +584 -0
  174. package/dist/db/sql-file.js.map +1 -0
  175. package/dist/instance/provision.d.ts +89 -0
  176. package/dist/instance/provision.d.ts.map +1 -0
  177. package/dist/instance/provision.js +139 -0
  178. package/dist/instance/provision.js.map +1 -0
  179. package/dist/instance/zero-store.d.ts +47 -0
  180. package/dist/instance/zero-store.d.ts.map +1 -0
  181. package/dist/instance/zero-store.js +91 -0
  182. package/dist/instance/zero-store.js.map +1 -0
  183. package/dist/instance/zero-whitelist.d.ts +39 -0
  184. package/dist/instance/zero-whitelist.d.ts.map +1 -0
  185. package/dist/instance/zero-whitelist.js +67 -0
  186. package/dist/instance/zero-whitelist.js.map +1 -0
  187. package/dist/main.d.ts +3 -0
  188. package/dist/main.d.ts.map +1 -0
  189. package/dist/main.js +69 -0
  190. package/dist/main.js.map +1 -0
  191. package/dist/skill/agents-md.d.ts +25 -0
  192. package/dist/skill/agents-md.d.ts.map +1 -0
  193. package/dist/skill/agents-md.js +62 -0
  194. package/dist/skill/agents-md.js.map +1 -0
  195. package/dist/skill/assets.d.ts +38 -0
  196. package/dist/skill/assets.d.ts.map +1 -0
  197. package/dist/skill/assets.js +111 -0
  198. package/dist/skill/assets.js.map +1 -0
  199. package/dist/skill/hint.d.ts +39 -0
  200. package/dist/skill/hint.d.ts.map +1 -0
  201. package/dist/skill/hint.js +109 -0
  202. package/dist/skill/hint.js.map +1 -0
  203. package/dist/skill/hosts.d.ts +45 -0
  204. package/dist/skill/hosts.d.ts.map +1 -0
  205. package/dist/skill/hosts.js +96 -0
  206. package/dist/skill/hosts.js.map +1 -0
  207. package/dist/skill/installer.d.ts +100 -0
  208. package/dist/skill/installer.d.ts.map +1 -0
  209. package/dist/skill/installer.js +241 -0
  210. package/dist/skill/installer.js.map +1 -0
  211. package/dist/skill/ownership.d.ts +35 -0
  212. package/dist/skill/ownership.d.ts.map +1 -0
  213. package/dist/skill/ownership.js +52 -0
  214. package/dist/skill/ownership.js.map +1 -0
  215. package/dist/tenant/bundle.d.ts +66 -0
  216. package/dist/tenant/bundle.d.ts.map +1 -0
  217. package/dist/tenant/bundle.js +132 -0
  218. package/dist/tenant/bundle.js.map +1 -0
  219. package/dist/tenant/guide.d.ts +50 -0
  220. package/dist/tenant/guide.d.ts.map +1 -0
  221. package/dist/tenant/guide.js +152 -0
  222. package/dist/tenant/guide.js.map +1 -0
  223. package/dist/tenant/probe.d.ts +65 -0
  224. package/dist/tenant/probe.d.ts.map +1 -0
  225. package/dist/tenant/probe.js +159 -0
  226. package/dist/tenant/probe.js.map +1 -0
  227. package/dist/tenant/verify.d.ts +37 -0
  228. package/dist/tenant/verify.d.ts.map +1 -0
  229. package/dist/tenant/verify.js +132 -0
  230. package/dist/tenant/verify.js.map +1 -0
  231. package/dist/version.d.ts +29 -0
  232. package/dist/version.d.ts.map +1 -0
  233. package/dist/version.js +65 -0
  234. package/dist/version.js.map +1 -0
  235. package/package.json +63 -3
  236. package/skills/pxbaas-app-spec/SKILL.md +165 -0
  237. package/skills/pxbaas-app-spec/references/deploy-options.md +158 -0
  238. package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
  239. package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
  240. package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
  241. package/skills/pxbaas-app-spec/references/templates-examples.md +311 -0
  242. package/skills/pxbaas-cli/SKILL.md +186 -0
  243. package/skills/pxbaas-cli/references/api-reference.md +68 -0
  244. package/skills/pxbaas-cli/references/app-deploy.md +186 -0
  245. package/skills/pxbaas-cli/references/auth-and-credentials.md +116 -0
  246. package/skills/pxbaas-cli/references/data-postgrest.md +101 -0
  247. package/skills/pxbaas-cli/references/db-and-meta.md +102 -0
  248. package/skills/pxbaas-cli/references/edge-functions.md +71 -0
  249. package/skills/pxbaas-cli/references/multi-tenant-apps.md +138 -0
  250. package/skills/pxbaas-cli/references/provision.md +101 -0
  251. package/skills/pxbaas-cli/references/safety-and-two-phase.md +78 -0
  252. package/skills/pxbaas-cli/references/storage.md +61 -0
  253. package/skills/pxbaas-cli/references/tenant-admin.md +122 -0
  254. package/skills/pxbaas-cli/references/troubleshooting.md +76 -0
  255. package/templates/webapp/api/index.ts +55 -0
  256. package/templates/webapp/csr-bff/README.md +81 -0
  257. package/templates/webapp/csr-bff/backend/index.ts +168 -0
  258. package/templates/webapp/csr-bff/db/rls.json +13 -0
  259. package/templates/webapp/csr-bff/db/schema.sql +49 -0
  260. package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
  261. package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
  262. package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
  263. package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
  264. package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
  265. package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
  266. package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
  267. package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
  268. package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
  269. package/templates/webapp/manifest.json +419 -0
  270. package/templates/webapp/mpa/about.html +29 -0
  271. package/templates/webapp/mpa/app.js +42 -0
  272. package/templates/webapp/mpa/index.html +42 -0
  273. package/templates/webapp/mpa/index.ts +60 -0
  274. package/templates/webapp/mpa/style.css +42 -0
  275. package/templates/webapp/react-vite/frontend/index.html +12 -0
  276. package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
  277. package/templates/webapp/react-vite/frontend/package.json +23 -0
  278. package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
  279. package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
  280. package/templates/webapp/react-vite/frontend/src/style.css +46 -0
  281. package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
  282. package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
  283. package/templates/webapp/react-vite-hono/backend/index.ts +38 -0
  284. package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
  285. package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
  286. package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
  287. package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
  288. package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
  289. package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
  290. package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
  291. package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
  292. package/templates/webapp/spa/index.ts +119 -0
  293. package/templates/webapp/ssr-auth/backend/index.ts +133 -0
  294. package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
  295. package/templates/webapp/ssr-blog/README.md +111 -0
  296. package/templates/webapp/ssr-blog/backend/index.ts +764 -0
  297. package/templates/webapp/ssr-blog/db/rls.json +13 -0
  298. package/templates/webapp/ssr-blog/db/schema.sql +51 -0
  299. package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
  300. package/templates/webapp/ssr-frameworks/README.md +64 -0
  301. package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
  302. package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
  303. package/templates/webapp/ssr-hono/backend/index.ts +111 -0
  304. package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
  305. package/templates/webapp/ssr-shop/README.md +80 -0
  306. package/templates/webapp/ssr-shop/backend/index.ts +491 -0
  307. package/templates/webapp/ssr-shop/db/rls.json +16 -0
  308. package/templates/webapp/ssr-shop/db/schema.sql +90 -0
  309. package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
  310. package/templates/webapp/vanilla-static/frontend/dist/app.js +6 -0
  311. package/templates/webapp/vanilla-static/frontend/dist/index.html +19 -0
  312. package/templates/webapp/vanilla-static/frontend/dist/style.css +43 -0
@@ -0,0 +1,305 @@
1
+ import axios from 'axios';
2
+ import { CredentialStore, ProfileManager, introspectJwt, formatError, formatStatus, } from '../../credentials/index.js';
3
+ export function registerDoctorCommand(program) {
4
+ program
5
+ .command('doctor')
6
+ .description('Run health checks: connectivity, JWT validation, expiry, tenant status')
7
+ .action(async () => {
8
+ try {
9
+ await handleDoctor(program);
10
+ }
11
+ catch (error) {
12
+ const message = error instanceof Error ? error.message : String(error);
13
+ console.error(formatError(message));
14
+ process.exit(1);
15
+ }
16
+ });
17
+ }
18
+ async function handleDoctor(program) {
19
+ const profileManager = new ProfileManager();
20
+ const currentProfile = await profileManager.getCurrentProfile();
21
+ if (!currentProfile) {
22
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
23
+ }
24
+ const credentialStore = new CredentialStore();
25
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
26
+ if (!credentials) {
27
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
28
+ }
29
+ const checks = [];
30
+ // Check 1: Endpoint connectivity
31
+ checks.push(await checkEndpoint(currentProfile.endpoint, credentials.anonKey));
32
+ // Check 2: JWT signature (decode and validate format)
33
+ checks.push(await checkJwtSignature(credentials.anonKey, credentials.serviceRoleKey));
34
+ // Check 3: JWT expiry
35
+ checks.push(await checkJwtExpiry(credentials.anonKey, credentials.serviceRoleKey));
36
+ // Check 4: Tenant consistency (for multi-tenant)
37
+ if (currentProfile.mode === 'multi-tenant') {
38
+ checks.push(await checkTenantConsistency(currentProfile, credentials.anonKey, credentials.serviceRoleKey));
39
+ }
40
+ else {
41
+ checks.push({
42
+ name: 'Tenant Consistency',
43
+ status: 'skip',
44
+ detail: 'Single-tenant mode',
45
+ duration: 0,
46
+ });
47
+ }
48
+ // Check 5: Permissions (verify anon/service role)
49
+ checks.push(await checkPermissions(currentProfile.endpoint, credentials.anonKey, credentials.serviceRoleKey, currentProfile.tenantId));
50
+ // Output results
51
+ const output = {
52
+ profile: currentProfile.name,
53
+ checks,
54
+ summary: {
55
+ pass: checks.filter(c => c.status === 'pass').length,
56
+ warn: checks.filter(c => c.status === 'warn').length,
57
+ fail: checks.filter(c => c.status === 'fail').length,
58
+ skip: checks.filter(c => c.status === 'skip').length,
59
+ },
60
+ };
61
+ if (program.opts().json) {
62
+ console.log(JSON.stringify(output, null, 2));
63
+ }
64
+ else {
65
+ console.log(`Doctor Report for profile: ${currentProfile.name}\n`);
66
+ for (const check of checks) {
67
+ console.log(`${formatStatus(check.status)} ${check.name}`);
68
+ console.log(` ${check.detail} (${check.duration}ms)`);
69
+ if (check.remediation) {
70
+ console.log(` → ${check.remediation}`);
71
+ }
72
+ console.log();
73
+ }
74
+ console.log(`Summary: ${output.summary.pass} pass, ${output.summary.warn} warn, ${output.summary.fail} fail, ${output.summary.skip} skip`);
75
+ }
76
+ // Exit with error if any check failed
77
+ if (output.summary.fail > 0) {
78
+ process.exit(1);
79
+ }
80
+ }
81
+ async function checkEndpoint(endpoint, anonKey) {
82
+ const start = Date.now();
83
+ try {
84
+ const response = await axios.get(`${endpoint}/auth/v1/health`, {
85
+ headers: { apikey: anonKey },
86
+ timeout: 10000,
87
+ validateStatus: () => true, // 不抛出 HTTP 错误
88
+ });
89
+ const duration = Date.now() - start;
90
+ if (response.status === 200) {
91
+ return {
92
+ name: 'Endpoint Connectivity',
93
+ status: 'pass',
94
+ detail: `GET /auth/v1/health returned 200`,
95
+ duration,
96
+ };
97
+ }
98
+ else {
99
+ return {
100
+ name: 'Endpoint Connectivity',
101
+ status: 'fail',
102
+ detail: `GET /auth/v1/health returned ${response.status}`,
103
+ duration,
104
+ remediation: 'Check endpoint URL and network connectivity',
105
+ };
106
+ }
107
+ }
108
+ catch (error) {
109
+ const duration = Date.now() - start;
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ return {
112
+ name: 'Endpoint Connectivity',
113
+ status: 'fail',
114
+ detail: `Network error: ${message}`,
115
+ duration,
116
+ remediation: 'Check endpoint URL and network connectivity',
117
+ };
118
+ }
119
+ }
120
+ async function checkJwtSignature(anonKey, serviceKey) {
121
+ const start = Date.now();
122
+ try {
123
+ const anonJwt = await introspectJwt(anonKey);
124
+ const serviceJwt = await introspectJwt(serviceKey);
125
+ const duration = Date.now() - start;
126
+ if (anonJwt.payload.role !== 'anon') {
127
+ return {
128
+ name: 'JWT Signature',
129
+ status: 'fail',
130
+ detail: `Anon key has role: ${anonJwt.payload.role} (expected: anon)`,
131
+ duration,
132
+ remediation: 'Verify you pasted the correct anon key',
133
+ };
134
+ }
135
+ if (serviceJwt.payload.role !== 'service_role') {
136
+ return {
137
+ name: 'JWT Signature',
138
+ status: 'fail',
139
+ detail: `Service key has role: ${serviceJwt.payload.role} (expected: service_role)`,
140
+ duration,
141
+ remediation: 'Verify you pasted the correct service role key',
142
+ };
143
+ }
144
+ return {
145
+ name: 'JWT Signature',
146
+ status: 'pass',
147
+ detail: 'Both keys decoded successfully with correct roles',
148
+ duration,
149
+ };
150
+ }
151
+ catch (error) {
152
+ const duration = Date.now() - start;
153
+ const message = error instanceof Error ? error.message : String(error);
154
+ return {
155
+ name: 'JWT Signature',
156
+ status: 'fail',
157
+ detail: `JWT decode error: ${message}`,
158
+ duration,
159
+ remediation: 'Verify you pasted complete and valid keys',
160
+ };
161
+ }
162
+ }
163
+ async function checkJwtExpiry(anonKey, serviceKey) {
164
+ const start = Date.now();
165
+ try {
166
+ const anonJwt = await introspectJwt(anonKey);
167
+ const serviceJwt = await introspectJwt(serviceKey);
168
+ const duration = Date.now() - start;
169
+ if (anonJwt.isExpired || serviceJwt.isExpired) {
170
+ return {
171
+ name: 'JWT Expiry',
172
+ status: 'fail',
173
+ detail: `Anon: ${anonJwt.isExpired ? 'EXPIRED' : 'valid'}, Service: ${serviceJwt.isExpired ? 'EXPIRED' : 'valid'}`,
174
+ duration,
175
+ remediation: 'Contact administrator to rotate keys',
176
+ };
177
+ }
178
+ // Warn if expiring within 7 days
179
+ const sevenDays = 7 * 24 * 60 * 60;
180
+ if (anonJwt.expiresIn < sevenDays || serviceJwt.expiresIn < sevenDays) {
181
+ return {
182
+ name: 'JWT Expiry',
183
+ status: 'warn',
184
+ detail: `Anon: ${Math.floor(anonJwt.expiresIn / 86400)}d, Service: ${Math.floor(serviceJwt.expiresIn / 86400)}d`,
185
+ duration,
186
+ remediation: 'Keys expiring soon, consider rotating',
187
+ };
188
+ }
189
+ return {
190
+ name: 'JWT Expiry',
191
+ status: 'pass',
192
+ detail: `Anon: ${Math.floor(anonJwt.expiresIn / 86400)}d, Service: ${Math.floor(serviceJwt.expiresIn / 86400)}d`,
193
+ duration,
194
+ };
195
+ }
196
+ catch (error) {
197
+ const duration = Date.now() - start;
198
+ const message = error instanceof Error ? error.message : String(error);
199
+ return {
200
+ name: 'JWT Expiry',
201
+ status: 'fail',
202
+ detail: `Error checking expiry: ${message}`,
203
+ duration,
204
+ };
205
+ }
206
+ }
207
+ async function checkTenantConsistency(profile, anonKey, serviceKey) {
208
+ const start = Date.now();
209
+ try {
210
+ const anonJwt = await introspectJwt(anonKey);
211
+ const serviceJwt = await introspectJwt(serviceKey);
212
+ const duration = Date.now() - start;
213
+ if (anonJwt.payload.tenant_id !== profile.tenantId) {
214
+ return {
215
+ name: 'Tenant Consistency',
216
+ status: 'fail',
217
+ detail: `Profile tenant: ${profile.tenantId}, Anon JWT tenant: ${anonJwt.payload.tenant_id}`,
218
+ duration,
219
+ remediation: 'Verify you pasted keys for the correct tenant',
220
+ };
221
+ }
222
+ if (serviceJwt.payload.tenant_id !== profile.tenantId) {
223
+ return {
224
+ name: 'Tenant Consistency',
225
+ status: 'fail',
226
+ detail: `Profile tenant: ${profile.tenantId}, Service JWT tenant: ${serviceJwt.payload.tenant_id}`,
227
+ duration,
228
+ remediation: 'Verify you pasted keys for the correct tenant',
229
+ };
230
+ }
231
+ return {
232
+ name: 'Tenant Consistency',
233
+ status: 'pass',
234
+ detail: `All tenant IDs match: ${profile.tenantId}`,
235
+ duration,
236
+ };
237
+ }
238
+ catch (error) {
239
+ const duration = Date.now() - start;
240
+ const message = error instanceof Error ? error.message : String(error);
241
+ return {
242
+ name: 'Tenant Consistency',
243
+ status: 'fail',
244
+ detail: `Error checking consistency: ${message}`,
245
+ duration,
246
+ };
247
+ }
248
+ }
249
+ async function checkPermissions(endpoint, anonKey, serviceKey, tenantId) {
250
+ const start = Date.now();
251
+ try {
252
+ // Test anon key with REST API
253
+ const headers = {
254
+ apikey: anonKey,
255
+ Authorization: `Bearer ${anonKey}`,
256
+ };
257
+ if (tenantId) {
258
+ headers['X-Tenant-Id'] = tenantId;
259
+ }
260
+ const anonResponse = await axios.get(`${endpoint}/rest/v1/`, {
261
+ headers,
262
+ timeout: 10000,
263
+ validateStatus: () => true,
264
+ });
265
+ const duration = Date.now() - start;
266
+ // Anon key should get 200 or 401 (if no tables accessible), but not 403/500
267
+ if (anonResponse.status === 200 || anonResponse.status === 401) {
268
+ return {
269
+ name: 'Permissions',
270
+ status: 'pass',
271
+ detail: `Anon key: ${anonResponse.status}, Service key: not tested`,
272
+ duration,
273
+ };
274
+ }
275
+ else if (anonResponse.status === 403) {
276
+ return {
277
+ name: 'Permissions',
278
+ status: 'warn',
279
+ detail: `Anon key returned 403 (tenant may be suspended)`,
280
+ duration,
281
+ remediation: 'Contact administrator',
282
+ };
283
+ }
284
+ else {
285
+ return {
286
+ name: 'Permissions',
287
+ status: 'fail',
288
+ detail: `Anon key returned ${anonResponse.status}`,
289
+ duration,
290
+ remediation: 'Verify keys and endpoint',
291
+ };
292
+ }
293
+ }
294
+ catch (error) {
295
+ const duration = Date.now() - start;
296
+ const message = error instanceof Error ? error.message : String(error);
297
+ return {
298
+ name: 'Permissions',
299
+ status: 'fail',
300
+ detail: `Error testing permissions: ${message}`,
301
+ duration,
302
+ };
303
+ }
304
+ }
305
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerFunctionsDeleteCommand(functionsCmd: Command): void;
3
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAc1E"}
@@ -0,0 +1,55 @@
1
+ import { FunctionsDriver } from '@polardbx/pxbaas-client';
2
+ import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
3
+ export function registerFunctionsDeleteCommand(functionsCmd) {
4
+ functionsCmd
5
+ .command('delete <slug>')
6
+ .description('Delete a deployed Edge Function')
7
+ .option('--json', 'Output in JSON format')
8
+ .action(async (slug, options) => {
9
+ try {
10
+ await handleFunctionsDelete(slug, { ...options, json: options.json || (functionsCmd.parent?.opts().json ?? false) });
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : String(error);
14
+ console.error(formatError(message));
15
+ process.exit(1);
16
+ }
17
+ });
18
+ }
19
+ async function handleFunctionsDelete(slug, options) {
20
+ // Get current profile
21
+ const profileManager = new ProfileManager();
22
+ const currentProfile = await profileManager.getCurrentProfile();
23
+ if (!currentProfile) {
24
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
25
+ }
26
+ // Get credentials
27
+ const credentialStore = new CredentialStore();
28
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
29
+ if (!credentials) {
30
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
31
+ }
32
+ // Validate slug
33
+ if (!/^[a-z0-9-]+$/.test(slug)) {
34
+ throw new Error('Slug must contain only lowercase letters, numbers, and hyphens');
35
+ }
36
+ // Create FunctionsDriver
37
+ const functionsDriver = new FunctionsDriver({
38
+ endpoint: currentProfile.endpoint,
39
+ serviceRoleKey: credentials.serviceRoleKey,
40
+ tenantId: currentProfile.tenantId,
41
+ });
42
+ // Delete function
43
+ await functionsDriver.delete(slug);
44
+ const output = {
45
+ status: 'success',
46
+ message: `Deleted Edge Function: ${slug}`,
47
+ };
48
+ if (options.json) {
49
+ console.log(JSON.stringify(output, null, 2));
50
+ }
51
+ else {
52
+ console.log(formatSuccess(`Deleted Edge Function: ${slug}`));
53
+ }
54
+ }
55
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/functions/delete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,MAAM,UAAU,8BAA8B,CAAC,YAAqB;IAClE,YAAY;SACT,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA2B,EAAE,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,qBAAqB,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,IAAY,EACZ,OAA2B;IAE3B,sBAAsB;IACtB,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;IAEhE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,kBAAkB;IAClB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE9E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,cAAc,CAAC,IAAI,uCAAuC,CAAC,CAAC;IACnH,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IAED,yBAAyB;IACzB,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC;QAC1C,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,QAAQ,EAAE,cAAc,CAAC,QAAQ;KAClC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,0BAA0B,IAAI,EAAE;KAC1C,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerFunctionsDeployCommand(functionsCmd: Command): void;
3
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAsB1E"}
@@ -0,0 +1,118 @@
1
+ import { readdir, stat } from 'node:fs/promises';
2
+ import { join, relative } from 'node:path';
3
+ import { FunctionsDriver } from '@polardbx/pxbaas-client';
4
+ import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
5
+ export function registerFunctionsDeployCommand(functionsCmd) {
6
+ functionsCmd
7
+ .command('deploy <slug>')
8
+ .description('Deploy an Edge Function to BaaS')
9
+ .option('--dir <directory>', 'Function directory', './functions')
10
+ .option('--entrypoint <path>', 'Entrypoint file', 'index.ts')
11
+ .option('--no-verify-jwt', 'Disable JWT verification (not recommended)')
12
+ .option('--json', 'Output in JSON format')
13
+ .action(async (slug, options) => {
14
+ try {
15
+ await handleFunctionsDeploy(slug, { ...options, json: options.json || (functionsCmd.parent?.opts().json ?? false) });
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof Error ? error.message : String(error);
19
+ console.error(formatError(message));
20
+ process.exit(1);
21
+ }
22
+ });
23
+ }
24
+ async function handleFunctionsDeploy(slug, options) {
25
+ // Get current profile
26
+ const profileManager = new ProfileManager();
27
+ const currentProfile = await profileManager.getCurrentProfile();
28
+ if (!currentProfile) {
29
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
30
+ }
31
+ // Get credentials
32
+ const credentialStore = new CredentialStore();
33
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
34
+ if (!credentials) {
35
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
36
+ }
37
+ // Validate slug
38
+ if (!/^[a-z0-9-]+$/.test(slug)) {
39
+ throw new Error('Slug must contain only lowercase letters, numbers, and hyphens');
40
+ }
41
+ const functionDir = join(options.dir, slug);
42
+ const entrypointPath = join(functionDir, options.entrypoint);
43
+ // Check if function directory exists
44
+ try {
45
+ await stat(functionDir);
46
+ }
47
+ catch {
48
+ throw new Error(`Function directory not found: ${functionDir}`);
49
+ }
50
+ // Check if entrypoint exists
51
+ try {
52
+ await stat(entrypointPath);
53
+ }
54
+ catch {
55
+ throw new Error(`Entrypoint file not found: ${entrypointPath}`);
56
+ }
57
+ // Collect all files in the function directory
58
+ const files = await collectFiles(functionDir, functionDir);
59
+ if (files.length === 0) {
60
+ throw new Error(`No files found in function directory: ${functionDir}`);
61
+ }
62
+ // Create FunctionsDriver
63
+ const functionsDriver = new FunctionsDriver({
64
+ endpoint: currentProfile.endpoint,
65
+ serviceRoleKey: credentials.serviceRoleKey,
66
+ tenantId: currentProfile.tenantId,
67
+ });
68
+ // Deploy
69
+ const functionInfo = await functionsDriver.deploy({
70
+ slug,
71
+ entrypointPath: options.entrypoint,
72
+ verifyJwt: options.verifyJwt,
73
+ files,
74
+ });
75
+ const output = {
76
+ status: 'success',
77
+ function: functionInfo,
78
+ };
79
+ if (options.json) {
80
+ console.log(JSON.stringify(output, null, 2));
81
+ }
82
+ else {
83
+ console.log(formatSuccess(`Deployed Edge Function: ${slug}`));
84
+ console.log(` Status: ${functionInfo.status}`);
85
+ console.log(` Version: ${functionInfo.version}`);
86
+ console.log(` Entrypoint: ${functionInfo.entrypoint_path}`);
87
+ console.log(` Verify JWT: ${functionInfo.verify_jwt}`);
88
+ console.log(` Updated: ${functionInfo.updated_at}`);
89
+ }
90
+ }
91
+ /**
92
+ * Recursively collect all files in a directory
93
+ */
94
+ async function collectFiles(dir, baseDir) {
95
+ const files = [];
96
+ const entries = await readdir(dir, { withFileTypes: true });
97
+ for (const entry of entries) {
98
+ const fullPath = join(dir, entry.name);
99
+ if (entry.isDirectory()) {
100
+ // Skip node_modules and hidden directories
101
+ if (entry.name === 'node_modules' || entry.name.startsWith('.')) {
102
+ continue;
103
+ }
104
+ const subFiles = await collectFiles(fullPath, baseDir);
105
+ files.push(...subFiles);
106
+ }
107
+ else if (entry.isFile()) {
108
+ // Skip hidden files and lock files
109
+ if (entry.name.startsWith('.') || entry.name.endsWith('.lock')) {
110
+ continue;
111
+ }
112
+ const relativePath = relative(baseDir, fullPath);
113
+ files.push({ path: fullPath, relativePath });
114
+ }
115
+ }
116
+ return files;
117
+ }
118
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/functions/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerFunctionsCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUhE"}
@@ -0,0 +1,15 @@
1
+ import { registerFunctionsNewCommand } from './new.js';
2
+ import { registerFunctionsDeployCommand } from './deploy.js';
3
+ import { registerFunctionsListCommand } from './list.js';
4
+ import { registerFunctionsDeleteCommand } from './delete.js';
5
+ export function registerFunctionsCommands(program) {
6
+ const functionsCmd = program
7
+ .command('functions')
8
+ .description('Edge Functions management');
9
+ // Register subcommands
10
+ registerFunctionsNewCommand(functionsCmd);
11
+ registerFunctionsDeployCommand(functionsCmd);
12
+ registerFunctionsListCommand(functionsCmd);
13
+ registerFunctionsDeleteCommand(functionsCmd);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAE5C,uBAAuB;IACvB,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC1C,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAC7C,4BAA4B,CAAC,YAAY,CAAC,CAAC;IAC3C,8BAA8B,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerFunctionsListCommand(functionsCmd: Command): void;
3
+ export declare function handleFunctionsList(options: {
4
+ json?: boolean;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAcxE;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDpF"}
@@ -0,0 +1,63 @@
1
+ import { FunctionsDriver } from '@polardbx/pxbaas-client';
2
+ import { CredentialStore, ProfileManager, formatSuccess, formatError, } from '../../credentials/index.js';
3
+ export function registerFunctionsListCommand(functionsCmd) {
4
+ functionsCmd
5
+ .command('list')
6
+ .description('List deployed Edge Functions')
7
+ .option('--json', 'Output in JSON format')
8
+ .action(async (options) => {
9
+ try {
10
+ await handleFunctionsList({ ...options, json: options.json || (functionsCmd.parent?.opts().json ?? false) });
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : String(error);
14
+ console.error(formatError(message));
15
+ process.exit(1);
16
+ }
17
+ });
18
+ }
19
+ export async function handleFunctionsList(options) {
20
+ // Get current profile
21
+ const profileManager = new ProfileManager();
22
+ const currentProfile = await profileManager.getCurrentProfile();
23
+ if (!currentProfile) {
24
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
25
+ }
26
+ // Get credentials
27
+ const credentialStore = new CredentialStore();
28
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
29
+ if (!credentials) {
30
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
31
+ }
32
+ // Create FunctionsDriver
33
+ const functionsDriver = new FunctionsDriver({
34
+ endpoint: currentProfile.endpoint,
35
+ serviceRoleKey: credentials.serviceRoleKey,
36
+ tenantId: currentProfile.tenantId,
37
+ });
38
+ // List functions
39
+ const functions = await functionsDriver.list();
40
+ const output = {
41
+ count: functions.length,
42
+ functions,
43
+ };
44
+ if (options.json) {
45
+ console.log(JSON.stringify(output, null, 2));
46
+ }
47
+ else {
48
+ if (functions.length === 0) {
49
+ console.log('No Edge Functions deployed.');
50
+ return;
51
+ }
52
+ console.log(formatSuccess(`Found ${functions.length} Edge Function(s):`));
53
+ console.log('');
54
+ for (const func of functions) {
55
+ console.log(` ${func.slug}`);
56
+ console.log(` Status: ${func.status}`);
57
+ console.log(` Version: ${func.version}`);
58
+ console.log(` Updated: ${func.updated_at}`);
59
+ console.log('');
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/functions/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerFunctionsNewCommand(functionsCmd: Command): void;
3
+ export declare function handleFunctionsNew(slug: string, options: {
4
+ dir: string;
5
+ entrypoint: string;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI,CAevE;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAuDf"}