@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,500 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { MetaDriver, TenantDdlDriver } from '@polardbx/pxbaas-client';
4
+ import { CredentialStore, ProfileManager, formatSuccess, formatError, formatWarning, } from '../../credentials/index.js';
5
+ import { applySchema, getSchemaSink, } from '../../db/apply-schema.js';
6
+ import { makeIntrospector } from '../../db/introspect.js';
7
+ import { parseRlsJson } from '../../db/sql-file.js';
8
+ export function registerDbCommands(program) {
9
+ const db = program
10
+ .command('db')
11
+ .description('Database operations (query, schema inspection, DDL)');
12
+ db
13
+ .command('query <sql>')
14
+ .description('Execute SQL query via Meta API')
15
+ .option('--role <role>', 'Role to use (anon or service_role)', 'anon')
16
+ .option('--json', 'Output in JSON format')
17
+ .action(async (sql, options) => {
18
+ try {
19
+ await handleDbQuery(sql, options, program);
20
+ }
21
+ catch (error) {
22
+ const message = error instanceof Error ? error.message : String(error);
23
+ console.error(formatError(message));
24
+ process.exit(1);
25
+ }
26
+ });
27
+ db
28
+ .command('tables')
29
+ .description('List tables in current tenant database')
30
+ .option('--schema <schema>', 'Schema name', 'public')
31
+ .option('--role <role>', 'Role to use (anon or service_role)', 'service_role')
32
+ .option('--json', 'Output in JSON format')
33
+ .action(async (options) => {
34
+ try {
35
+ await handleDbTables(options, program);
36
+ }
37
+ catch (error) {
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ console.error(formatError(message));
40
+ process.exit(1);
41
+ }
42
+ });
43
+ db
44
+ .command('schema <table>')
45
+ .description('Show table schema (columns, indexes)')
46
+ .option('--schema <schema>', 'Schema name', 'public')
47
+ .option('--role <role>', 'Role to use (anon or service_role)', 'service_role')
48
+ .option('--json', 'Output in JSON format')
49
+ .action(async (table, options) => {
50
+ try {
51
+ await handleDbSchema(table, options, program);
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : String(error);
55
+ console.error(formatError(message));
56
+ process.exit(1);
57
+ }
58
+ });
59
+ db
60
+ .command('create-table <name>')
61
+ .description('Create a new table (requires service_role; executes immediately, no confirmation prompt)')
62
+ .option('--columns <json>', 'Column definitions (JSON array)')
63
+ .option('--schema <schema>', 'Schema name (single-tenant only; multi-tenant always targets the tenant database)')
64
+ .option('--role <role>', 'Role to use (anon or service_role)', 'service_role')
65
+ .option('--json', 'Output in JSON format')
66
+ .action(async (name, options) => {
67
+ try {
68
+ await handleDbCreateTable(name, options, program);
69
+ }
70
+ catch (error) {
71
+ const message = error instanceof Error ? error.message : String(error);
72
+ console.error(formatError(message));
73
+ process.exit(1);
74
+ }
75
+ });
76
+ db
77
+ .command('add-column <table> <column>')
78
+ .description('Add a column to a table (requires service_role; executes immediately, no confirmation prompt)')
79
+ .option('--type <type>', 'Column data type', 'text')
80
+ .option('--nullable', 'Allow NULL values', true)
81
+ .option('--default <value>', 'Default value')
82
+ .option('--schema <schema>', 'Schema name (single-tenant only; multi-tenant always targets the tenant database)')
83
+ .option('--role <role>', 'Role to use (anon or service_role)', 'service_role')
84
+ .option('--json', 'Output in JSON format')
85
+ .action(async (table, column, options) => {
86
+ try {
87
+ await handleDbAddColumn(table, column, options, program);
88
+ }
89
+ catch (error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ console.error(formatError(message));
92
+ process.exit(1);
93
+ }
94
+ });
95
+ db
96
+ .command('push <file>')
97
+ .description('Apply a SQL file (DDL + RLS + seed) to the active database (single-tenant, or your tenant db in multi-tenant). Shows the plan and requires authorization.')
98
+ .option('--schema <schema>', 'Target schema for the __SCHEMA__ placeholder (single-tenant)', 'public')
99
+ .option('--rls <file>', 'Declarative RLS file (db/rls.json); takes precedence over RLS INSERTs embedded in the SQL file')
100
+ .option('--role <role>', 'Role to use (anon or service_role)', 'service_role')
101
+ .option('--dry-run', 'Show the statements without executing them')
102
+ .option('--yes', 'Authorize non-interactively (skip the confirm prompt)')
103
+ .option('--json', 'Output in JSON format')
104
+ .action(async (file, options) => {
105
+ try {
106
+ await handleDbPush(file, options, program);
107
+ }
108
+ catch (error) {
109
+ const message = error instanceof Error ? error.message : String(error);
110
+ if (options.json || program.opts().json) {
111
+ console.log(JSON.stringify({ code: 'DB_PUSH_FAILED', message }, null, 2));
112
+ }
113
+ else {
114
+ console.error(formatError(message));
115
+ }
116
+ process.exit(1);
117
+ }
118
+ });
119
+ }
120
+ export async function handleDbQuery(sql, options, program) {
121
+ const profileManager = new ProfileManager();
122
+ const currentProfile = await profileManager.getCurrentProfile();
123
+ if (!currentProfile) {
124
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
125
+ }
126
+ const credentialStore = new CredentialStore();
127
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
128
+ if (!credentials) {
129
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
130
+ }
131
+ const useServiceRole = options.role === 'service_role';
132
+ // Multi-tenant: /pg/query is platform-admin only (per-tenant keys get 401), so
133
+ // route through the tenant self-service DDL endpoint with the per-tenant
134
+ // service_role key. The resolver role-gates on service_role, so --role anon is
135
+ // not applicable here and the query always runs as the tenant's service_role.
136
+ let result;
137
+ if (currentProfile.mode === 'multi-tenant') {
138
+ if (!currentProfile.tenantId) {
139
+ throw new Error('Multi-tenant profile is missing tenantId; re-run "pxbaas login --tenant-id <id>" with per-tenant keys.');
140
+ }
141
+ if (!useServiceRole) {
142
+ console.error(formatWarning('db query in multi-tenant mode always runs as the tenant service_role (tenant-ddl ignores --role anon).'));
143
+ }
144
+ const tenantDriver = new TenantDdlDriver({
145
+ endpoint: currentProfile.endpoint,
146
+ serviceRoleKey: credentials.serviceRoleKey,
147
+ });
148
+ const rows = (await tenantDriver.query(sql));
149
+ result = { rows, rowCount: rows.length };
150
+ }
151
+ else {
152
+ const metaDriver = new MetaDriver({
153
+ endpoint: currentProfile.endpoint,
154
+ anonKey: credentials.anonKey,
155
+ serviceRoleKey: credentials.serviceRoleKey,
156
+ tenantId: currentProfile.tenantId,
157
+ });
158
+ result = await metaDriver.query(sql, useServiceRole);
159
+ }
160
+ if (options.json || program.opts().json) {
161
+ console.log(JSON.stringify(result, null, 2));
162
+ }
163
+ else {
164
+ if (result.rows.length === 0) {
165
+ console.log('Query executed successfully, no rows returned.');
166
+ }
167
+ else {
168
+ console.log(formatSuccess(`Query returned ${result.rows.length} row(s):`));
169
+ // Simple table display
170
+ const columns = Object.keys(result.rows[0]);
171
+ console.log(columns.join('\t'));
172
+ console.log(columns.map(() => '---').join('\t'));
173
+ for (const row of result.rows) {
174
+ const values = columns.map(col => String(row[col] ?? ''));
175
+ console.log(values.join('\t'));
176
+ }
177
+ }
178
+ }
179
+ }
180
+ async function handleDbTables(options, program) {
181
+ const profileManager = new ProfileManager();
182
+ const currentProfile = await profileManager.getCurrentProfile();
183
+ if (!currentProfile) {
184
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
185
+ }
186
+ const credentialStore = new CredentialStore();
187
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
188
+ if (!credentials) {
189
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
190
+ }
191
+ const useServiceRole = options.role === 'service_role';
192
+ // C1 fix: introspect via the mode-appropriate backend. In multi-tenant the
193
+ // Meta API (/pg/*) rejects per-tenant keys with 401, so route through
194
+ // tenant-ddl (information_schema) — the same channel `db query` already uses.
195
+ const introspector = makeIntrospector({
196
+ mode: currentProfile.mode,
197
+ endpoint: currentProfile.endpoint,
198
+ anonKey: credentials.anonKey,
199
+ serviceRoleKey: credentials.serviceRoleKey,
200
+ tenantId: currentProfile.tenantId,
201
+ schema: options.schema,
202
+ useServiceRole,
203
+ });
204
+ const tables = await introspector.listTables();
205
+ const schemaLabel = await introspector.currentSchema();
206
+ if (options.json || program.opts().json) {
207
+ console.log(JSON.stringify({ schema: schemaLabel, tables }, null, 2));
208
+ }
209
+ else {
210
+ if (tables.length === 0) {
211
+ console.log(`No tables found in schema "${schemaLabel}".`);
212
+ }
213
+ else {
214
+ console.log(formatSuccess(`Found ${tables.length} table(s) in schema "${schemaLabel}":`));
215
+ console.log('');
216
+ for (const table of tables) {
217
+ console.log(` ${table.name}`);
218
+ }
219
+ }
220
+ }
221
+ }
222
+ async function handleDbSchema(table, options, program) {
223
+ const profileManager = new ProfileManager();
224
+ const currentProfile = await profileManager.getCurrentProfile();
225
+ if (!currentProfile) {
226
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
227
+ }
228
+ const credentialStore = new CredentialStore();
229
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
230
+ if (!credentials) {
231
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
232
+ }
233
+ const useServiceRole = options.role === 'service_role';
234
+ // C1 fix: same mode-aware introspection as `db tables` (multi-tenant -> tenant-ddl).
235
+ const introspector = makeIntrospector({
236
+ mode: currentProfile.mode,
237
+ endpoint: currentProfile.endpoint,
238
+ anonKey: credentials.anonKey,
239
+ serviceRoleKey: credentials.serviceRoleKey,
240
+ tenantId: currentProfile.tenantId,
241
+ schema: options.schema,
242
+ useServiceRole,
243
+ });
244
+ const schemaLabel = await introspector.currentSchema();
245
+ const [columns, indexes] = await Promise.all([
246
+ introspector.getColumns(table),
247
+ introspector.getIndexes(table),
248
+ ]);
249
+ if (options.json || program.opts().json) {
250
+ console.log(JSON.stringify({ table, schema: schemaLabel, columns, indexes }, null, 2));
251
+ }
252
+ else {
253
+ console.log(formatSuccess(`Schema for table "${schemaLabel}.${table}"`));
254
+ console.log('\nColumns:');
255
+ console.log('Name\tType\tNullable\tDefault\tPrimary Key\tComment');
256
+ console.log('---\t---\t---\t---\t---\t---');
257
+ for (const col of columns) {
258
+ const nullable = col.isNullable ? 'YES' : 'NO';
259
+ const defaultValue = col.defaultValue ?? '';
260
+ const isPk = col.isPrimaryKey ? 'YES' : 'NO';
261
+ const comment = col.comment ?? '';
262
+ console.log(`${col.name}\t${col.dataType}\t${nullable}\t${defaultValue}\t${isPk}\t${comment}`);
263
+ }
264
+ if (indexes.length > 0) {
265
+ console.log('\nIndexes:');
266
+ console.log('Name\tColumns\tUnique\tPrimary\tType');
267
+ console.log('---\t---\t---\t---\t---');
268
+ for (const idx of indexes) {
269
+ const cols = idx.columns.join(', ');
270
+ const unique = idx.isUnique ? 'YES' : 'NO';
271
+ const primary = idx.isPrimary ? 'YES' : 'NO';
272
+ console.log(`${idx.name}\t${cols}\t${unique}\t${primary}\t${idx.type}`);
273
+ }
274
+ }
275
+ }
276
+ }
277
+ /** Same actionable error as `handleDbQuery` for a malformed multi-tenant profile. */
278
+ function assertTenantId(profile) {
279
+ if (!profile.tenantId) {
280
+ throw new Error('Multi-tenant profile is missing tenantId; re-run "pxbaas login --tenant-id <id>" with per-tenant keys.');
281
+ }
282
+ }
283
+ /**
284
+ * D1 fix: run one DDL statement through the channel the profile can actually
285
+ * authenticate on. Mirrors the mode dispatch of `handleDbQuery`: in
286
+ * multi-tenant the Meta API (/pg/*) only accepts the platform global
287
+ * service_role key (per-tenant keys get 401), so tenant DDL must go through
288
+ * /api/tenant-ddl with the per-tenant service_role key.
289
+ */
290
+ async function runDdl(profile, credentials, sql, options) {
291
+ const useServiceRole = options.role === 'service_role';
292
+ if (profile.mode === 'multi-tenant') {
293
+ assertTenantId(profile);
294
+ // tenant-ddl role-gates on service_role, so --role anon is not applicable
295
+ // and the statement always runs as the tenant's service_role.
296
+ if (!useServiceRole) {
297
+ console.error(formatWarning(`${options.command} in multi-tenant mode always runs as the tenant service_role (tenant-ddl ignores --role anon).`));
298
+ }
299
+ const tenantDriver = new TenantDdlDriver({
300
+ endpoint: profile.endpoint,
301
+ serviceRoleKey: credentials.serviceRoleKey,
302
+ });
303
+ const rows = (await tenantDriver.query(sql));
304
+ return { rows, rowCount: rows.length };
305
+ }
306
+ const metaDriver = new MetaDriver({
307
+ endpoint: profile.endpoint,
308
+ anonKey: credentials.anonKey,
309
+ serviceRoleKey: credentials.serviceRoleKey,
310
+ tenantId: profile.tenantId,
311
+ });
312
+ return metaDriver.query(sql, useServiceRole);
313
+ }
314
+ /**
315
+ * D3 / 06-§3 fix: the REAL target database name in multi-tenant mode, via the
316
+ * same route `db tables` uses (tenant-ddl `SELECT DATABASE()`). Falls back to
317
+ * the platform's `tenant_<id>` naming convention so a failed read-only probe
318
+ * never hard-fails an otherwise successful DDL.
319
+ */
320
+ async function resolveTenantSchemaLabel(profile, credentials) {
321
+ assertTenantId(profile);
322
+ try {
323
+ const introspector = makeIntrospector({
324
+ mode: profile.mode,
325
+ endpoint: profile.endpoint,
326
+ anonKey: credentials.anonKey,
327
+ serviceRoleKey: credentials.serviceRoleKey,
328
+ tenantId: profile.tenantId,
329
+ });
330
+ const label = await introspector.currentSchema();
331
+ if (label)
332
+ return label;
333
+ }
334
+ catch {
335
+ // fall through to the convention-based label
336
+ }
337
+ return `tenant_${profile.tenantId}`;
338
+ }
339
+ /**
340
+ * D2/D3 fix: resolve the schema a DDL command actually targets. Multi-tenant
341
+ * DDL always lands in the tenant's own database, so report that real name and
342
+ * warn when the user explicitly asked for a different --schema (instead of
343
+ * silently dropping the input). Single-tenant keeps the requested value with
344
+ * the historical `public` default.
345
+ */
346
+ async function resolveDdlSchema(profile, credentials, requestedSchema) {
347
+ if (profile.mode !== 'multi-tenant') {
348
+ return requestedSchema ?? 'public';
349
+ }
350
+ const effective = await resolveTenantSchemaLabel(profile, credentials);
351
+ if (requestedSchema && requestedSchema !== effective) {
352
+ console.error(formatWarning(`--schema is ignored in multi-tenant mode: DDL always targets the tenant database "${effective}" (requested "${requestedSchema}").`));
353
+ }
354
+ return effective;
355
+ }
356
+ export async function handleDbCreateTable(name, options, program) {
357
+ const profileManager = new ProfileManager();
358
+ const currentProfile = await profileManager.getCurrentProfile();
359
+ if (!currentProfile) {
360
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
361
+ }
362
+ const credentialStore = new CredentialStore();
363
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
364
+ if (!credentials) {
365
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
366
+ }
367
+ // Parse columns if provided
368
+ let columnDefs = [];
369
+ if (options.columns) {
370
+ try {
371
+ columnDefs = JSON.parse(options.columns);
372
+ }
373
+ catch {
374
+ throw new Error('Invalid JSON in --columns. Expected format: [{"name":"id","type":"bigint","primaryKey":true},...]');
375
+ }
376
+ }
377
+ else {
378
+ // Default: create table with id column
379
+ columnDefs = [
380
+ { name: 'id', type: 'bigint', nullable: false, primaryKey: true },
381
+ { name: 'created_at', type: 'timestamp', nullable: false },
382
+ ];
383
+ }
384
+ // D2/D3 fix: the effective target schema (tenant db in multi-tenant).
385
+ const effectiveSchema = await resolveDdlSchema(currentProfile, credentials, options.schema);
386
+ const isMultiTenant = currentProfile.mode === 'multi-tenant';
387
+ // Build SQL
388
+ const columnSql = columnDefs.map(col => {
389
+ let sql = `${col.name} ${col.type}`;
390
+ if (col.primaryKey)
391
+ sql += ' PRIMARY KEY';
392
+ if (col.nullable === false)
393
+ sql += ' NOT NULL';
394
+ return sql;
395
+ }).join(', ');
396
+ // Multi-tenant: NO schema qualifier — the tenant-ddl connection is bound to
397
+ // the tenant's own database and a `public.` prefix would be rejected (or
398
+ // would write into the shared public db). Single-tenant shape is unchanged.
399
+ const sql = isMultiTenant
400
+ ? `CREATE TABLE \`${name}\` (${columnSql})`
401
+ : `CREATE TABLE ${effectiveSchema}.${name} (${columnSql})`;
402
+ const result = await runDdl(currentProfile, credentials, sql, {
403
+ role: options.role,
404
+ command: 'db create-table',
405
+ });
406
+ if (options.json || program.opts().json) {
407
+ console.log(JSON.stringify({ table: name, schema: effectiveSchema, sql, result }, null, 2));
408
+ }
409
+ else {
410
+ console.log(formatSuccess(`Created table "${effectiveSchema}.${name}"`));
411
+ console.log(` SQL: ${sql}`);
412
+ console.log(formatWarning(' Note: the REST schema cache re-introspects after DDL; the new table is visible to /rest/v1 within a few seconds.'));
413
+ }
414
+ }
415
+ export async function handleDbAddColumn(table, column, options, program) {
416
+ const profileManager = new ProfileManager();
417
+ const currentProfile = await profileManager.getCurrentProfile();
418
+ if (!currentProfile) {
419
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
420
+ }
421
+ const credentialStore = new CredentialStore();
422
+ const credentials = await credentialStore.getCredentials(currentProfile.name);
423
+ if (!credentials) {
424
+ throw new Error(`No credentials found for profile: ${currentProfile.name}. Use "pxbaas login" to authenticate.`);
425
+ }
426
+ // D2/D3 fix: the effective target schema (tenant db in multi-tenant).
427
+ const effectiveSchema = await resolveDdlSchema(currentProfile, credentials, options.schema);
428
+ const isMultiTenant = currentProfile.mode === 'multi-tenant';
429
+ // Build SQL. Multi-tenant: NO schema qualifier (see handleDbCreateTable).
430
+ let sql = isMultiTenant
431
+ ? `ALTER TABLE \`${table}\` ADD COLUMN ${column} ${options.type}`
432
+ : `ALTER TABLE ${effectiveSchema}.${table} ADD COLUMN ${column} ${options.type}`;
433
+ if (!options.nullable) {
434
+ sql += ' NOT NULL';
435
+ }
436
+ if (options.default !== undefined) {
437
+ sql += ` DEFAULT ${options.default}`;
438
+ }
439
+ const result = await runDdl(currentProfile, credentials, sql, {
440
+ role: options.role,
441
+ command: 'db add-column',
442
+ });
443
+ if (options.json || program.opts().json) {
444
+ console.log(JSON.stringify({ table, column, schema: effectiveSchema, sql, result }, null, 2));
445
+ }
446
+ else {
447
+ console.log(formatSuccess(`Added column "${column}" to table "${effectiveSchema}.${table}"`));
448
+ console.log(` SQL: ${sql}`);
449
+ console.log(formatWarning(' Note: REST select=* re-introspects columns after DDL. If a query still omits the new column, select it explicitly or retry in a few seconds (schema cache refresh).'));
450
+ }
451
+ }
452
+ export async function handleDbPush(file, options, program) {
453
+ if (!existsSync(file)) {
454
+ throw new Error(`SQL file not found: ${file}`);
455
+ }
456
+ const raw = await readFile(file, 'utf8');
457
+ const json = Boolean(options.json || program.opts().json);
458
+ // Mode-aware: single-tenant -> /pg/query (global admin); multi-tenant ->
459
+ // /api/tenant-ddl (per-tenant service_role). RLS is diverted appropriately.
460
+ const sink = await getSchemaSink(options.role === 'anon' ? 'anon' : 'service_role');
461
+ // 06-§3 fix: in multi-tenant the statements execute in the tenant's OWN
462
+ // database, so the plan/JSON must report that real target instead of
463
+ // echoing the --schema default ("public"), which misleads audits.
464
+ let effectiveSchema = options.schema;
465
+ if (sink.mode === 'multi-tenant') {
466
+ const profileManager = new ProfileManager();
467
+ const currentProfile = await profileManager.getCurrentProfile();
468
+ const credentials = currentProfile
469
+ ? await new CredentialStore().getCredentials(currentProfile.name)
470
+ : null;
471
+ if (currentProfile && credentials) {
472
+ effectiveSchema = await resolveTenantSchemaLabel(currentProfile, credentials);
473
+ }
474
+ }
475
+ let rls = null;
476
+ if (options.rls) {
477
+ if (!existsSync(options.rls)) {
478
+ throw new Error(`RLS file not found: ${options.rls}`);
479
+ }
480
+ rls = parseRlsJson(await readFile(options.rls, 'utf8'));
481
+ }
482
+ const result = await applySchema({
483
+ rawSql: raw,
484
+ source: file,
485
+ rls,
486
+ schema: effectiveSchema,
487
+ dryRun: Boolean(options.dryRun),
488
+ assumeYes: Boolean(options.yes),
489
+ json,
490
+ }, sink);
491
+ if (json) {
492
+ console.log(JSON.stringify(result, null, 2));
493
+ }
494
+ else if (result.total === 0) {
495
+ console.log(formatWarning(`Nothing to apply from ${file}.`));
496
+ }
497
+ if (result.failed > 0)
498
+ process.exit(1);
499
+ }
500
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa5D"}