@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.
- package/README.md +223 -2
- package/bin/pxbaas.js +13 -0
- package/dist/app/local-index.d.ts +70 -0
- package/dist/app/local-index.d.ts.map +1 -0
- package/dist/app/local-index.js +140 -0
- package/dist/app/local-index.js.map +1 -0
- package/dist/app/preflight.d.ts +61 -0
- package/dist/app/preflight.d.ts.map +1 -0
- package/dist/app/preflight.js +115 -0
- package/dist/app/preflight.js.map +1 -0
- package/dist/app/spec-lint.d.ts +45 -0
- package/dist/app/spec-lint.d.ts.map +1 -0
- package/dist/app/spec-lint.js +423 -0
- package/dist/app/spec-lint.js.map +1 -0
- package/dist/app/templates.d.ts +167 -0
- package/dist/app/templates.d.ts.map +1 -0
- package/dist/app/templates.js +151 -0
- package/dist/app/templates.js.map +1 -0
- package/dist/cli/help-guides.d.ts +17 -0
- package/dist/cli/help-guides.d.ts.map +1 -0
- package/dist/cli/help-guides.js +132 -0
- package/dist/cli/help-guides.js.map +1 -0
- package/dist/cli/root.d.ts +3 -0
- package/dist/cli/root.d.ts.map +1 -0
- package/dist/cli/root.js +75 -0
- package/dist/cli/root.js.map +1 -0
- package/dist/commands/app/index.d.ts +8 -0
- package/dist/commands/app/index.d.ts.map +1 -0
- package/dist/commands/app/index.js +1907 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +198 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/completion/index.d.ts +3 -0
- package/dist/commands/completion/index.d.ts.map +1 -0
- package/dist/commands/completion/index.js +14 -0
- package/dist/commands/completion/index.js.map +1 -0
- package/dist/commands/data/index.d.ts +55 -0
- package/dist/commands/data/index.d.ts.map +1 -0
- package/dist/commands/data/index.js +407 -0
- package/dist/commands/data/index.js.map +1 -0
- package/dist/commands/db/index.d.ts +29 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +500 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +3 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +305 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/functions/delete.d.ts +3 -0
- package/dist/commands/functions/delete.d.ts.map +1 -0
- package/dist/commands/functions/delete.js +55 -0
- package/dist/commands/functions/delete.js.map +1 -0
- package/dist/commands/functions/deploy.d.ts +3 -0
- package/dist/commands/functions/deploy.d.ts.map +1 -0
- package/dist/commands/functions/deploy.js +118 -0
- package/dist/commands/functions/deploy.js.map +1 -0
- package/dist/commands/functions/index.d.ts +3 -0
- package/dist/commands/functions/index.d.ts.map +1 -0
- package/dist/commands/functions/index.js +15 -0
- package/dist/commands/functions/index.js.map +1 -0
- package/dist/commands/functions/list.d.ts +6 -0
- package/dist/commands/functions/list.d.ts.map +1 -0
- package/dist/commands/functions/list.js +63 -0
- package/dist/commands/functions/list.js.map +1 -0
- package/dist/commands/functions/new.d.ts +7 -0
- package/dist/commands/functions/new.d.ts.map +1 -0
- package/dist/commands/functions/new.js +72 -0
- package/dist/commands/functions/new.js.map +1 -0
- package/dist/commands/gen/index.d.ts +3 -0
- package/dist/commands/gen/index.d.ts.map +1 -0
- package/dist/commands/gen/index.js +323 -0
- package/dist/commands/gen/index.js.map +1 -0
- package/dist/commands/guide/index.d.ts +8 -0
- package/dist/commands/guide/index.d.ts.map +1 -0
- package/dist/commands/guide/index.js +20 -0
- package/dist/commands/guide/index.js.map +1 -0
- package/dist/commands/instance/index.d.ts +8 -0
- package/dist/commands/instance/index.d.ts.map +1 -0
- package/dist/commands/instance/index.js +481 -0
- package/dist/commands/instance/index.js.map +1 -0
- package/dist/commands/login/index.d.ts +3 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +145 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/logout/index.d.ts +3 -0
- package/dist/commands/logout/index.d.ts.map +1 -0
- package/dist/commands/logout/index.js +41 -0
- package/dist/commands/logout/index.js.map +1 -0
- package/dist/commands/profile/import-env.d.ts +18 -0
- package/dist/commands/profile/import-env.d.ts.map +1 -0
- package/dist/commands/profile/import-env.js +206 -0
- package/dist/commands/profile/import-env.js.map +1 -0
- package/dist/commands/profile/index.d.ts +3 -0
- package/dist/commands/profile/index.d.ts.map +1 -0
- package/dist/commands/profile/index.js +124 -0
- package/dist/commands/profile/index.js.map +1 -0
- package/dist/commands/rest/index.d.ts +3 -0
- package/dist/commands/rest/index.d.ts.map +1 -0
- package/dist/commands/rest/index.js +102 -0
- package/dist/commands/rest/index.js.map +1 -0
- package/dist/commands/skill/index.d.ts +11 -0
- package/dist/commands/skill/index.d.ts.map +1 -0
- package/dist/commands/skill/index.js +228 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/status/index.d.ts +3 -0
- package/dist/commands/status/index.d.ts.map +1 -0
- package/dist/commands/status/index.js +59 -0
- package/dist/commands/status/index.js.map +1 -0
- package/dist/commands/storage/index.d.ts +3 -0
- package/dist/commands/storage/index.d.ts.map +1 -0
- package/dist/commands/storage/index.js +400 -0
- package/dist/commands/storage/index.js.map +1 -0
- package/dist/commands/tenant/index.d.ts +19 -0
- package/dist/commands/tenant/index.d.ts.map +1 -0
- package/dist/commands/tenant/index.js +667 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/commands/whoami/index.d.ts +3 -0
- package/dist/commands/whoami/index.d.ts.map +1 -0
- package/dist/commands/whoami/index.js +101 -0
- package/dist/commands/whoami/index.js.map +1 -0
- package/dist/credentials/commit.d.ts +38 -0
- package/dist/credentials/commit.d.ts.map +1 -0
- package/dist/credentials/commit.js +57 -0
- package/dist/credentials/commit.js.map +1 -0
- package/dist/credentials/credential-store.d.ts +86 -0
- package/dist/credentials/credential-store.d.ts.map +1 -0
- package/dist/credentials/credential-store.js +282 -0
- package/dist/credentials/credential-store.js.map +1 -0
- package/dist/credentials/env-file.d.ts +85 -0
- package/dist/credentials/env-file.d.ts.map +1 -0
- package/dist/credentials/env-file.js +193 -0
- package/dist/credentials/env-file.js.map +1 -0
- package/dist/credentials/formatter.d.ts +39 -0
- package/dist/credentials/formatter.d.ts.map +1 -0
- package/dist/credentials/formatter.js +79 -0
- package/dist/credentials/formatter.js.map +1 -0
- package/dist/credentials/index.d.ts +13 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +13 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/jwt-introspect.d.ts +39 -0
- package/dist/credentials/jwt-introspect.d.ts.map +1 -0
- package/dist/credentials/jwt-introspect.js +64 -0
- package/dist/credentials/jwt-introspect.js.map +1 -0
- package/dist/credentials/masker.d.ts +23 -0
- package/dist/credentials/masker.d.ts.map +1 -0
- package/dist/credentials/masker.js +40 -0
- package/dist/credentials/masker.js.map +1 -0
- package/dist/credentials/profile.d.ts +95 -0
- package/dist/credentials/profile.d.ts.map +1 -0
- package/dist/credentials/profile.js +207 -0
- package/dist/credentials/profile.js.map +1 -0
- package/dist/credentials/tenant-guard.d.ts +16 -0
- package/dist/credentials/tenant-guard.d.ts.map +1 -0
- package/dist/credentials/tenant-guard.js +53 -0
- package/dist/credentials/tenant-guard.js.map +1 -0
- package/dist/credentials/tty-guard.d.ts +29 -0
- package/dist/credentials/tty-guard.d.ts.map +1 -0
- package/dist/credentials/tty-guard.js +79 -0
- package/dist/credentials/tty-guard.js.map +1 -0
- package/dist/db/apply-schema.d.ts +144 -0
- package/dist/db/apply-schema.d.ts.map +1 -0
- package/dist/db/apply-schema.js +359 -0
- package/dist/db/apply-schema.js.map +1 -0
- package/dist/db/introspect.d.ts +54 -0
- package/dist/db/introspect.d.ts.map +1 -0
- package/dist/db/introspect.js +140 -0
- package/dist/db/introspect.js.map +1 -0
- package/dist/db/sql-file.d.ts +104 -0
- package/dist/db/sql-file.d.ts.map +1 -0
- package/dist/db/sql-file.js +584 -0
- package/dist/db/sql-file.js.map +1 -0
- package/dist/instance/provision.d.ts +89 -0
- package/dist/instance/provision.d.ts.map +1 -0
- package/dist/instance/provision.js +139 -0
- package/dist/instance/provision.js.map +1 -0
- package/dist/instance/zero-store.d.ts +47 -0
- package/dist/instance/zero-store.d.ts.map +1 -0
- package/dist/instance/zero-store.js +91 -0
- package/dist/instance/zero-store.js.map +1 -0
- package/dist/instance/zero-whitelist.d.ts +39 -0
- package/dist/instance/zero-whitelist.d.ts.map +1 -0
- package/dist/instance/zero-whitelist.js +67 -0
- package/dist/instance/zero-whitelist.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +69 -0
- package/dist/main.js.map +1 -0
- package/dist/skill/agents-md.d.ts +25 -0
- package/dist/skill/agents-md.d.ts.map +1 -0
- package/dist/skill/agents-md.js +62 -0
- package/dist/skill/agents-md.js.map +1 -0
- package/dist/skill/assets.d.ts +38 -0
- package/dist/skill/assets.d.ts.map +1 -0
- package/dist/skill/assets.js +111 -0
- package/dist/skill/assets.js.map +1 -0
- package/dist/skill/hint.d.ts +39 -0
- package/dist/skill/hint.d.ts.map +1 -0
- package/dist/skill/hint.js +109 -0
- package/dist/skill/hint.js.map +1 -0
- package/dist/skill/hosts.d.ts +45 -0
- package/dist/skill/hosts.d.ts.map +1 -0
- package/dist/skill/hosts.js +96 -0
- package/dist/skill/hosts.js.map +1 -0
- package/dist/skill/installer.d.ts +100 -0
- package/dist/skill/installer.d.ts.map +1 -0
- package/dist/skill/installer.js +241 -0
- package/dist/skill/installer.js.map +1 -0
- package/dist/skill/ownership.d.ts +35 -0
- package/dist/skill/ownership.d.ts.map +1 -0
- package/dist/skill/ownership.js +52 -0
- package/dist/skill/ownership.js.map +1 -0
- package/dist/tenant/bundle.d.ts +66 -0
- package/dist/tenant/bundle.d.ts.map +1 -0
- package/dist/tenant/bundle.js +132 -0
- package/dist/tenant/bundle.js.map +1 -0
- package/dist/tenant/guide.d.ts +50 -0
- package/dist/tenant/guide.d.ts.map +1 -0
- package/dist/tenant/guide.js +152 -0
- package/dist/tenant/guide.js.map +1 -0
- package/dist/tenant/probe.d.ts +65 -0
- package/dist/tenant/probe.d.ts.map +1 -0
- package/dist/tenant/probe.js +159 -0
- package/dist/tenant/probe.js.map +1 -0
- package/dist/tenant/verify.d.ts +37 -0
- package/dist/tenant/verify.d.ts.map +1 -0
- package/dist/tenant/verify.js +132 -0
- package/dist/tenant/verify.js.map +1 -0
- package/dist/version.d.ts +29 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +65 -0
- package/dist/version.js.map +1 -0
- package/package.json +63 -3
- package/skills/pxbaas-app-spec/SKILL.md +165 -0
- package/skills/pxbaas-app-spec/references/deploy-options.md +158 -0
- package/skills/pxbaas-app-spec/references/guardrails-pitfalls.md +89 -0
- package/skills/pxbaas-app-spec/references/runtime-contract.md +151 -0
- package/skills/pxbaas-app-spec/references/ssr-session.md +121 -0
- package/skills/pxbaas-app-spec/references/templates-examples.md +311 -0
- package/skills/pxbaas-cli/SKILL.md +186 -0
- package/skills/pxbaas-cli/references/api-reference.md +68 -0
- package/skills/pxbaas-cli/references/app-deploy.md +186 -0
- package/skills/pxbaas-cli/references/auth-and-credentials.md +116 -0
- package/skills/pxbaas-cli/references/data-postgrest.md +101 -0
- package/skills/pxbaas-cli/references/db-and-meta.md +102 -0
- package/skills/pxbaas-cli/references/edge-functions.md +71 -0
- package/skills/pxbaas-cli/references/multi-tenant-apps.md +138 -0
- package/skills/pxbaas-cli/references/provision.md +101 -0
- package/skills/pxbaas-cli/references/safety-and-two-phase.md +78 -0
- package/skills/pxbaas-cli/references/storage.md +61 -0
- package/skills/pxbaas-cli/references/tenant-admin.md +122 -0
- package/skills/pxbaas-cli/references/troubleshooting.md +76 -0
- package/templates/webapp/api/index.ts +55 -0
- package/templates/webapp/csr-bff/README.md +81 -0
- package/templates/webapp/csr-bff/backend/index.ts +168 -0
- package/templates/webapp/csr-bff/db/rls.json +13 -0
- package/templates/webapp/csr-bff/db/schema.sql +49 -0
- package/templates/webapp/csr-bff/frontend/dist/admin.html +101 -0
- package/templates/webapp/csr-bff/frontend/dist/article.html +44 -0
- package/templates/webapp/csr-bff/frontend/dist/blog.js +206 -0
- package/templates/webapp/csr-bff/frontend/dist/blogger.html +53 -0
- package/templates/webapp/csr-bff/frontend/dist/index.html +70 -0
- package/templates/webapp/csr-bff/frontend/dist/login.html +56 -0
- package/templates/webapp/csr-bff/frontend/dist/profile.html +59 -0
- package/templates/webapp/csr-bff/frontend/dist/signup.html +78 -0
- package/templates/webapp/csr-bff/frontend/dist/style.css +27 -0
- package/templates/webapp/manifest.json +419 -0
- package/templates/webapp/mpa/about.html +29 -0
- package/templates/webapp/mpa/app.js +42 -0
- package/templates/webapp/mpa/index.html +42 -0
- package/templates/webapp/mpa/index.ts +60 -0
- package/templates/webapp/mpa/style.css +42 -0
- package/templates/webapp/react-vite/frontend/index.html +12 -0
- package/templates/webapp/react-vite/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite/frontend/package.json +23 -0
- package/templates/webapp/react-vite/frontend/src/App.tsx +34 -0
- package/templates/webapp/react-vite/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite/frontend/src/style.css +46 -0
- package/templates/webapp/react-vite/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite/frontend/vite.config.ts +10 -0
- package/templates/webapp/react-vite-hono/backend/index.ts +38 -0
- package/templates/webapp/react-vite-hono/frontend/index.html +12 -0
- package/templates/webapp/react-vite-hono/frontend/package-lock.json +1826 -0
- package/templates/webapp/react-vite-hono/frontend/package.json +23 -0
- package/templates/webapp/react-vite-hono/frontend/src/App.tsx +47 -0
- package/templates/webapp/react-vite-hono/frontend/src/main.tsx +13 -0
- package/templates/webapp/react-vite-hono/frontend/src/style.css +66 -0
- package/templates/webapp/react-vite-hono/frontend/tsconfig.json +20 -0
- package/templates/webapp/react-vite-hono/frontend/vite.config.ts +10 -0
- package/templates/webapp/spa/index.ts +119 -0
- package/templates/webapp/ssr-auth/backend/index.ts +133 -0
- package/templates/webapp/ssr-auth/frontend/dist/index.html +15 -0
- package/templates/webapp/ssr-blog/README.md +111 -0
- package/templates/webapp/ssr-blog/backend/index.ts +764 -0
- package/templates/webapp/ssr-blog/db/rls.json +13 -0
- package/templates/webapp/ssr-blog/db/schema.sql +51 -0
- package/templates/webapp/ssr-blog/frontend/dist/index.html +39 -0
- package/templates/webapp/ssr-frameworks/README.md +64 -0
- package/templates/webapp/ssr-frameworks/backend/index.ts +241 -0
- package/templates/webapp/ssr-frameworks/frontend/dist/index.html +31 -0
- package/templates/webapp/ssr-hono/backend/index.ts +111 -0
- package/templates/webapp/ssr-hono/frontend/dist/index.html +12 -0
- package/templates/webapp/ssr-shop/README.md +80 -0
- package/templates/webapp/ssr-shop/backend/index.ts +491 -0
- package/templates/webapp/ssr-shop/db/rls.json +16 -0
- package/templates/webapp/ssr-shop/db/schema.sql +90 -0
- package/templates/webapp/ssr-shop/frontend/dist/index.html +12 -0
- package/templates/webapp/vanilla-static/frontend/dist/app.js +6 -0
- package/templates/webapp/vanilla-static/frontend/dist/index.html +19 -0
- package/templates/webapp/vanilla-static/frontend/dist/style.css +43 -0
|
@@ -0,0 +1,584 @@
|
|
|
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
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Multi-tenant schema handling (tenant self-service DDL via /api/tenant-ddl)
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
/**
|
|
171
|
+
* Multi-tenant variant of {@link substituteSchema}: DROP the `__SCHEMA__`.
|
|
172
|
+
* qualifier entirely instead of filling it in. The tenant-ddl connection is
|
|
173
|
+
* already bound to the tenant's own database, and cross-schema fully-qualified
|
|
174
|
+
* names are denied by GRANT / the server pre-check — so `__SCHEMA__`.`t` must
|
|
175
|
+
* become just `t`. The CLI never knows the tenant's real db_name (the resolver
|
|
176
|
+
* does not expose it), so de-qualifying is the only safe substitution.
|
|
177
|
+
*/
|
|
178
|
+
export function substituteSchemaForTenant(sql) {
|
|
179
|
+
return sql.replace(/`?__SCHEMA__`?\s*\.\s*/g, "");
|
|
180
|
+
}
|
|
181
|
+
/** Central-registry RLS INSERT recognizers (allow optional backticks / IGNORE). */
|
|
182
|
+
const RLS_TABLES_RE = /^\s*INSERT\s+(?:IGNORE\s+)?INTO\s+`?supabase`?\s*\.\s*`?_mysqlrest_rls_tables`?/i;
|
|
183
|
+
const RLS_POLICIES_RE = /^\s*INSERT\s+(?:IGNORE\s+)?INTO\s+`?supabase`?\s*\.\s*`?_mysqlrest_rls_policies`?/i;
|
|
184
|
+
/**
|
|
185
|
+
* Split statements into central-registry RLS INSERTs vs. plain DDL/DML. In
|
|
186
|
+
* multi-tenant mode the RLS INSERTs MUST be diverted to the structured
|
|
187
|
+
* `/api/tenant-ddl/rls/*` endpoints (the tenant account has no GRANT on the
|
|
188
|
+
* shared `supabase` database, so a raw INSERT would be denied).
|
|
189
|
+
*/
|
|
190
|
+
export function partitionStatements(statements) {
|
|
191
|
+
const rlsTableInserts = [];
|
|
192
|
+
const rlsPolicyInserts = [];
|
|
193
|
+
const plain = [];
|
|
194
|
+
for (const s of statements) {
|
|
195
|
+
if (RLS_TABLES_RE.test(s))
|
|
196
|
+
rlsTableInserts.push(s);
|
|
197
|
+
else if (RLS_POLICIES_RE.test(s))
|
|
198
|
+
rlsPolicyInserts.push(s);
|
|
199
|
+
else
|
|
200
|
+
plain.push(s);
|
|
201
|
+
}
|
|
202
|
+
return { rlsTableInserts, rlsPolicyInserts, plain };
|
|
203
|
+
}
|
|
204
|
+
/** Thrown when an RLS INSERT does not match the constrained shape we can parse. */
|
|
205
|
+
export class SqlParseError extends Error {
|
|
206
|
+
constructor(message) {
|
|
207
|
+
super(message);
|
|
208
|
+
this.name = "SqlParseError";
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/** Extract a balanced `(...)` group starting at `s[open] === '('`. */
|
|
212
|
+
function extractParenGroup(s, open) {
|
|
213
|
+
let depth = 0;
|
|
214
|
+
let inSingle = false;
|
|
215
|
+
let inDouble = false;
|
|
216
|
+
let inBacktick = false;
|
|
217
|
+
for (let i = open; i < s.length; i++) {
|
|
218
|
+
const c = s[i];
|
|
219
|
+
const next = i + 1 < s.length ? s[i + 1] : "";
|
|
220
|
+
if (inSingle) {
|
|
221
|
+
if (c === "'" && next === "'") {
|
|
222
|
+
i++;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (c === "'")
|
|
226
|
+
inSingle = false;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (inDouble) {
|
|
230
|
+
if (c === '"' && next === '"') {
|
|
231
|
+
i++;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (c === '"')
|
|
235
|
+
inDouble = false;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (inBacktick) {
|
|
239
|
+
if (c === "`")
|
|
240
|
+
inBacktick = false;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (c === "'") {
|
|
244
|
+
inSingle = true;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (c === '"') {
|
|
248
|
+
inDouble = true;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (c === "`") {
|
|
252
|
+
inBacktick = true;
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (c === "(")
|
|
256
|
+
depth++;
|
|
257
|
+
else if (c === ")") {
|
|
258
|
+
depth--;
|
|
259
|
+
if (depth === 0)
|
|
260
|
+
return { content: s.slice(open + 1, i), end: i + 1 };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
throw new SqlParseError("unbalanced parentheses in statement");
|
|
264
|
+
}
|
|
265
|
+
/** Split on top-level commas, ignoring separators inside quotes/backticks/parens. */
|
|
266
|
+
function splitTopLevel(s) {
|
|
267
|
+
const out = [];
|
|
268
|
+
let depth = 0;
|
|
269
|
+
let inSingle = false;
|
|
270
|
+
let inDouble = false;
|
|
271
|
+
let inBacktick = false;
|
|
272
|
+
let cur = "";
|
|
273
|
+
for (let i = 0; i < s.length; i++) {
|
|
274
|
+
const c = s[i];
|
|
275
|
+
const next = i + 1 < s.length ? s[i + 1] : "";
|
|
276
|
+
if (inSingle) {
|
|
277
|
+
cur += c;
|
|
278
|
+
if (c === "'" && next === "'") {
|
|
279
|
+
cur += next;
|
|
280
|
+
i++;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (c === "'")
|
|
284
|
+
inSingle = false;
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
if (inDouble) {
|
|
288
|
+
cur += c;
|
|
289
|
+
if (c === '"' && next === '"') {
|
|
290
|
+
cur += next;
|
|
291
|
+
i++;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (c === '"')
|
|
295
|
+
inDouble = false;
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (inBacktick) {
|
|
299
|
+
cur += c;
|
|
300
|
+
if (c === "`")
|
|
301
|
+
inBacktick = false;
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
if (c === "'") {
|
|
305
|
+
inSingle = true;
|
|
306
|
+
cur += c;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (c === '"') {
|
|
310
|
+
inDouble = true;
|
|
311
|
+
cur += c;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (c === "`") {
|
|
315
|
+
inBacktick = true;
|
|
316
|
+
cur += c;
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (c === "(" || c === "[") {
|
|
320
|
+
depth++;
|
|
321
|
+
cur += c;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (c === ")" || c === "]") {
|
|
325
|
+
depth--;
|
|
326
|
+
cur += c;
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
if (c === "," && depth === 0) {
|
|
330
|
+
out.push(cur);
|
|
331
|
+
cur = "";
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
cur += c;
|
|
335
|
+
}
|
|
336
|
+
if (cur.trim() !== "")
|
|
337
|
+
out.push(cur);
|
|
338
|
+
return out.map((x) => x.trim()).filter((x) => x !== "");
|
|
339
|
+
}
|
|
340
|
+
function parseLiteral(tok) {
|
|
341
|
+
const t = tok.trim();
|
|
342
|
+
if (/^NULL$/i.test(t))
|
|
343
|
+
return null;
|
|
344
|
+
if (/^TRUE$/i.test(t))
|
|
345
|
+
return true;
|
|
346
|
+
if (/^FALSE$/i.test(t))
|
|
347
|
+
return false;
|
|
348
|
+
if (t.length >= 2 && t.startsWith("'") && t.endsWith("'"))
|
|
349
|
+
return t.slice(1, -1).replace(/''/g, "'");
|
|
350
|
+
if (t.length >= 2 && t.startsWith('"') && t.endsWith('"'))
|
|
351
|
+
return t.slice(1, -1).replace(/""/g, '"');
|
|
352
|
+
if (/^-?\d+$/.test(t))
|
|
353
|
+
return parseInt(t, 10);
|
|
354
|
+
if (/^-?\d+\.\d+$/.test(t))
|
|
355
|
+
return parseFloat(t);
|
|
356
|
+
return t;
|
|
357
|
+
}
|
|
358
|
+
/** Parse `INSERT ... (<cols>) VALUES (<tuple>)[, (<tuple>)...]` into rows. */
|
|
359
|
+
function parseInsertColumnsAndTuples(stmt) {
|
|
360
|
+
const open = stmt.indexOf("(");
|
|
361
|
+
if (open === -1)
|
|
362
|
+
throw new SqlParseError("cannot locate the column list");
|
|
363
|
+
const colGroup = extractParenGroup(stmt, open);
|
|
364
|
+
const columns = splitTopLevel(colGroup.content).map((c) => c.replace(/`/g, "").trim().toLowerCase());
|
|
365
|
+
const rest = stmt.slice(colGroup.end);
|
|
366
|
+
const vm = /\bVALUES\b/i.exec(rest);
|
|
367
|
+
if (!vm)
|
|
368
|
+
throw new SqlParseError("cannot locate the VALUES keyword");
|
|
369
|
+
let idx = colGroup.end + vm.index + vm[0].length;
|
|
370
|
+
const tuples = [];
|
|
371
|
+
while (idx < stmt.length) {
|
|
372
|
+
while (idx < stmt.length && /[\s,]/.test(stmt[idx]))
|
|
373
|
+
idx++;
|
|
374
|
+
if (idx >= stmt.length || stmt[idx] !== "(")
|
|
375
|
+
break; // e.g. trailing ON DUPLICATE KEY
|
|
376
|
+
const g = extractParenGroup(stmt, idx);
|
|
377
|
+
tuples.push(splitTopLevel(g.content).map(parseLiteral));
|
|
378
|
+
idx = g.end;
|
|
379
|
+
}
|
|
380
|
+
if (tuples.length === 0)
|
|
381
|
+
throw new SqlParseError("no VALUES tuples found");
|
|
382
|
+
return { columns, tuples };
|
|
383
|
+
}
|
|
384
|
+
function zipRow(columns, tuple) {
|
|
385
|
+
if (columns.length !== tuple.length) {
|
|
386
|
+
throw new SqlParseError(`column/value count mismatch (${columns.length} columns vs ${tuple.length} values)`);
|
|
387
|
+
}
|
|
388
|
+
const row = {};
|
|
389
|
+
columns.forEach((c, i) => { row[c] = tuple[i]; });
|
|
390
|
+
return row;
|
|
391
|
+
}
|
|
392
|
+
function asString(v) {
|
|
393
|
+
return typeof v === "string" ? v : v === null ? null : String(v);
|
|
394
|
+
}
|
|
395
|
+
function asBool(v, def) {
|
|
396
|
+
if (v === null || v === undefined)
|
|
397
|
+
return def;
|
|
398
|
+
if (typeof v === "boolean")
|
|
399
|
+
return v;
|
|
400
|
+
if (typeof v === "number")
|
|
401
|
+
return v !== 0;
|
|
402
|
+
const s = String(v).toLowerCase();
|
|
403
|
+
if (s === "true" || s === "1")
|
|
404
|
+
return true;
|
|
405
|
+
if (s === "false" || s === "0")
|
|
406
|
+
return false;
|
|
407
|
+
return def;
|
|
408
|
+
}
|
|
409
|
+
const RLS_COMMANDS = ["ALL", "SELECT", "INSERT", "UPDATE", "DELETE"];
|
|
410
|
+
function guidance(table, e) {
|
|
411
|
+
const detail = e instanceof Error ? e.message : String(e);
|
|
412
|
+
throw new SqlParseError(`Cannot parse the RLS INSERT for supabase.${table}: ${detail}. ` +
|
|
413
|
+
`Use a declarative db/rls.json for this app instead of embedding RLS INSERTs in schema.sql.`);
|
|
414
|
+
}
|
|
415
|
+
/** Parse one `_mysqlrest_rls_tables` INSERT into structured inputs (schema dropped). */
|
|
416
|
+
export function parseRlsTableInsert(stmt) {
|
|
417
|
+
try {
|
|
418
|
+
const { columns, tuples } = parseInsertColumnsAndTuples(stmt);
|
|
419
|
+
return tuples.map((t) => {
|
|
420
|
+
const row = zipRow(columns, t);
|
|
421
|
+
const tableName = asString(row["table_name"]);
|
|
422
|
+
if (!tableName)
|
|
423
|
+
throw new SqlParseError("missing or invalid table_name");
|
|
424
|
+
return {
|
|
425
|
+
table_name: tableName,
|
|
426
|
+
// table_schema is intentionally dropped: the server binds it to the tenant db.
|
|
427
|
+
rls_enabled: asBool(row["rls_enabled"], true),
|
|
428
|
+
rls_forced: asBool(row["rls_forced"], false),
|
|
429
|
+
};
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
catch (e) {
|
|
433
|
+
return guidance("_mysqlrest_rls_tables", e);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/** Parse one `_mysqlrest_rls_policies` INSERT into structured inputs (schema dropped). */
|
|
437
|
+
export function parseRlsPolicyInsert(stmt) {
|
|
438
|
+
try {
|
|
439
|
+
const { columns, tuples } = parseInsertColumnsAndTuples(stmt);
|
|
440
|
+
return tuples.map((t) => {
|
|
441
|
+
const row = zipRow(columns, t);
|
|
442
|
+
const tableName = asString(row["table_name"]);
|
|
443
|
+
const policyName = asString(row["policy_name"]);
|
|
444
|
+
if (!tableName)
|
|
445
|
+
throw new SqlParseError("missing or invalid table_name");
|
|
446
|
+
if (!policyName)
|
|
447
|
+
throw new SqlParseError("missing or invalid policy_name");
|
|
448
|
+
const command = (asString(row["command"]) ?? "ALL").toUpperCase();
|
|
449
|
+
if (!RLS_COMMANDS.includes(command)) {
|
|
450
|
+
throw new SqlParseError(`command must be one of ${RLS_COMMANDS.join(", ")} (got '${command}')`);
|
|
451
|
+
}
|
|
452
|
+
const role = asString(row["role_name"]);
|
|
453
|
+
return {
|
|
454
|
+
table_name: tableName,
|
|
455
|
+
policy_name: policyName,
|
|
456
|
+
role_name: role && role !== "" ? role : "*",
|
|
457
|
+
command,
|
|
458
|
+
using_expr: row["using_expr"] === undefined ? null : asString(row["using_expr"]),
|
|
459
|
+
check_expr: row["check_expr"] === undefined ? null : asString(row["check_expr"]),
|
|
460
|
+
permissive: asBool(row["permissive"], true),
|
|
461
|
+
};
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
catch (e) {
|
|
465
|
+
return guidance("_mysqlrest_rls_policies", e);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
// --- Render structured RLS back to central-registry SQL (single-tenant path) ---
|
|
469
|
+
function sqlLiteral(v) {
|
|
470
|
+
if (v === null || v === undefined)
|
|
471
|
+
return "NULL";
|
|
472
|
+
return `'${String(v).replace(/'/g, "''")}'`;
|
|
473
|
+
}
|
|
474
|
+
function sqlBoolLit(v, def) {
|
|
475
|
+
return (v ?? def) ? "1" : "0";
|
|
476
|
+
}
|
|
477
|
+
/** Render an idempotent central-registry INSERT for one RLS table toggle. */
|
|
478
|
+
export function renderRlsTableInsert(schema, input) {
|
|
479
|
+
return (`INSERT INTO supabase._mysqlrest_rls_tables (table_schema, table_name, rls_enabled, rls_forced) ` +
|
|
480
|
+
`VALUES (${sqlLiteral(schema)}, ${sqlLiteral(input.table_name)}, ` +
|
|
481
|
+
`${sqlBoolLit(input.rls_enabled, true)}, ${sqlBoolLit(input.rls_forced, false)}) ` +
|
|
482
|
+
`ON DUPLICATE KEY UPDATE rls_enabled = VALUES(rls_enabled), rls_forced = VALUES(rls_forced)`);
|
|
483
|
+
}
|
|
484
|
+
/** Render an idempotent central-registry INSERT for one RLS policy. */
|
|
485
|
+
export function renderRlsPolicyInsert(schema, input) {
|
|
486
|
+
const role = input.role_name ?? "*";
|
|
487
|
+
const command = (input.command ?? "ALL").toString().toUpperCase();
|
|
488
|
+
return (`INSERT INTO supabase._mysqlrest_rls_policies ` +
|
|
489
|
+
`(table_schema, table_name, policy_name, role_name, command, using_expr, check_expr, permissive) ` +
|
|
490
|
+
`VALUES (${sqlLiteral(schema)}, ${sqlLiteral(input.table_name)}, ${sqlLiteral(input.policy_name)}, ` +
|
|
491
|
+
`${sqlLiteral(role)}, ${sqlLiteral(command)}, ${sqlLiteral(input.using_expr ?? null)}, ` +
|
|
492
|
+
`${sqlLiteral(input.check_expr ?? null)}, ${sqlBoolLit(input.permissive, true)}) ` +
|
|
493
|
+
`ON DUPLICATE KEY UPDATE role_name = VALUES(role_name), command = VALUES(command), ` +
|
|
494
|
+
`using_expr = VALUES(using_expr), check_expr = VALUES(check_expr), permissive = VALUES(permissive)`);
|
|
495
|
+
}
|
|
496
|
+
// --- Declarative db/rls.json (preferred RLS source; see plan §5.4) ---
|
|
497
|
+
/**
|
|
498
|
+
* Extract the table names created by a schema.sql script (for `--purge-db`).
|
|
499
|
+
* Handles `CREATE TABLE [IF NOT EXISTS] [`__SCHEMA__`.]<name>` with optional
|
|
500
|
+
* backticks. Names are returned de-qualified and de-duplicated, in first-seen order.
|
|
501
|
+
*/
|
|
502
|
+
export function extractCreateTableNames(sql) {
|
|
503
|
+
const re = /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?(?:`?__SCHEMA__`?\s*\.\s*)?`?([A-Za-z0-9_]+)`?/gi;
|
|
504
|
+
const names = [];
|
|
505
|
+
let m;
|
|
506
|
+
while ((m = re.exec(sql)) !== null) {
|
|
507
|
+
const n = m[1];
|
|
508
|
+
if (n && !names.includes(n))
|
|
509
|
+
names.push(n);
|
|
510
|
+
}
|
|
511
|
+
return names;
|
|
512
|
+
}
|
|
513
|
+
const IDENT_RE = /^[a-zA-Z0-9_]+$/;
|
|
514
|
+
function requireIdent(value, field) {
|
|
515
|
+
if (typeof value !== "string" || !value || value.length > 64 || !IDENT_RE.test(value)) {
|
|
516
|
+
throw new SqlParseError(`db/rls.json: invalid ${field} (only [a-zA-Z0-9_], max 64 chars)`);
|
|
517
|
+
}
|
|
518
|
+
return value;
|
|
519
|
+
}
|
|
520
|
+
function pick(obj, ...keys) {
|
|
521
|
+
for (const k of keys)
|
|
522
|
+
if (obj[k] !== undefined)
|
|
523
|
+
return obj[k];
|
|
524
|
+
return undefined;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Parse + validate a declarative `db/rls.json`. Accepts the documented friendly
|
|
528
|
+
* keys (table/name/role/using/check/rlsEnabled/...) and their snake_case aliases,
|
|
529
|
+
* mapping them onto the driver's structured inputs. `table_schema` is NEVER read
|
|
530
|
+
* here — the execution layer decides it (single-tenant = --schema; multi-tenant =
|
|
531
|
+
* server-bound).
|
|
532
|
+
*/
|
|
533
|
+
export function parseRlsJson(text) {
|
|
534
|
+
let raw;
|
|
535
|
+
try {
|
|
536
|
+
raw = JSON.parse(text);
|
|
537
|
+
}
|
|
538
|
+
catch (e) {
|
|
539
|
+
throw new SqlParseError(`db/rls.json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
540
|
+
}
|
|
541
|
+
const root = (raw ?? {});
|
|
542
|
+
const rawTables = Array.isArray(root.tables) ? root.tables : [];
|
|
543
|
+
const rawPolicies = Array.isArray(root.policies) ? root.policies : [];
|
|
544
|
+
const tables = rawTables.map((entry) => {
|
|
545
|
+
const o = (entry ?? {});
|
|
546
|
+
const table = requireIdent(pick(o, "table", "table_name"), "tables[].table");
|
|
547
|
+
const enabled = pick(o, "rlsEnabled", "rls_enabled");
|
|
548
|
+
const forced = pick(o, "rlsForced", "rls_forced");
|
|
549
|
+
return {
|
|
550
|
+
table_name: table,
|
|
551
|
+
rls_enabled: enabled === undefined ? true : Boolean(enabled),
|
|
552
|
+
rls_forced: forced === undefined ? false : Boolean(forced),
|
|
553
|
+
};
|
|
554
|
+
});
|
|
555
|
+
const policies = rawPolicies.map((entry) => {
|
|
556
|
+
const o = (entry ?? {});
|
|
557
|
+
const table = requireIdent(pick(o, "table", "table_name"), "policies[].table");
|
|
558
|
+
const name = requireIdent(pick(o, "name", "policy_name"), "policies[].name");
|
|
559
|
+
const roleRaw = pick(o, "role", "role_name");
|
|
560
|
+
const role = roleRaw === undefined || roleRaw === null || roleRaw === "" ? "*" : String(roleRaw);
|
|
561
|
+
if (role !== "*" && !IDENT_RE.test(role)) {
|
|
562
|
+
throw new SqlParseError(`db/rls.json: policy '${name}' role must be '*' or [a-zA-Z0-9_]`);
|
|
563
|
+
}
|
|
564
|
+
const commandRaw = pick(o, "command");
|
|
565
|
+
const command = (commandRaw === undefined || commandRaw === null ? "ALL" : String(commandRaw)).toUpperCase();
|
|
566
|
+
if (!RLS_COMMANDS.includes(command)) {
|
|
567
|
+
throw new SqlParseError(`db/rls.json: policy '${name}' command must be one of ${RLS_COMMANDS.join(", ")}`);
|
|
568
|
+
}
|
|
569
|
+
const using = pick(o, "using", "using_expr");
|
|
570
|
+
const check = pick(o, "check", "check_expr");
|
|
571
|
+
const permissive = pick(o, "permissive");
|
|
572
|
+
return {
|
|
573
|
+
table_name: table,
|
|
574
|
+
policy_name: name,
|
|
575
|
+
role_name: role,
|
|
576
|
+
command,
|
|
577
|
+
using_expr: using === undefined || using === null ? null : String(using),
|
|
578
|
+
check_expr: check === undefined || check === null ? null : String(check),
|
|
579
|
+
permissive: permissive === undefined ? true : Boolean(permissive),
|
|
580
|
+
};
|
|
581
|
+
});
|
|
582
|
+
return { tables, policies };
|
|
583
|
+
}
|
|
584
|
+
//# 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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"}
|