@nodii/db-rls 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/bin/migrate-gen.mjs +11 -0
  2. package/dist/auth-schema.d.ts +207 -1
  3. package/dist/auth-schema.d.ts.map +1 -1
  4. package/dist/auth-schema.js +331 -4
  5. package/dist/auth-schema.js.map +1 -1
  6. package/dist/context.d.ts +31 -8
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +103 -24
  9. package/dist/context.js.map +1 -1
  10. package/dist/drizzle-client.d.ts +17 -5
  11. package/dist/drizzle-client.d.ts.map +1 -1
  12. package/dist/drizzle-client.js +19 -18
  13. package/dist/drizzle-client.js.map +1 -1
  14. package/dist/fence-cli.d.ts +21 -0
  15. package/dist/fence-cli.d.ts.map +1 -0
  16. package/dist/fence-cli.js +191 -0
  17. package/dist/fence-cli.js.map +1 -0
  18. package/dist/index.d.ts +7 -4
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +31 -7
  21. package/dist/index.js.map +1 -1
  22. package/dist/postgres-js-client.d.ts +17 -10
  23. package/dist/postgres-js-client.d.ts.map +1 -1
  24. package/dist/postgres-js-client.js +19 -21
  25. package/dist/postgres-js-client.js.map +1 -1
  26. package/dist/rls-policy-gen.d.ts +43 -27
  27. package/dist/rls-policy-gen.d.ts.map +1 -1
  28. package/dist/rls-policy-gen.js +40 -15
  29. package/dist/rls-policy-gen.js.map +1 -1
  30. package/dist/rls-policy.d.ts +11 -1
  31. package/dist/rls-policy.d.ts.map +1 -1
  32. package/dist/rls-policy.js +31 -4
  33. package/dist/rls-policy.js.map +1 -1
  34. package/dist/tenant-fence-gate.d.ts +54 -0
  35. package/dist/tenant-fence-gate.d.ts.map +1 -0
  36. package/dist/tenant-fence-gate.js +291 -0
  37. package/dist/tenant-fence-gate.js.map +1 -0
  38. package/dist/tenant-fence.d.ts +165 -0
  39. package/dist/tenant-fence.d.ts.map +1 -0
  40. package/dist/tenant-fence.js +542 -0
  41. package/dist/tenant-fence.js.map +1 -0
  42. package/dist/types.d.ts +18 -0
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js +22 -0
  45. package/dist/types.js.map +1 -1
  46. package/dist/verify-rls-cli.d.ts.map +1 -1
  47. package/dist/verify-rls-cli.js +86 -10
  48. package/dist/verify-rls-cli.js.map +1 -1
  49. package/dist/verify-rls.d.ts +26 -5
  50. package/dist/verify-rls.d.ts.map +1 -1
  51. package/dist/verify-rls.js +73 -5
  52. package/dist/verify-rls.js.map +1 -1
  53. package/package.json +2 -2
@@ -6,9 +6,55 @@
6
6
  // deliverable — this is the optional bin mirror of migrate-gen's CLI.
7
7
  //
8
8
  // Connection string comes from `--db <url>` or the `DATABASE_URL` /
9
- // `DB_RLS_PG_URL` env var (in that order). `pg` is an optional peer dep;
10
- // the CLI imports it lazily so importing the library does not require it.
9
+ // `DB_RLS_PG_URL` env var (in that order).
10
+ //
11
+ // DRIVER (0.12.0): both `pg` and `postgres` are OPTIONAL peer deps and both
12
+ // are imported LAZILY, so importing the library requires neither and the CLI
13
+ // runs on whichever the host service actually installed. Before 0.12.0 this
14
+ // path did an unconditional `await import("pg")` — and most Nodii services
15
+ // run postgres-js and have no `pg` at all (finance, billing, auth all lack
16
+ // it), so `nodii-db-rls verify-rls` threw `Cannot find package 'pg'` for the
17
+ // majority of the fleet. That, plus the node-pg-only `verifyRls` signature,
18
+ // is why the function had zero adoption while five services hand-rolled the
19
+ // same catalog query in tests.
20
+ //
21
+ // Preference order: `postgres` (postgres-js) FIRST, since it is the fleet
22
+ // default, then `pg`. `--driver pg|postgres-js` pins it explicitly.
11
23
  import { RlsCoverageError, verifyRls } from "./verify-rls.js";
