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

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 (264) hide show
  1. package/bin/pxbaas.js +13 -0
  2. package/dist/app/preflight.d.ts +38 -0
  3. package/dist/app/preflight.d.ts.map +1 -0
  4. package/dist/app/preflight.js +79 -0
  5. package/dist/app/preflight.js.map +1 -0
  6. package/dist/app/spec-lint.d.ts +45 -0
  7. package/dist/app/spec-lint.d.ts.map +1 -0
  8. package/dist/app/spec-lint.js +407 -0
  9. package/dist/app/spec-lint.js.map +1 -0
  10. package/dist/app/templates.d.ts +143 -0
  11. package/dist/app/templates.d.ts.map +1 -0
  12. package/dist/app/templates.js +151 -0
  13. package/dist/app/templates.js.map +1 -0
  14. package/dist/cli/root.d.ts +3 -0
  15. package/dist/cli/root.d.ts.map +1 -0
  16. package/dist/cli/root.js +69 -0
  17. package/dist/cli/root.js.map +1 -0
  18. package/dist/commands/app/index.d.ts +8 -0
  19. package/dist/commands/app/index.d.ts.map +1 -0
  20. package/dist/commands/app/index.js +1267 -0
  21. package/dist/commands/app/index.js.map +1 -0
  22. package/dist/commands/auth/index.d.ts +3 -0
  23. package/dist/commands/auth/index.d.ts.map +1 -0
  24. package/dist/commands/auth/index.js +198 -0
  25. package/dist/commands/auth/index.js.map +1 -0
  26. package/dist/commands/completion/index.d.ts +3 -0
  27. package/dist/commands/completion/index.d.ts.map +1 -0
  28. package/dist/commands/completion/index.js +10 -0
  29. package/dist/commands/completion/index.js.map +1 -0
  30. package/dist/commands/data/index.d.ts +3 -0
  31. package/dist/commands/data/index.d.ts.map +1 -0
  32. package/dist/commands/data/index.js +245 -0
  33. package/dist/commands/data/index.js.map +1 -0
  34. package/dist/commands/db/index.d.ts +14 -0
  35. package/dist/commands/db/index.d.ts.map +1 -0
  36. package/dist/commands/db/index.js +355 -0
  37. package/dist/commands/db/index.js.map +1 -0
  38. package/dist/commands/doctor/index.d.ts +3 -0
  39. package/dist/commands/doctor/index.d.ts.map +1 -0
  40. package/dist/commands/doctor/index.js +305 -0
  41. package/dist/commands/doctor/index.js.map +1 -0
  42. package/dist/commands/functions/delete.d.ts +3 -0
  43. package/dist/commands/functions/delete.d.ts.map +1 -0
  44. package/dist/commands/functions/delete.js +55 -0
  45. package/dist/commands/functions/delete.js.map +1 -0
  46. package/dist/commands/functions/deploy.d.ts +3 -0
  47. package/dist/commands/functions/deploy.d.ts.map +1 -0
  48. package/dist/commands/functions/deploy.js +118 -0
  49. package/dist/commands/functions/deploy.js.map +1 -0
  50. package/dist/commands/functions/index.d.ts +3 -0
  51. package/dist/commands/functions/index.d.ts.map +1 -0
  52. package/dist/commands/functions/index.js +15 -0
  53. package/dist/commands/functions/index.js.map +1 -0
  54. package/dist/commands/functions/list.d.ts +6 -0
  55. package/dist/commands/functions/list.d.ts.map +1 -0
  56. package/dist/commands/functions/list.js +63 -0
  57. package/dist/commands/functions/list.js.map +1 -0
  58. package/dist/commands/functions/new.d.ts +3 -0
  59. package/dist/commands/functions/new.d.ts.map +1 -0
  60. package/dist/commands/functions/new.js +57 -0
  61. package/dist/commands/functions/new.js.map +1 -0
  62. package/dist/commands/gen/index.d.ts +3 -0
  63. package/dist/commands/gen/index.d.ts.map +1 -0
  64. package/dist/commands/gen/index.js +320 -0
  65. package/dist/commands/gen/index.js.map +1 -0
  66. package/dist/commands/instance/index.d.ts +8 -0
  67. package/dist/commands/instance/index.d.ts.map +1 -0
  68. package/dist/commands/instance/index.js +361 -0
  69. package/dist/commands/instance/index.js.map +1 -0
  70. package/dist/commands/login/index.d.ts +3 -0
  71. package/dist/commands/login/index.d.ts.map +1 -0
  72. package/dist/commands/login/index.js +185 -0
  73. package/dist/commands/login/index.js.map +1 -0
  74. package/dist/commands/login/login.d.ts +3 -0
  75. package/dist/commands/login/login.d.ts.map +1 -0
  76. package/dist/commands/login/login.js +185 -0
  77. package/dist/commands/login/login.js.map +1 -0
  78. package/dist/commands/logout/index.d.ts +3 -0
  79. package/dist/commands/logout/index.d.ts.map +1 -0
  80. package/dist/commands/logout/index.js +41 -0
  81. package/dist/commands/logout/index.js.map +1 -0
  82. package/dist/commands/profile/import-env.d.ts +13 -0
  83. package/dist/commands/profile/import-env.d.ts.map +1 -0
  84. package/dist/commands/profile/import-env.js +81 -0
  85. package/dist/commands/profile/import-env.js.map +1 -0
  86. package/dist/commands/profile/index.d.ts +3 -0
  87. package/dist/commands/profile/index.d.ts.map +1 -0
  88. package/dist/commands/profile/index.js +109 -0
  89. package/dist/commands/profile/index.js.map +1 -0
  90. package/dist/commands/rest/index.d.ts +3 -0
  91. package/dist/commands/rest/index.d.ts.map +1 -0
  92. package/dist/commands/rest/index.js +102 -0
  93. package/dist/commands/rest/index.js.map +1 -0
  94. package/dist/commands/skill/index.d.ts +11 -0
  95. package/dist/commands/skill/index.d.ts.map +1 -0
  96. package/dist/commands/skill/index.js +153 -0
  97. package/dist/commands/skill/index.js.map +1 -0
  98. package/dist/commands/status/index.d.ts +3 -0
  99. package/dist/commands/status/index.d.ts.map +1 -0
  100. package/dist/commands/status/index.js +59 -0
  101. package/dist/commands/status/index.js.map +1 -0
  102. package/dist/commands/storage/index.d.ts +3 -0
  103. package/dist/commands/storage/index.d.ts.map +1 -0
  104. package/dist/commands/storage/index.js +198 -0
  105. package/dist/commands/storage/index.js.map +1 -0
  106. package/dist/commands/whoami/index.d.ts +3 -0
  107. package/dist/commands/whoami/index.d.ts.map +1 -0
  108. package/dist/commands/whoami/index.js +82 -0
  109. package/dist/commands/whoami/index.js.map +1 -0
  110. package/dist/credentials/commit.d.ts +38 -0
  111. package/dist/credentials/commit.d.ts.map +1 -0
  112. package/dist/credentials/commit.js +57 -0
  113. package/dist/credentials/commit.js.map +1 -0
  114. package/dist/credentials/credential-store.d.ts +57 -0
  115. package/dist/credentials/credential-store.d.ts.map +1 -0
  116. package/dist/credentials/credential-store.js +180 -0
  117. package/dist/credentials/credential-store.js.map +1 -0
  118. package/dist/credentials/env-file.d.ts +44 -0
  119. package/dist/credentials/env-file.d.ts.map +1 -0
  120. package/dist/credentials/env-file.js +118 -0
  121. package/dist/credentials/env-file.js.map +1 -0
  122. package/dist/credentials/formatter.d.ts +39 -0
  123. package/dist/credentials/formatter.d.ts.map +1 -0
  124. package/dist/credentials/formatter.js +79 -0
  125. package/dist/credentials/formatter.js.map +1 -0
  126. package/dist/credentials/index.d.ts +11 -0
  127. package/dist/credentials/index.d.ts.map +1 -0
  128. package/dist/credentials/index.js +11 -0
  129. package/dist/credentials/index.js.map +1 -0
  130. package/dist/credentials/jwt-introspect.d.ts +32 -0
  131. package/dist/credentials/jwt-introspect.d.ts.map +1 -0
  132. package/dist/credentials/jwt-introspect.js +64 -0
  133. package/dist/credentials/jwt-introspect.js.map +1 -0
  134. package/dist/credentials/masker.d.ts +20 -0
  135. package/dist/credentials/masker.d.ts.map +1 -0
  136. package/dist/credentials/masker.js +37 -0
  137. package/dist/credentials/masker.js.map +1 -0
  138. package/dist/credentials/profile.d.ts +83 -0
  139. package/dist/credentials/profile.d.ts.map +1 -0
  140. package/dist/credentials/profile.js +184 -0
  141. package/dist/credentials/profile.js.map +1 -0
  142. package/dist/credentials/tenant-guard.d.ts +16 -0
  143. package/dist/credentials/tenant-guard.d.ts.map +1 -0
  144. package/dist/credentials/tenant-guard.js +53 -0
  145. package/dist/credentials/tenant-guard.js.map +1 -0
  146. package/dist/credentials/tty-guard.d.ts +19 -0
  147. package/dist/credentials/tty-guard.d.ts.map +1 -0
  148. package/dist/credentials/tty-guard.js +47 -0
  149. package/dist/credentials/tty-guard.js.map +1 -0
  150. package/dist/db/apply-schema.d.ts +57 -0
  151. package/dist/db/apply-schema.d.ts.map +1 -0
  152. package/dist/db/apply-schema.js +192 -0
  153. package/dist/db/apply-schema.js.map +1 -0
  154. package/dist/db/sql-file.d.ts +49 -0
  155. package/dist/db/sql-file.d.ts.map +1 -0
  156. package/dist/db/sql-file.js +167 -0
  157. package/dist/db/sql-file.js.map +1 -0
  158. package/dist/instance/provision.d.ts +89 -0
  159. package/dist/instance/provision.d.ts.map +1 -0
  160. package/dist/instance/provision.js +139 -0
  161. package/dist/instance/provision.js.map +1 -0
  162. package/dist/instance/zero-store.d.ts +47 -0
  163. package/dist/instance/zero-store.d.ts.map +1 -0
  164. package/dist/instance/zero-store.js +91 -0
  165. package/dist/instance/zero-store.js.map +1 -0
  166. package/dist/main.d.ts +3 -0
  167. package/dist/main.d.ts.map +1 -0
  168. package/dist/main.js +46 -0
  169. package/dist/main.js.map +1 -0
  170. package/dist/skill/assets.d.ts +38 -0
  171. package/dist/skill/assets.d.ts.map +1 -0
  172. package/dist/skill/assets.js +111 -0
  173. package/dist/skill/assets.js.map +1 -0
  174. package/dist/skill/hint.d.ts +39 -0
  175. package/dist/skill/hint.d.ts.map +1 -0
  176. package/dist/skill/hint.js +109 -0
  177. package/dist/skill/hint.js.map +1 -0
  178. package/dist/skill/hosts.d.ts +21 -0
  179. package/dist/skill/hosts.d.ts.map +1 -0
  180. package/dist/skill/hosts.js +38 -0
  181. package/dist/skill/hosts.js.map +1 -0
  182. package/dist/skill/installer.d.ts +88 -0
  183. package/dist/skill/installer.d.ts.map +1 -0
  184. package/dist/skill/installer.js +203 -0
  185. package/dist/skill/installer.js.map +1 -0
  186. package/dist/skill/ownership.d.ts +35 -0
  187. package/dist/skill/ownership.d.ts.map +1 -0
  188. package/dist/skill/ownership.js +52 -0
  189. package/dist/skill/ownership.js.map +1 -0
  190. package/package.json +63 -3
  191. package/skills/pxbaas-app-spec/SKILL.md +163 -0
  192. package/skills/pxbaas-app-spec/references/deploy-options.md +157 -0
  193. package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
  194. package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
  195. package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
  196. package/skills/pxbaas-app-spec/references/templates-examples.md +308 -0
  197. package/skills/pxbaas-cli/SKILL.md +168 -0
  198. package/skills/pxbaas-cli/references/api-reference.md +68 -0
  199. package/skills/pxbaas-cli/references/app-deploy.md +143 -0
  200. package/skills/pxbaas-cli/references/auth-and-credentials.md +88 -0
  201. package/skills/pxbaas-cli/references/data-postgrest.md +85 -0
  202. package/skills/pxbaas-cli/references/db-and-meta.md +85 -0
  203. package/skills/pxbaas-cli/references/edge-functions.md +71 -0
  204. package/skills/pxbaas-cli/references/multi-tenant-apps.md +107 -0
  205. package/skills/pxbaas-cli/references/provision.md +86 -0
  206. package/skills/pxbaas-cli/references/safety-and-two-phase.md +49 -0
  207. package/skills/pxbaas-cli/references/storage.md +61 -0
  208. package/skills/pxbaas-cli/references/troubleshooting.md +73 -0
  209. package/templates/webapp/api/index.ts +55 -0
  210. package/templates/webapp/csr-bff/README.md +81 -0
  211. package/templates/webapp/csr-bff/backend/index.ts +168 -0
  212. package/templates/webapp/csr-bff/db/schema.sql +69 -0
  213. package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
  214. package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
  215. package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
  216. package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
  217. package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
  218. package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
  219. package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
  220. package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
  221. package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
  222. package/templates/webapp/manifest.json +296 -0
  223. package/templates/webapp/mpa/about.html +29 -0
  224. package/templates/webapp/mpa/app.js +42 -0
  225. package/templates/webapp/mpa/index.html +42 -0
  226. package/templates/webapp/mpa/index.ts +60 -0
  227. package/templates/webapp/mpa/style.css +42 -0
  228. package/templates/webapp/react-vite/frontend/index.html +12 -0
  229. package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
  230. package/templates/webapp/react-vite/frontend/package.json +23 -0
  231. package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
  232. package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
  233. package/templates/webapp/react-vite/frontend/src/style.css +46 -0
  234. package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
  235. package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
  236. package/templates/webapp/react-vite-hono/backend/index.ts +21 -0
  237. package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
  238. package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
  239. package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
  240. package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
  241. package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
  242. package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
  243. package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
  244. package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
  245. package/templates/webapp/spa/index.ts +119 -0
  246. package/templates/webapp/ssr-auth/backend/index.ts +133 -0
  247. package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
  248. package/templates/webapp/ssr-blog/README.md +111 -0
  249. package/templates/webapp/ssr-blog/backend/index.ts +764 -0
  250. package/templates/webapp/ssr-blog/db/schema.sql +71 -0
  251. package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
  252. package/templates/webapp/ssr-frameworks/README.md +64 -0
  253. package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
  254. package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
  255. package/templates/webapp/ssr-hono/backend/index.ts +92 -0
  256. package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
  257. package/templates/webapp/ssr-shop/README.md +80 -0
  258. package/templates/webapp/ssr-shop/backend/index.ts +491 -0
  259. package/templates/webapp/ssr-shop/db/schema.sql +120 -0
  260. package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
  261. package/templates/webapp/vanilla-static/frontend/app.js +6 -0
  262. package/templates/webapp/vanilla-static/frontend/index.html +19 -0
  263. package/templates/webapp/vanilla-static/frontend/style.css +43 -0
  264. package/README.md +0 -3
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Single-tenant schema apply engine shared by `pxbaas db push <file>` and
3
+ * `pxbaas app db-init <name>`.
4
+ *
5
+ * Safety contract (agreed design):
6
+ * - The plan (every statement) is shown BEFORE anything runs.
7
+ * - Execution requires explicit authorization: an interactive confirm, or
8
+ * `--yes` for non-interactive use. `--dry-run` only previews.
9
+ * - Statements run sequentially and STOP ON THE FIRST ERROR.
10
+ * - No automatic rollback — already-applied statements stay applied.
11
+ * - Multi-tenant profiles are rejected: tenant DDL is out of scope (it needs
12
+ * the global service_role key via POST /pg/query with tenant_<id>.<table>).
13
+ */
14
+ import { MetaDriver } from "@polardbx/pxbaas-client";
15
+ export interface ApplyOptions {
16
+ /** Target schema the `__SCHEMA__` placeholder resolves to (single-tenant: public). */
17
+ schema: string;
18
+ /** Preview only; never execute. */
19
+ dryRun: boolean;
20
+ /** Non-interactive authorization; skips the confirm prompt. */
21
+ assumeYes: boolean;
22
+ /** Emit a structured result instead of human text (caller prints JSON). */
23
+ json: boolean;
24
+ }
25
+ export interface StatementResult {
26
+ index: number;
27
+ sql: string;
28
+ status: "pending" | "ok" | "failed" | "skipped";
29
+ error?: string;
30
+ }
31
+ export interface ApplyResult {
32
+ source: string;
33
+ schema: string;
34
+ total: number;
35
+ executed: number;
36
+ failed: number;
37
+ dryRun: boolean;
38
+ authorized: boolean;
39
+ statements: StatementResult[];
40
+ }
41
+ /** A minimal SQL executor so this module stays unit-testable without MetaDriver. */
42
+ export type SqlExecutor = (sql: string) => Promise<unknown>;
43
+ /**
44
+ * Resolve the active profile into a single-tenant MetaDriver.
45
+ * @throws when there is no profile, no credentials, or the profile is multi-tenant.
46
+ */
47
+ export declare function getSingleTenantMetaDriver(role?: "anon" | "service_role"): Promise<{
48
+ driver: MetaDriver;
49
+ useServiceRole: boolean;
50
+ profileName: string;
51
+ }>;
52
+ /**
53
+ * Show the plan, obtain authorization, then apply statements sequentially with
54
+ * stop-on-first-error semantics. Never rolls back.
55
+ */
56
+ export declare function applySqlStatements(rawSql: string, source: string, opts: ApplyOptions, executor: SqlExecutor): Promise<ApplyResult>;
57
+ //# sourceMappingURL=apply-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-schema.d.ts","sourceRoot":"","sources":["../../src/db/apply-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAUrD,MAAM,WAAW,YAAY;IAC3B,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5D;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,GAAE,MAAM,GAAG,cAA+B,GAC7C,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B/E;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,WAAW,CAAC,CAyItB"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Single-tenant schema apply engine shared by `pxbaas db push <file>` and
3
+ * `pxbaas app db-init <name>`.
4
+ *
5
+ * Safety contract (agreed design):
6
+ * - The plan (every statement) is shown BEFORE anything runs.
7
+ * - Execution requires explicit authorization: an interactive confirm, or
8
+ * `--yes` for non-interactive use. `--dry-run` only previews.
9
+ * - Statements run sequentially and STOP ON THE FIRST ERROR.
10
+ * - No automatic rollback — already-applied statements stay applied.
11
+ * - Multi-tenant profiles are rejected: tenant DDL is out of scope (it needs
12
+ * the global service_role key via POST /pg/query with tenant_<id>.<table>).
13
+ */
14
+ import inquirer from "inquirer";
15
+ import { MetaDriver } from "@polardbx/pxbaas-client";
16
+ import { CredentialStore, ProfileManager, formatError, formatSuccess, formatWarning, } from "../credentials/index.js";
17
+ import { buildStatementPlan, SCHEMA_PLACEHOLDER } from "./sql-file.js";
18
+ /**
19
+ * Resolve the active profile into a single-tenant MetaDriver.
20
+ * @throws when there is no profile, no credentials, or the profile is multi-tenant.
21
+ */
22
+ export async function getSingleTenantMetaDriver(role = "service_role") {
23
+ const profileManager = new ProfileManager();
24
+ const profile = await profileManager.getCurrentProfile();
25
+ if (!profile) {
26
+ throw new Error('No active profile. Use "pxbaas login" to authenticate first.');
27
+ }
28
+ if (profile.mode === "multi-tenant") {
29
+ throw new Error("Multi-tenant DDL is not supported by this command. In multi-tenant mode run DDL " +
30
+ "via POST {endpoint}/pg/query using the GLOBAL service_role key with fully-qualified " +
31
+ "tenant_<id>.<table> names (per-tenant keys are rejected 401 on /pg/query).");
32
+ }
33
+ const credentials = await new CredentialStore().getCredentials(profile.name);
34
+ if (!credentials) {
35
+ throw new Error(`No credentials found for profile: ${profile.name}. Use "pxbaas login" to authenticate.`);
36
+ }
37
+ const driver = new MetaDriver({
38
+ endpoint: profile.endpoint,
39
+ anonKey: credentials.anonKey,
40
+ serviceRoleKey: credentials.serviceRoleKey,
41
+ tenantId: profile.tenantId,
42
+ });
43
+ return { driver, useServiceRole: role === "service_role", profileName: profile.name };
44
+ }
45
+ /**
46
+ * Show the plan, obtain authorization, then apply statements sequentially with
47
+ * stop-on-first-error semantics. Never rolls back.
48
+ */
49
+ export async function applySqlStatements(rawSql, source, opts, executor) {
50
+ const { statements, substituted } = buildStatementPlan(rawSql, opts.schema);
51
+ if (statements.length === 0) {
52
+ if (!opts.json) {
53
+ console.log(formatWarning(`No executable statements found in ${source}.`));
54
+ }
55
+ return {
56
+ source,
57
+ schema: opts.schema,
58
+ total: 0,
59
+ executed: 0,
60
+ failed: 0,
61
+ dryRun: opts.dryRun,
62
+ authorized: false,
63
+ statements: [],
64
+ };
65
+ }
66
+ // 1) Show the plan (text mode). JSON callers receive the structured result.
67
+ if (!opts.json) {
68
+ console.log(formatSuccess(`Plan for ${source} (schema: ${opts.schema})`));
69
+ if (!substituted) {
70
+ console.log(formatWarning(`Script contains no ${SCHEMA_PLACEHOLDER} placeholder; --schema has no effect.`));
71
+ }
72
+ statements.forEach((sql, i) => {
73
+ console.log(`\n[${i + 1}/${statements.length}] ${sql}`);
74
+ });
75
+ console.log("");
76
+ }
77
+ // 2) Dry run: preview only.
78
+ if (opts.dryRun) {
79
+ if (!opts.json) {
80
+ console.log(formatWarning(`Dry run: 0 of ${statements.length} statement(s) executed.`));
81
+ }
82
+ return {
83
+ source,
84
+ schema: opts.schema,
85
+ total: statements.length,
86
+ executed: 0,
87
+ failed: 0,
88
+ dryRun: true,
89
+ authorized: false,
90
+ statements: statements.map((sql, i) => ({
91
+ index: i + 1,
92
+ sql,
93
+ status: "skipped",
94
+ })),
95
+ };
96
+ }
97
+ // 3) Authorization gate.
98
+ const authorized = await authorize(statements.length, opts);
99
+ if (!authorized) {
100
+ if (!opts.json) {
101
+ console.log(formatWarning("Aborted by operator; nothing was executed."));
102
+ }
103
+ return {
104
+ source,
105
+ schema: opts.schema,
106
+ total: statements.length,
107
+ executed: 0,
108
+ failed: 0,
109
+ dryRun: false,
110
+ authorized: false,
111
+ statements: statements.map((sql, i) => ({
112
+ index: i + 1,
113
+ sql,
114
+ status: "skipped",
115
+ })),
116
+ };
117
+ }
118
+ // 4) Execute sequentially; stop on the first error; no rollback.
119
+ const results = [];
120
+ let executed = 0;
121
+ let failed = 0;
122
+ for (let i = 0; i < statements.length; i++) {
123
+ const sql = statements[i];
124
+ const r = { index: i + 1, sql, status: "pending" };
125
+ results.push(r);
126
+ try {
127
+ await executor(sql);
128
+ r.status = "ok";
129
+ executed++;
130
+ if (!opts.json)
131
+ console.log(formatSuccess(`[${i + 1}/${statements.length}] ok`));
132
+ }
133
+ catch (e) {
134
+ r.status = "failed";
135
+ r.error = e instanceof Error ? e.message : String(e);
136
+ failed++;
137
+ if (!opts.json) {
138
+ console.error(formatError(`[${i + 1}/${statements.length}] failed: ${r.error}`));
139
+ }
140
+ for (let j = i + 1; j < statements.length; j++) {
141
+ results.push({ index: j + 1, sql: statements[j], status: "skipped" });
142
+ }
143
+ break;
144
+ }
145
+ }
146
+ if (!opts.json) {
147
+ console.log("");
148
+ if (failed === 0) {
149
+ console.log(formatSuccess(`Applied ${executed}/${statements.length} statement(s) to schema '${opts.schema}'.`));
150
+ }
151
+ else {
152
+ console.log(formatError(`Stopped after failure: ${executed} ok, ${failed} failed, ` +
153
+ `${statements.length - executed - failed} skipped. No rollback performed.`));
154
+ }
155
+ }
156
+ return {
157
+ source,
158
+ schema: opts.schema,
159
+ total: statements.length,
160
+ executed,
161
+ failed,
162
+ dryRun: false,
163
+ authorized: true,
164
+ statements: results,
165
+ };
166
+ }
167
+ /**
168
+ * Decide whether execution is authorized. `--yes` authorizes outright; JSON mode
169
+ * and non-TTY sessions cannot prompt, so they require `--yes` explicitly.
170
+ */
171
+ async function authorize(count, opts) {
172
+ if (opts.assumeYes)
173
+ return true;
174
+ if (opts.json) {
175
+ throw new Error("Refusing to run DDL in --json mode without explicit authorization. " +
176
+ "Re-run with --yes to apply, or --dry-run to preview only.");
177
+ }
178
+ if (!process.stdin.isTTY) {
179
+ throw new Error("Refusing to run DDL without explicit authorization: pass --yes for " +
180
+ "non-interactive use, or run in a TTY to confirm.");
181
+ }
182
+ const { ok } = await inquirer.prompt([
183
+ {
184
+ type: "confirm",
185
+ name: "ok",
186
+ message: `Execute ${count} statement(s) against schema '${opts.schema}'? (no automatic rollback)`,
187
+ default: false,
188
+ },
189
+ ]);
190
+ return ok;
191
+ }
192
+ //# sourceMappingURL=apply-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-schema.js","sourceRoot":"","sources":["../../src/db/apply-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pure SQL-file helpers for single-tenant DDL apply (`pxbaas db push` and
3
+ * `pxbaas app db-init`).
4
+ *
5
+ * These functions do NO I/O and NO network — they only transform the text of a
6
+ * schema.sql script so they can be unit-tested in isolation:
7
+ * - substituteSchema: fill the `__SCHEMA__` placeholder templates ship with.
8
+ * - splitSqlStatements: cut a script into individual statements on top-level
9
+ * `;`, correctly ignoring separators that appear inside strings, quoted
10
+ * identifiers, or comments.
11
+ */
12
+ /** Placeholder that every webapp template's db/schema.sql uses for the target schema. */
13
+ export declare const SCHEMA_PLACEHOLDER = "__SCHEMA__";
14
+ /** True when the script still contains the `__SCHEMA__` placeholder. */
15
+ export declare function hasSchemaPlaceholder(sql: string): boolean;
16
+ /**
17
+ * Replace every `__SCHEMA__` occurrence with the target schema name.
18
+ * Single-tenant instances use `public`; the value is inserted verbatim because
19
+ * it is a database identifier the operator chose (not user free-text).
20
+ */
21
+ export declare function substituteSchema(sql: string, schema: string): string;
22
+ /**
23
+ * Split a SQL script into individual statements on top-level `;`.
24
+ *
25
+ * Semicolons are ignored when they appear inside:
26
+ * - single-quoted strings (`''` is an escaped literal quote)
27
+ * - double-quoted strings (`""` is an escaped literal quote)
28
+ * - backtick-quoted identifiers
29
+ * - `--` / `#` line comments
30
+ * - `/* *\/` block comments
31
+ *
32
+ * Comments are stripped from the returned statements (replaced by a single
33
+ * space) so the plan we show the operator is clean and each element is exactly
34
+ * one executable statement. Empty / comment-only fragments are dropped.
35
+ *
36
+ * This is intentionally a scanner, not a SQL parser: it only needs to find
37
+ * statement boundaries safely for the idempotent scripts our templates ship.
38
+ */
39
+ export declare function splitSqlStatements(sql: string): string[];
40
+ /**
41
+ * Convenience: substitute the schema placeholder then split into statements.
42
+ * Returns the statements plus whether any placeholder was actually present
43
+ * (so callers can warn when a schema was supplied but the script ignores it).
44
+ */
45
+ export declare function buildStatementPlan(rawSql: string, schema: string): {
46
+ statements: string[];
47
+ substituted: boolean;
48
+ };
49
+ //# sourceMappingURL=sql-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-file.d.ts","sourceRoot":"","sources":["../../src/db/sql-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAmHxD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAIhD"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Pure SQL-file helpers for single-tenant DDL apply (`pxbaas db push` and
3
+ * `pxbaas app db-init`).
4
+ *
5
+ * These functions do NO I/O and NO network — they only transform the text of a
6
+ * schema.sql script so they can be unit-tested in isolation:
7
+ * - substituteSchema: fill the `__SCHEMA__` placeholder templates ship with.
8
+ * - splitSqlStatements: cut a script into individual statements on top-level
9
+ * `;`, correctly ignoring separators that appear inside strings, quoted
10
+ * identifiers, or comments.
11
+ */
12
+ /** Placeholder that every webapp template's db/schema.sql uses for the target schema. */
13
+ export const SCHEMA_PLACEHOLDER = "__SCHEMA__";
14
+ /** True when the script still contains the `__SCHEMA__` placeholder. */
15
+ export function hasSchemaPlaceholder(sql) {
16
+ return sql.includes(SCHEMA_PLACEHOLDER);
17
+ }
18
+ /**
19
+ * Replace every `__SCHEMA__` occurrence with the target schema name.
20
+ * Single-tenant instances use `public`; the value is inserted verbatim because
21
+ * it is a database identifier the operator chose (not user free-text).
22
+ */
23
+ export function substituteSchema(sql, schema) {
24
+ return sql.split(SCHEMA_PLACEHOLDER).join(schema);
25
+ }
26
+ /**
27
+ * Split a SQL script into individual statements on top-level `;`.
28
+ *
29
+ * Semicolons are ignored when they appear inside:
30
+ * - single-quoted strings (`''` is an escaped literal quote)
31
+ * - double-quoted strings (`""` is an escaped literal quote)
32
+ * - backtick-quoted identifiers
33
+ * - `--` / `#` line comments
34
+ * - `/* *\/` block comments
35
+ *
36
+ * Comments are stripped from the returned statements (replaced by a single
37
+ * space) so the plan we show the operator is clean and each element is exactly
38
+ * one executable statement. Empty / comment-only fragments are dropped.
39
+ *
40
+ * This is intentionally a scanner, not a SQL parser: it only needs to find
41
+ * statement boundaries safely for the idempotent scripts our templates ship.
42
+ */
43
+ export function splitSqlStatements(sql) {
44
+ const statements = [];
45
+ let current = "";
46
+ let i = 0;
47
+ const n = sql.length;
48
+ let inSingle = false;
49
+ let inDouble = false;
50
+ let inBacktick = false;
51
+ let inLineComment = false;
52
+ let inBlockComment = false;
53
+ while (i < n) {
54
+ const c = sql[i];
55
+ const next = i + 1 < n ? sql[i + 1] : "";
56
+ // --- comment states: consume without appending -------------------------
57
+ if (inLineComment) {
58
+ if (c === "\n") {
59
+ inLineComment = false;
60
+ current += " ";
61
+ }
62
+ i++;
63
+ continue;
64
+ }
65
+ if (inBlockComment) {
66
+ if (c === "*" && next === "/") {
67
+ inBlockComment = false;
68
+ current += " ";
69
+ i += 2;
70
+ continue;
71
+ }
72
+ i++;
73
+ continue;
74
+ }
75
+ // --- quoted states: append verbatim, track escapes ----------------------
76
+ if (inSingle) {
77
+ if (c === "'" && next === "'") {
78
+ current += "''";
79
+ i += 2;
80
+ continue;
81
+ }
82
+ if (c === "'")
83
+ inSingle = false;
84
+ current += c;
85
+ i++;
86
+ continue;
87
+ }
88
+ if (inDouble) {
89
+ if (c === '"' && next === '"') {
90
+ current += '""';
91
+ i += 2;
92
+ continue;
93
+ }
94
+ if (c === '"')
95
+ inDouble = false;
96
+ current += c;
97
+ i++;
98
+ continue;
99
+ }
100
+ if (inBacktick) {
101
+ if (c === "`")
102
+ inBacktick = false;
103
+ current += c;
104
+ i++;
105
+ continue;
106
+ }
107
+ // --- neutral state: detect transitions and the statement separator -------
108
+ if (c === "-" && next === "-") {
109
+ inLineComment = true;
110
+ i += 2;
111
+ continue;
112
+ }
113
+ if (c === "#") {
114
+ inLineComment = true;
115
+ i++;
116
+ continue;
117
+ }
118
+ if (c === "/" && next === "*") {
119
+ inBlockComment = true;
120
+ i += 2;
121
+ continue;
122
+ }
123
+ if (c === "'") {
124
+ inSingle = true;
125
+ current += c;
126
+ i++;
127
+ continue;
128
+ }
129
+ if (c === '"') {
130
+ inDouble = true;
131
+ current += c;
132
+ i++;
133
+ continue;
134
+ }
135
+ if (c === "`") {
136
+ inBacktick = true;
137
+ current += c;
138
+ i++;
139
+ continue;
140
+ }
141
+ if (c === ";") {
142
+ const stmt = current.trim();
143
+ if (stmt)
144
+ statements.push(stmt);
145
+ current = "";
146
+ i++;
147
+ continue;
148
+ }
149
+ current += c;
150
+ i++;
151
+ }
152
+ const tail = current.trim();
153
+ if (tail)
154
+ statements.push(tail);
155
+ return statements;
156
+ }
157
+ /**
158
+ * Convenience: substitute the schema placeholder then split into statements.
159
+ * Returns the statements plus whether any placeholder was actually present
160
+ * (so callers can warn when a schema was supplied but the script ignores it).
161
+ */
162
+ export function buildStatementPlan(rawSql, schema) {
163
+ const substituted = hasSchemaPlaceholder(rawSql);
164
+ const sql = substituted ? substituteSchema(rawSql, schema) : rawSql;
165
+ return { statements: splitSqlStatements(sql), substituted };
166
+ }
167
+ //# sourceMappingURL=sql-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-file.js","sourceRoot":"","sources":["../../src/db/sql-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Provisioning core logic — claim a Zero PXBaas instance and bind it to a baas
3
+ * profile. Kept separate from the commander wiring and driven by narrow
4
+ * interfaces so it is unit-testable with fakes (no keytar / no network).
5
+ *
6
+ * Security model: Zero returns plaintext keys over TLS; this module ingests them
7
+ * into the credential sink (keyring) and NEVER returns plaintext — only
8
+ * fingerprints. Agents can run this without a human TTY login.
9
+ */
10
+ import type { BaasProfile } from '../credentials/profile.js';
11
+ import type { StoredCredentials } from '../credentials/credential-store.js';
12
+ import { type ZeroClaimResponse, type ZeroInstance } from '@polardbx/pxbaas-client';
13
+ import type { ZeroStore } from './zero-store.js';
14
+ /** Narrow deps so tests can inject fakes. */
15
+ export interface ZeroApi {
16
+ claim(whitelistIp?: string): Promise<ZeroClaimResponse>;
17
+ list(token: string): Promise<ZeroInstance[]>;
18
+ release(id: string, token: string): Promise<void>;
19
+ }
20
+ export interface ProfileSink {
21
+ setProfile(p: BaasProfile): Promise<void>;
22
+ useProfile(name: string): Promise<void>;
23
+ getCurrentProfile(): Promise<BaasProfile | null>;
24
+ getProfile(name: string): Promise<BaasProfile | null>;
25
+ removeProfile(name: string): Promise<boolean>;
26
+ }
27
+ export interface CredSink {
28
+ setCredentials(name: string, c: StoredCredentials): Promise<void>;
29
+ getCredentials(name: string): Promise<StoredCredentials | null>;
30
+ deleteCredentials(name: string): Promise<boolean>;
31
+ }
32
+ export interface ProvisionDeps {
33
+ zero: ZeroApi;
34
+ profiles: ProfileSink;
35
+ creds: CredSink;
36
+ store: ZeroStore;
37
+ }
38
+ export interface ProvisionOptions {
39
+ name?: string;
40
+ whitelistIp?: string;
41
+ /** Switch current profile to the new instance (default true). */
42
+ switchProfile?: boolean;
43
+ /** Overwrite an existing profile of the same name. */
44
+ force?: boolean;
45
+ /** Reuse an existing active Zero instance instead of claiming a new one. */
46
+ reuse?: boolean;
47
+ }
48
+ export interface ProvisionResult {
49
+ reused: boolean;
50
+ profileName: string;
51
+ switchedFrom: string | null;
52
+ instance: {
53
+ id: string;
54
+ endpoint: string;
55
+ appEndpoint?: string;
56
+ dashboardUrl?: string;
57
+ region?: string;
58
+ whitelistIp?: string;
59
+ expiresAt?: string;
60
+ mode: 'single-tenant';
61
+ };
62
+ keys: {
63
+ anon: {
64
+ fingerprint: string;
65
+ role: 'anon';
66
+ };
67
+ serviceRole: {
68
+ fingerprint: string;
69
+ role: 'service_role';
70
+ };
71
+ };
72
+ dashboard: {
73
+ username: 'supabase';
74
+ passwordRevealed: boolean;
75
+ };
76
+ }
77
+ /** Claim (or reuse) a Zero instance and bind it to a profile + credentials. */
78
+ export declare function provisionInstance(deps: ProvisionDeps, options?: ProvisionOptions): Promise<ProvisionResult>;
79
+ export interface ReleaseResult {
80
+ id: string;
81
+ released: boolean;
82
+ profileRemoved: string | null;
83
+ wasCurrent: boolean;
84
+ }
85
+ /** Release a Zero instance and unbind/remove its local profile. */
86
+ export declare function releaseInstance(deps: ProvisionDeps, id: string, opts?: {
87
+ removeProfile?: boolean;
88
+ }): Promise<ReleaseResult>;
89
+ //# sourceMappingURL=provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/instance/provision.ts"],"names":[],"mappings":"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"}