24
+ /**
25
+ * Open a connection with whichever supported driver is installed.
26
+ * Returns `null` (with the attempted-driver list) when neither resolves, so
27
+ * the caller can emit an actionable usage error instead of a raw MODULE_NOT_-
28
+ * FOUND.
29
+ */
30
+ async function connect(connectionString, pinned) {
31
+ const order = pinned ? [pinned] : ["postgres-js", "pg"];
32
+ const failed = [];
33
+ for (const driver of order) {
34
+ try {
35
+ if (driver === "postgres-js") {
36
+ const mod = (await import("postgres"));
37
+ const sql = mod.default(connectionString, { max: 1 });
38
+ return {
39
+ pool: sql,
40
+ close: () => sql.end(),
41
+ driver,
42
+ };
43
+ }
44
+ const { Pool } = await import("pg");
45
+ const pool = new Pool({ connectionString, max: 1 });
46
+ return {
47
+ pool: pool,
48
+ close: () => pool.end(),
49
+ driver,
50
+ };
51
+ }
52
+ catch (err) {
53
+ failed.push(`${driver}: ${err instanceof Error ? err.message : String(err)}`);
54
+ }
55
+ }
56
+ return { failed };
57
+ }
12
58
  function splitList(value) {
13
59
  if (!value)
14
60
  return [];
@@ -17,6 +63,15 @@ function splitList(value) {
17
63
  .map((s) => s.trim())
18
64
  .filter((s) => s.length > 0);
19
65
  }
66
+ /**
67
+ * Invariant head of the "no usable driver" message. Split out so the message
68
+ * is ONE template literal (biome `lint/style/useTemplate` rejects
69
+ * `"literal" + template`) without a 200-column line. Literal-to-literal `+`
70
+ * is fine — only concatenating with an interpolation trips the rule. The
71
+ * trailing space is load-bearing: `--driver.` continues this sentence.
72
+ */
73
+ const NO_DRIVER_DETAIL = "verify-rls: no usable Postgres driver. Install `postgres` (postgres-js, " +
74
+ "the Nodii default) or `pg` (node-postgres), or pin one with ";
20
75
  /**
21
76
  * Parses argv (without the leading `verify-rls` token) and runs the
22
77
  * coverage check. Returns an exit code + message rather than calling
@@ -34,6 +89,7 @@ export async function runVerifyRlsCli(args) {
34
89
  let refs;
35
90
  let schema;
36
91
  let dbUrl;
92
+ let driver;
37
93
  for (let i = 0; i < args.length; i++) {
38
94
  const a = args[i];
39
95
  if (a === "--tables" && i + 1 < args.length)
@@ -44,6 +100,16 @@ export async function runVerifyRlsCli(args) {
44
100
  schema = args[++i];
45
101
  else if (a === "--db" && i + 1 < args.length)
46
102
  dbUrl = args[++i];
103
+ else if (a === "--driver" && i + 1 < args.length) {
104
+ const v = args[++i];
105
+ if (v !== "pg" && v !== "postgres-js") {
106
+ return {
107
+ code: 2,
108
+ message: `verify-rls: --driver must be \`pg\` or \`postgres-js\` (got \`${v}\`).`,
109
+ };
110
+ }
111
+ driver = v;
112
+ }
47
113
  else if (a === "--help" || a === "-h") {
48
114
  return { code: 0, message: usage() };
49
115
  }
@@ -59,19 +125,24 @@ export async function runVerifyRlsCli(args) {
59
125
  message: "verify-rls: no connection string — pass --db <url> or set DATABASE_URL / DB_RLS_PG_URL.",
60
126
  };
61
127
  }
62
- // Lazy-import pg (optional peer dep). Keeps the library importable
63
- // without pg installed; only the CLI path requires it.
64
- const { Pool } = await import("pg");
65
- const pool = new Pool({ connectionString, max: 1 });
128
+ // Lazy-import whichever driver the host service installed (both are
129
+ // OPTIONAL peer deps). Keeps the library importable with neither.
130
+ const conn = await connect(connectionString, driver);
131
+ if ("failed" in conn) {
132
+ return {
133
+ code: 2,
134
+ message: `${NO_DRIVER_DETAIL}--driver.\nAttempted:\n ${conn.failed.join("\n ")}`,
135
+ };
136
+ }
66
137
  try {
67
- await verifyRls(pool, {
138
+ await verifyRls(conn.pool, {
68
139
  requiredTables,
69
140
  schema,
70
141
  referenceTables: splitList(refs),
71
142
  });
72
143
  return {
73
144
  code: 0,
74
- message: `verify-rls: OK — ${requiredTables.length} RLS-required table(s) covered.`,
145
+ message: `verify-rls: OK — ${requiredTables.length} RLS-required table(s) covered (driver: ${conn.driver}).`,
75
146
  };
76
147
  }
77
148
  catch (err) {
@@ -81,11 +152,11 @@ export async function runVerifyRlsCli(args) {
81
152
  throw err;
82
153
  }
83
154
  finally {
84
- await pool.end().catch(() => { });
155
+ await conn.close().catch(() => { });
85
156
  }
86
157
  }
87
158
  function usage() {
88
- return `usage: verify-rls --tables <a,b,c> [--ref <x,y>] [--schema <name>] [--db <url>]
159
+ return `usage: verify-rls --tables <a,b,c> [--ref <x,y>] [--schema <name>] [--db <url>] [--driver pg|postgres-js]
89
160
 
90
161
  Verifies every --tables relation has ROW LEVEL SECURITY enabled
91
162
  (pg_class.relrowsecurity = true), exempting any --ref reference table
@@ -93,6 +164,11 @@ Verifies every --tables relation has ROW LEVEL SECURITY enabled
93
164
  any RLS-required table is missing RLS.
94
165
 
95
166
  Connection string: --db <url>, else DATABASE_URL, else DB_RLS_PG_URL.
167
+ Driver: auto-detected — postgres-js (\`postgres\`) preferred, then \`pg\`.
168
+ Both are optional peer deps; pin one with --driver.
169
+
170
+ Wire it as a db:setup gate, AFTER migrations apply:
171
+ "db:setup": "... && nodii-db-rls verify-rls --tables \\"$(...)\\""
96
172
 
97
173
  Spec: @nodii/db-rls 08-rls § A1 (RLS on every tenant-scoped table).`;
98
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"verify-rls-cli.js","sourceRoot":"","sources":["../src/verify-rls-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify-rls-cli.js","sourceRoot":"","sources":["../src/verify-rls-cli.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AACxE,2EAA2E;AAC3E,sEAAsE;AACtE,EAAE;AACF,oEAAoE;AACpE,2CAA2C;AAC3C,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,4EAA4E;AAC5E,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,4EAA4E;AAC5E,4EAA4E;AAC5E,+BAA+B;AAC/B,EAAE;AACF,0EAA0E;AAC1E,oEAAoE;AAEpE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU9D;;;;;GAKG;AACH,KAAK,UAAU,OAAO,CACpB,gBAAwB,EACxB,MAA6B;IAE7B,MAAM,KAAK,GAAgB,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACrE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAWpC,CAAC;gBACF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtD,OAAO;oBACL,IAAI,EAAE,GAAsC;oBAC5C,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE;oBACtB,MAAM;iBACP,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO;gBACL,IAAI,EAAE,IAAkD;gBACxD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACjE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AASD,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,gBAAgB,GACpB,0EAA0E;IAC1E,8DAA8D,CAAC;AAEjE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAuB;IAEvB,IAAI,MAA0B,CAAC;IAC/B,IAAI,IAAwB,CAAC;IAC7B,IAAI,MAA0B,CAAC;IAC/B,IAAI,KAAyB,CAAC;IAC9B,IAAI,MAA6B,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAChE,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;gBACtC,OAAO;oBACL,IAAI,EAAE,CAAC;oBACP,OAAO,EAAE,iEAAiE,CAAC,MAAM;iBAClF,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,gBAAgB,GACpB,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,CAAC;YACP,OAAO,EACL,yFAAyF;SAC5F,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,kEAAkE;IAClE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,GAAG,gBAAgB,4BAA4B,IAAI,CAAC,MAAM,CAAC,IAAI,CACtE,MAAM,CACP,EAAE;SACJ,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;YACzB,cAAc;YACd,MAAM;YACN,eAAe,EAAE,SAAS,CAAC,IAAI,CAAC;SACjC,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,oBAAoB,cAAc,CAAC,MAAM,2CAA2C,IAAI,CAAC,MAAM,IAAI;SAC7G,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3C,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,KAAK;IACZ,OAAO;;;;;;;;;;;;;;oEAc2D,CAAC;AACrE,CAAC"}
@@ -1,13 +1,20 @@
1
1
  import { DbRlsError } from "./types.js";
2
- /** Minimal query surface for the preflight catalog read. `pg.Pool` and
3
- * `pg.PoolClient` both satisfy this; `PgClientPool` exposes `.rawPool`.
4
- * We deliberately do NOT reuse the tx-bound `PgPool` — the preflight is a
5
- * single read, not a GUC-scoped transaction. */
2
+ /** node-postgres-shaped query surface (`pg.Pool` / `pg.PoolClient` /
3
+ * `PgClientPool.rawPool`). We deliberately do NOT reuse the tx-bound
4
+ * `PgPool` — the preflight is a single read, not a GUC-scoped transaction. */
6
5
  export interface RlsQuerier {
7
6
  query<R = unknown>(sql: string, params?: readonly unknown[]): Promise<{
8
7
  rows: R[];
9
8
  }>;
10
9
  }
10
+ /** postgres-js (porsager) query surface — `sql.unsafe(text, params)` resolves
11
+ * to a bare row ARRAY, not a `{ rows }` envelope. This is the shape every
12
+ * postgres-js Nodii service already has in hand. */
13
+ export interface RlsQuerierPostgresJs {
14
+ unsafe<R = unknown>(sql: string, params?: readonly unknown[]): Promise<R[]>;
15
+ }
16
+ /** Either supported driver shape. */
17
+ export type AnyRlsQuerier = RlsQuerier | RlsQuerierPostgresJs;
11
18
  /** A predicate that returns `true` when `table` is a reference table
12
19
  * (GRANT-controlled, NO RLS by design — § 7.6) and must therefore be
13
20
  * EXEMPT from the RLS-coverage check. `table` is the table name exactly
@@ -88,6 +95,20 @@ export declare class RlsCoverageError extends DbRlsError {
88
95
  * The query is a single read against `pg_class` joined to `pg_namespace`
89
96
  * — read-only, no GUCs, no writes. Run it from a migration / `db:setup`
90
97
  * gate against any pool (typically the owner/admin pool).
98
+ *
99
+ * `pool` accepts EITHER driver shape (0.12.0): node-postgres
100
+ * (`query(sql, params) → { rows }`) or postgres-js
101
+ * (`unsafe(sql, params) → rows[]`). Wire it into `db:setup` after
102
+ * migrations apply:
103
+ *
104
+ * ```ts
105
+ * // postgres-js service (the common Nodii case)
106
+ * import { verifyRls } from "@nodii/db-rls";
107
+ * await verifyRls(getPools().owner.sql, {
108
+ * requiredTables: ["finance_journal_entries", "finance_ledger_entries"],
109
+ * referenceTables: ["currency_codes"], // § 7.6 — GRANT-controlled, no RLS
110
+ * });
111
+ * ```
91
112
  */
92
- export declare function verifyRls(pool: RlsQuerier, opts: VerifyRlsOpts): Promise<void>;
113
+ export declare function verifyRls(pool: AnyRlsQuerier, opts: VerifyRlsOpts): Promise<void>;
93
114
  //# sourceMappingURL=verify-rls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify-rls.d.ts","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;iDAGiD;AACjD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,CAAC,GAAG,OAAO,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CAC3B;AAED;;;mEAGmE;AACnE,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B;;0CAEsC;IACtC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;oEAIgE;IAChE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;sCAGkC;IAClC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C;;4EAEwE;IACxE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;yEAWqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;0BAC0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;2EAOuE;IACvE,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,gBAAgB,CAAC;CACzD;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;gBACvC,SAAS,EAAE,SAAS,mBAAmB,EAAE;CAKtD;AA+CD;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAyFf"}
1
+ {"version":3,"file":"verify-rls.d.ts","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"AAuDA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;+EAE+E;AAC/E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,CAAC,GAAG,OAAO,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CAC3B;AAED;;qDAEqD;AACrD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC7E;AAED,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,oBAAoB,CAAC;AAoC9D;;;mEAGmE;AACnE,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B;;0CAEsC;IACtC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;oEAIgE;IAChE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;sCAGkC;IAClC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C;;4EAEwE;IACxE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;yEAWqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;0BAC0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;2EAOuE;IACvE,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,gBAAgB,CAAC;CACzD;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;gBACvC,SAAS,EAAE,SAAS,mBAAmB,EAAE;CAKtD;AA+CD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CA0Ff"}
@@ -21,11 +21,65 @@
21
21
  // RLS is an error; a reference table missing RLS is expected.
22
22
  //
23
23
  // The verify path is a single read-only catalog query — it does NOT need
24
- // the GUC/tx-bound `PgPool` surface. It accepts any object exposing a
25
- // `query(sql, params)` returning `{ rows }`, which `pg.Pool` /
26
- // `PgClientPool.rawPool` satisfy directly. Byte-consistent error semantics
24
+ // the GUC/tx-bound `PgPool` surface. Byte-consistent error semantics
27
25
  // across TS / Python / Go ports.
26
+ //
27
+ // DRIVER SHAPE (0.12.0) — WHY THIS WAS ZERO-ADOPTED
28
+ // -------------------------------------------------
29
+ // Until 0.12.0 the first parameter was typed ONLY as
30
+ // `{ query(sql, params): Promise<{ rows: R[] }> }` — the node-postgres result
31
+ // shape. This barrel's own header says why that was fatal: "every Nodii
32
+ // service runs postgres-js (porsager), which never installs `pg`". A
33
+ // postgres-js service literally cannot pass its pool here; it would have to
34
+ // hand-wrap `sql.unsafe(text, args)` (which resolves to a bare `T[]`) into a
35
+ // `{ rows }` envelope first. And the shipped `verify-rls` CLI does
36
+ // `await import("pg")`, so the CLI was unusable for the same services.
37
+ //
38
+ // The result, at the 0.12.0 audit: `verifyRls` had ZERO references across all
39
+ // 16 service repos, while FIVE services hand-rolled the identical
40
+ // `SELECT relname, relrowsecurity FROM pg_class` check in their own tests —
41
+ // billing, finance, vendor, ticketing, and obs-interface (Go). Of the five,
42
+ // finance and billing have no `pg` dependency at all. The barrel comment
43
+ // claiming "service db:setup gates call verifyRls() after migrations" was
44
+ // describing an API nobody could reach.
45
+ //
46
+ // So `verifyRls` now accepts EITHER driver shape and normalises internally:
47
+ //
48
+ // node-postgres { query(sql, params) } → Promise<{ rows: R[] }>
49
+ // postgres-js { unsafe(sql, params) } → Promise<R[]>
50
+ //
51
+ // Both satisfy a single read-only catalog SELECT with positional parameters;
52
+ // nothing driver-specific is used. `pg.Pool`, `pg.PoolClient`,
53
+ // `PgClientPool.rawPool`, a porsager `Sql` instance, and
54
+ // `PgPostgresJsPool`'s underlying `sql` all work unchanged.
28
55
  import { DbRlsError } from "./types.js";
56
+ /**
57
+ * Run one positional-parameter SELECT against either driver shape and return
58
+ * a plain row array.
59
+ *
60
+ * Duck-typed rather than flagged: a pool that exposes BOTH (a drizzle
61
+ * postgres-js client wrapping a porsager `Sql`, say) is served by `query`,
62
+ * which is the stricter, better-typed path.
63
+ */
64
+ async function queryRows(pool, sql, params) {
65
+ const asNodePg = pool;
66
+ if (typeof asNodePg.query === "function") {
67
+ const res = await asNodePg.query(sql, params);
68
+ // A postgres-js `Sql` tagged template is ALSO callable, and some wrappers
69
+ // expose a `query` that resolves to an array. Accept both results rather
70
+ // than reading `.rows` off an array and silently getting `undefined`.
71
+ return Array.isArray(res) ? res : res.rows;
72
+ }
73
+ const asPgJs = pool;
74
+ if (typeof asPgJs.unsafe === "function") {
75
+ const rows = await asPgJs.unsafe(sql, params);
76
+ return rows;
77
+ }
78
+ throw new DbRlsError("verifyRls: the supplied pool exposes neither `query(sql, params)` " +
79
+ "(node-postgres) nor `unsafe(sql, params)` (postgres-js). Pass a " +
80
+ "`pg.Pool`/`pg.PoolClient`, a `PgClientPool.rawPool`, or a postgres-js " +
81
+ "`Sql` instance (e.g. `getPools().owner.sql`).");
82
+ }
29
83
  /**
30
84
  * Thrown by `verifyRls` when one or more RLS-required tables are missing
31
85
  * row-level security (or are absent). Carries the structured offender list
@@ -82,6 +136,20 @@ function key(r) {
82
136
  * The query is a single read against `pg_class` joined to `pg_namespace`
83
137
  * — read-only, no GUCs, no writes. Run it from a migration / `db:setup`
84
138
  * gate against any pool (typically the owner/admin pool).
139
+ *
140
+ * `pool` accepts EITHER driver shape (0.12.0): node-postgres
141
+ * (`query(sql, params) → { rows }`) or postgres-js
142
+ * (`unsafe(sql, params) → rows[]`). Wire it into `db:setup` after
143
+ * migrations apply:
144
+ *
145
+ * ```ts
146
+ * // postgres-js service (the common Nodii case)
147
+ * import { verifyRls } from "@nodii/db-rls";
148
+ * await verifyRls(getPools().owner.sql, {
149
+ * requiredTables: ["finance_journal_entries", "finance_ledger_entries"],
150
+ * referenceTables: ["currency_codes"], // § 7.6 — GRANT-controlled, no RLS
151
+ * });
152
+ * ```
85
153
  */
86
154
  export async function verifyRls(pool, opts) {
87
155
  const defaultSchema = opts.schema ?? "public";
@@ -113,7 +181,7 @@ export async function verifyRls(pool, opts) {
113
181
  // resolves every table; missing rows are detected by set difference.
114
182
  const schemas = toCheck.map((t) => t.schema);
115
183
  const relnames = toCheck.map((t) => t.relname);
116
- const res = await pool.query(`SELECT n.nspname, c.relname, c.relrowsecurity, c.relforcerowsecurity
184
+ const rows = await queryRows(pool, `SELECT n.nspname, c.relname, c.relrowsecurity, c.relforcerowsecurity
117
185
  FROM unnest($1::text[], $2::text[]) AS req(schemaname, tablename)
118
186
  JOIN pg_namespace n ON n.nspname = req.schemaname
119
187
  JOIN pg_class c ON c.relnamespace = n.oid
@@ -121,7 +189,7 @@ export async function verifyRls(pool, opts) {
121
189
  AND c.relkind IN ('r', 'p')`, [schemas, relnames]);
122
190
  // Index the catalog rows by schema.relname.
123
191
  const found = new Map();
124
- for (const row of res.rows) {
192
+ for (const row of rows) {
125
193
  found.set(`${row.nspname}.${row.relname}`, {
126
194
  enabled: row.relrowsecurity,
127
195
  forced: row.relforcerowsecurity,
@@ -1 +1 @@
1
- {"version":3,"file":"verify-rls.js","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify-rls.js","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodii/db-rls",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "description": "Three-pool RLS dispatch + GUC-set + entry-point helpers + RLS policy DDL generator for the Nodii microservice stack. Polyglot per D159 (TS + Python + Go). Spec: planning hub docKey=db-rls.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -62,7 +62,7 @@
62
62
  }
63
63
  },
64
64
  "devDependencies": {
65
- "@nodii/telemetry": "0.23.0",
65
+ "@nodii/telemetry": "0.27.0",
66
66
  "@types/bun": "^1.3.13",
67
67
  "@types/pg": "^8.11.10",
68
68
  "drizzle-orm": "^0.45.2",