@ddd-ts-kit/drizzle 0.7.0 → 0.9.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 (67) hide show
  1. package/README.md +41 -0
  2. package/dist/postgres/outbox/drizzle-outbox-store.d.ts +2 -1
  3. package/dist/postgres/outbox/drizzle-outbox-store.d.ts.map +1 -1
  4. package/dist/postgres/outbox/drizzle-outbox-store.js +9 -0
  5. package/dist/postgres/outbox/drizzle-outbox-store.js.map +1 -1
  6. package/dist/postgres/outbox/outbox-columns.d.ts +20 -0
  7. package/dist/postgres/outbox/outbox-columns.d.ts.map +1 -0
  8. package/dist/postgres/outbox/outbox-columns.js +25 -0
  9. package/dist/postgres/outbox/outbox-columns.js.map +1 -0
  10. package/dist/postgres/outbox/outbox-table.d.ts +2 -3
  11. package/dist/postgres/outbox/outbox-table.d.ts.map +1 -1
  12. package/dist/postgres/outbox/outbox-table.js +3 -21
  13. package/dist/postgres/outbox/outbox-table.js.map +1 -1
  14. package/dist/postgres/outbox/tenant-outbox-table.d.ts +271 -0
  15. package/dist/postgres/outbox/tenant-outbox-table.d.ts.map +1 -0
  16. package/dist/postgres/outbox/tenant-outbox-table.js +16 -0
  17. package/dist/postgres/outbox/tenant-outbox-table.js.map +1 -0
  18. package/dist/postgres/read-model/drizzle-read-model-options.d.ts +9 -0
  19. package/dist/postgres/read-model/drizzle-read-model-options.d.ts.map +1 -1
  20. package/dist/postgres/read-model/drizzle-read-model-table.d.ts.map +1 -1
  21. package/dist/postgres/read-model/drizzle-read-model-table.js +11 -2
  22. package/dist/postgres/read-model/drizzle-read-model-table.js.map +1 -1
  23. package/dist/postgres/read-model/drizzle-stamped-rows.d.ts +8 -1
  24. package/dist/postgres/read-model/drizzle-stamped-rows.d.ts.map +1 -1
  25. package/dist/postgres/read-model/drizzle-stamped-rows.js +23 -4
  26. package/dist/postgres/read-model/drizzle-stamped-rows.js.map +1 -1
  27. package/dist/postgres/read-model/read-model-tenant.d.ts +8 -0
  28. package/dist/postgres/read-model/read-model-tenant.d.ts.map +1 -0
  29. package/dist/postgres/read-model/read-model-tenant.js +2 -0
  30. package/dist/postgres/read-model/read-model-tenant.js.map +1 -0
  31. package/dist/postgres/tenancy/force-row-level-security.d.ts +8 -0
  32. package/dist/postgres/tenancy/force-row-level-security.d.ts.map +1 -0
  33. package/dist/postgres/tenancy/force-row-level-security.js +12 -0
  34. package/dist/postgres/tenancy/force-row-level-security.js.map +1 -0
  35. package/dist/postgres/tenancy/own-tenant-condition.d.ts +6 -0
  36. package/dist/postgres/tenancy/own-tenant-condition.d.ts.map +1 -0
  37. package/dist/postgres/tenancy/own-tenant-condition.js +7 -0
  38. package/dist/postgres/tenancy/own-tenant-condition.js.map +1 -0
  39. package/dist/postgres/tenancy/reach-condition.d.ts +5 -0
  40. package/dist/postgres/tenancy/reach-condition.d.ts.map +1 -0
  41. package/dist/postgres/tenancy/reach-condition.js +14 -0
  42. package/dist/postgres/tenancy/reach-condition.js.map +1 -0
  43. package/dist/postgres/tenancy/sql-executor.d.ts +6 -0
  44. package/dist/postgres/tenancy/sql-executor.d.ts.map +1 -0
  45. package/dist/postgres/tenancy/sql-executor.js +2 -0
  46. package/dist/postgres/tenancy/sql-executor.js.map +1 -0
  47. package/dist/postgres/tenancy/tenant-condition.d.ts +12 -0
  48. package/dist/postgres/tenancy/tenant-condition.d.ts.map +1 -0
  49. package/dist/postgres/tenancy/tenant-condition.js +13 -0
  50. package/dist/postgres/tenancy/tenant-condition.js.map +1 -0
  51. package/dist/postgres/tenancy/tenant-policies.d.ts +12 -0
  52. package/dist/postgres/tenancy/tenant-policies.d.ts.map +1 -0
  53. package/dist/postgres/tenancy/tenant-policies.js +27 -0
  54. package/dist/postgres/tenancy/tenant-policies.js.map +1 -0
  55. package/dist/postgres/tenancy/tenant-session.d.ts +10 -0
  56. package/dist/postgres/tenancy/tenant-session.d.ts.map +1 -0
  57. package/dist/postgres/tenancy/tenant-session.js +15 -0
  58. package/dist/postgres/tenancy/tenant-session.js.map +1 -0
  59. package/dist/postgres/unit-of-work/create-drizzle-unit-of-work.d.ts +6 -1
  60. package/dist/postgres/unit-of-work/create-drizzle-unit-of-work.d.ts.map +1 -1
  61. package/dist/postgres/unit-of-work/create-drizzle-unit-of-work.js +7 -2
  62. package/dist/postgres/unit-of-work/create-drizzle-unit-of-work.js.map +1 -1
  63. package/dist/postgres.d.ts +8 -0
  64. package/dist/postgres.d.ts.map +1 -1
  65. package/dist/postgres.js +8 -0
  66. package/dist/postgres.js.map +1 -1
  67. package/package.json +4 -4
@@ -1,6 +1,7 @@
1
1
  import { and, eq, sql } from 'drizzle-orm';
2
2
  import { getTableConfig } from 'drizzle-orm/pg-core';
3
3
  import { PostgresReadModelRebuild, } from '@ddd-ts-kit/kernel';
4
+ import { tenantCondition } from '../tenancy/tenant-condition.js';
4
5
  import { criteriaToDrizzle } from './criteria-to-drizzle.js';
5
6
  import { DrizzleStampedRows } from './drizzle-stamped-rows.js';
6
7
  import { RowMapper } from './row.mapper.js';
@@ -22,7 +23,14 @@ export class DrizzleReadModelTable {
22
23
  this.context = context;
23
24
  this.options = options;
24
25
  const { name, schema } = getTableConfig(options.table);
25
- this.target = { schema, name, key: options.key, columns: options.columns, stamps: stampColumns(options.table) };
26
+ this.target = {
27
+ schema,
28
+ name,
29
+ key: options.key,
30
+ columns: options.columns,
31
+ stamps: stampColumns(options.table),
32
+ ...(options.tenant === undefined ? {} : { tenant: options.tenant }),
33
+ };
26
34
  this.rows = new DrizzleStampedRows(context, this.target);
27
35
  this.copy = new DrizzleStampedRows(context, { ...this.target, name: PostgresReadModelRebuild.shadowOf(name) });
28
36
  this.rebuild = new PostgresReadModelRebuild((statement, parameters) => this.run(statement, parameters), {
@@ -42,7 +50,8 @@ export class DrizzleReadModelTable {
42
50
  async search(plan) {
43
51
  const { table, columns } = this.options;
44
52
  const { where, counted, orderBy, limit, offset } = criteriaToDrizzle(plan, columns);
45
- const kept = eq(this.target.stamps.deleted, false);
53
+ const { tenant } = this.options;
54
+ const kept = and(eq(this.target.stamps.deleted, false), tenant && tenantCondition(tenant.column, tenant.scope));
46
55
  const db = this.context.executor();
47
56
  const mapper = new RowMapper(columns);
48
57
  const records = await db
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-read-model-table.js","sourceRoot":"","sources":["../../../src/postgres/read-model/drizzle-read-model-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drizzle-read-model-table.js","sourceRoot":"","sources":["../../../src/postgres/read-model/drizzle-read-model-table.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { type TablesRelationalConfig } from 'drizzle-orm';
2
2
  import type { PgColumn, PgQueryResultHKT } from 'drizzle-orm/pg-core';
3
- import type { EventStamp, ReadModelRows, StampedRow } from '@ddd-ts-kit/kernel';
3
+ import { type EventStamp, type ReadModelRows, type StampedRow } from '@ddd-ts-kit/kernel';
4
+ import type { ReadModelTenant } from './read-model-tenant.js';
4
5
  import type { DrizzleContext } from '../unit-of-work/drizzle-context.js';
5
6
  import type { StampColumns } from './stamp-columns.js';
6
7
  export interface StampedTable {
@@ -9,6 +10,7 @@ export interface StampedTable {
9
10
  readonly key: PgColumn;
10
11
  readonly columns: Readonly<Record<string, PgColumn>>;
11
12
  readonly stamps: StampColumns;
13
+ readonly tenant?: ReadModelTenant;
12
14
  }
13
15
  /**
14
16
  * The stamped rows of one table, the copy of a rebuild as well as the table itself: the
@@ -23,7 +25,12 @@ export declare class DrizzleStampedRows<Row extends object, Q extends PgQueryRes
23
25
  find(key: string): Promise<StampedRow<Row> | undefined>;
24
26
  insert(entry: StampedRow<Row>): Promise<boolean>;
25
27
  replace(entry: StampedRow<Row>, held: EventStamp): Promise<boolean>;
28
+ /** What a read may reach: every row, or those of the tenants of the work for a read model of tenant data. */
29
+ private reach;
30
+ private own;
26
31
  private valuesOf;
32
+ /** The tenant of a written row, for a read model of tenant data. */
33
+ private tenantValue;
27
34
  private table;
28
35
  }
29
36
  //# sourceMappingURL=drizzle-stamped-rows.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-stamped-rows.d.ts","sourceRoot":"","sources":["../../../src/postgres/read-model/drizzle-stamped-rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAED;;;;GAIG;AACH,qBAAa,kBAAkB,CAC7B,GAAG,SAAS,MAAM,EAClB,CAAC,SAAS,gBAAgB,EAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,sBAAsB,CAChC,YAAW,aAAa,CAAC,GAAG,CAAC;IAK3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,YACmB,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAChC,MAAM,EAAE,YAAY,EAGtC;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAwB5D;IAEK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BrD;IAEK,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBxE;IAED,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,KAAK;CAKd"}
1
+ {"version":3,"file":"drizzle-stamped-rows.d.ts","sourceRoot":"","sources":["../../../src/postgres/read-model/drizzle-stamped-rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEzG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;GAIG;AACH,qBAAa,kBAAkB,CAC7B,GAAG,SAAS,MAAM,EAClB,CAAC,SAAS,gBAAgB,EAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,sBAAsB,CAChC,YAAW,aAAa,CAAC,GAAG,CAAC;IAK3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,YACmB,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAChC,MAAM,EAAE,YAAY,EAGtC;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CA0B5D;IAEK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA0BrD;IAEK,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBxE;IAED,6GAA6G;IAC7G,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,QAAQ;IAmBhB,oEAAoE;IACpE,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,KAAK;CAKd"}
@@ -1,4 +1,6 @@
1
1
  import { sql } from 'drizzle-orm';
2
+ import { tenantScopeOf } from '@ddd-ts-kit/kernel';
3
+ import { reachCondition } from '../tenancy/reach-condition.js';
2
4
  import { RowMapper } from './row.mapper.js';
3
5
  import { rowsOf } from './rows-of.js';
4
6
  /**
@@ -19,7 +21,7 @@ export class DrizzleStampedRows {
19
21
  const { stamps } = this.target;
20
22
  const [record] = rowsOf(await this.context
21
23
  .executor()
22
- .execute(sql `select * from ${this.table()} where ${named(this.target.key)} = ${key} limit 1`));
24
+ .execute(sql `select * from ${this.table()} where ${named(this.target.key)} = ${key} and ${this.reach()} limit 1`));
23
25
  if (record === undefined) {
24
26
  return undefined;
25
27
  }
@@ -53,12 +55,23 @@ export class DrizzleStampedRows {
53
55
  const key = named(this.target.key);
54
56
  const replaced = await this.context
55
57
  .executor()
56
- .execute(sql `update ${this.table()} set ${changes} where ${key} = ${entry.key} and ${named(stamps.lastEventId)} = ${held.eventId} and ${named(stamps.lastEventAt)} = ${held.occurredAt.toISOString()} returning ${key}`);
58
+ .execute(sql `update ${this.table()} set ${changes} where ${key} = ${entry.key} and ${named(stamps.lastEventId)} = ${held.eventId} and ${named(stamps.lastEventAt)} = ${held.occurredAt.toISOString()} and ${this.own()} returning ${key}`);
57
59
  return rowsOf(replaced).length === 1;
58
60
  }
61
+ /** What a read may reach: every row, or those of the tenants of the work for a read model of tenant data. */
62
+ reach() {
63
+ const { tenant } = this.target;
64
+ return tenant === undefined ? sql `true` : reachCondition(named(tenant.column), tenant.scope);
65
+ }
66
+ own() {
67
+ const { tenant } = this.target;
68
+ return tenant === undefined ? sql `true` : sql `${named(tenant.column)} = ${tenantScopeOf(tenant.scope).tenantId}`;
69
+ }
59
70
  valuesOf({ key, row, stamp }) {
60
- const { stamps } = this.target;
61
- const written = row === undefined ? [] : this.mapper.toValues(row).filter(([column]) => column !== this.target.key);
71
+ const { stamps, tenant } = this.target;
72
+ const written = row === undefined
73
+ ? []
74
+ : this.mapper.toValues(row).filter(([column]) => column !== this.target.key && column !== tenant?.column);
62
75
  return [
63
76
  ...written,
64
77
  [this.target.key, key],
@@ -66,8 +79,14 @@ export class DrizzleStampedRows {
66
79
  [stamps.lastEventAt, stamp.occurredAt.toISOString()],
67
80
  [stamps.lastEventVersion, stamp.version ?? null],
68
81
  [stamps.deleted, row === undefined],
82
+ ...this.tenantValue(),
69
83
  ];
70
84
  }
85
+ /** The tenant of a written row, for a read model of tenant data. */
86
+ tenantValue() {
87
+ const { tenant } = this.target;
88
+ return tenant === undefined ? [] : [[tenant.column, tenantScopeOf(tenant.scope).tenantId]];
89
+ }
71
90
  table() {
72
91
  const { schema, name } = this.target;
73
92
  return schema === undefined ? sql `${sql.identifier(name)}` : sql `${sql.identifier(schema)}.${sql.identifier(name)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-stamped-rows.js","sourceRoot":"","sources":["../../../src/postgres/read-model/drizzle-stamped-rows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drizzle-stamped-rows.js","sourceRoot":"","sources":["../../../src/postgres/read-model/drizzle-stamped-rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PgColumn } from 'drizzle-orm/pg-core';
2
+ import type { ExecutionScope } from '@ddd-ts-kit/kernel';
3
+ /** Where a read model of tenant data keeps the tenant of each row, and the scope that names it. */
4
+ export interface ReadModelTenant {
5
+ readonly scope: ExecutionScope;
6
+ readonly column: PgColumn;
7
+ }
8
+ //# sourceMappingURL=read-model-tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-model-tenant.d.ts","sourceRoot":"","sources":["../../../src/postgres/read-model/read-model-tenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,mGAAmG;AACnG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=read-model-tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-model-tenant.js","sourceRoot":"","sources":["../../../src/postgres/read-model/read-model-tenant.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { type PgTable } from 'drizzle-orm/pg-core';
2
+ /**
3
+ * The statement drizzle-kit does not write: row-level security forced on the owner of the table
4
+ * too. For a custom migration (`drizzle-kit generate --custom`) after the one that created the
5
+ * table and its `tenantPolicies`.
6
+ */
7
+ export declare function forceRowLevelSecurity(table: PgTable): string;
8
+ //# sourceMappingURL=force-row-level-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"force-row-level-security.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/force-row-level-security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK5D"}
@@ -0,0 +1,12 @@
1
+ import { getTableConfig } from 'drizzle-orm/pg-core';
2
+ /**
3
+ * The statement drizzle-kit does not write: row-level security forced on the owner of the table
4
+ * too. For a custom migration (`drizzle-kit generate --custom`) after the one that created the
5
+ * table and its `tenantPolicies`.
6
+ */
7
+ export function forceRowLevelSecurity(table) {
8
+ const { schema, name } = getTableConfig(table);
9
+ const qualified = schema === undefined ? `"${name}"` : `"${schema}"."${name}"`;
10
+ return `alter table ${qualified} force row level security;`;
11
+ }
12
+ //# sourceMappingURL=force-row-level-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"force-row-level-security.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/force-row-level-security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,qBAAqB,CAAC;AAEnE;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,MAAM,IAAI,GAAG,CAAC;IAE/E,OAAO,eAAe,SAAS,4BAA4B,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type SQL } from 'drizzle-orm';
2
+ import type { PgColumn } from 'drizzle-orm/pg-core';
3
+ import { type ExecutionScope } from '@ddd-ts-kit/kernel';
4
+ /** The condition of an update or a delete: the one tenant of the work in progress, whatever an elevation widens. */
5
+ export declare function ownTenantCondition(column: PgColumn, scope: ExecutionScope): SQL;
6
+ //# sourceMappingURL=own-tenant-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"own-tenant-condition.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/own-tenant-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExE,oHAAoH;AACpH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG,CAE/E"}
@@ -0,0 +1,7 @@
1
+ import { eq } from 'drizzle-orm';
2
+ import { tenantScopeOf } from '@ddd-ts-kit/kernel';
3
+ /** The condition of an update or a delete: the one tenant of the work in progress, whatever an elevation widens. */
4
+ export function ownTenantCondition(column, scope) {
5
+ return eq(column, tenantScopeOf(scope).tenantId);
6
+ }
7
+ //# sourceMappingURL=own-tenant-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"own-tenant-condition.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/own-tenant-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAY,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AAExE,oHAAoH;AACpH,MAAM,UAAU,kBAAkB,CAAC,MAAgB,EAAE,KAAqB;IACxE,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type SQL } from 'drizzle-orm';
2
+ import { type ExecutionScope } from '@ddd-ts-kit/kernel';
3
+ /** The condition of a read on a tenant column given as SQL: the tenant of the work, or the tenants of an elevation. */
4
+ export declare function reachCondition(column: SQL, scope: ExecutionScope): SQL;
5
+ //# sourceMappingURL=reach-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reach-condition.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/reach-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExE,uHAAuH;AACvH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG,CAYtE"}
@@ -0,0 +1,14 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { tenantReachOf } from '@ddd-ts-kit/kernel';
3
+ /** The condition of a read on a tenant column given as SQL: the tenant of the work, or the tenants of an elevation. */
4
+ export function reachCondition(column, scope) {
5
+ const reach = tenantReachOf(scope);
6
+ if (reach.kind === 'tenant') {
7
+ return sql `${column} = ${reach.tenantId}`;
8
+ }
9
+ if (reach.tenants === 'all') {
10
+ return sql `true`;
11
+ }
12
+ return sql `${column} = any(${sql.param([...reach.tenants])})`;
13
+ }
14
+ //# sourceMappingURL=reach-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reach-condition.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/reach-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AAExE,uHAAuH;AACvH,MAAM,UAAU,cAAc,CAAC,MAAW,EAAE,KAAqB;IAC/D,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAA,GAAG,MAAM,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAA,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAA,GAAG,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC;AAChE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SQL } from 'drizzle-orm';
2
+ /** What runs one statement: a drizzle database or transaction, whatever its driver. */
3
+ export interface SqlExecutor {
4
+ execute(query: SQL): PromiseLike<unknown>;
5
+ }
6
+ //# sourceMappingURL=sql-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-executor.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/sql-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sql-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-executor.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/sql-executor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { type SQL } from 'drizzle-orm';
2
+ import type { PgColumn } from 'drizzle-orm/pg-core';
3
+ import type { ExecutionScope } from '@ddd-ts-kit/kernel';
4
+ /**
5
+ * The condition every read of a table of tenant data carries: `.where(and(eq(invoices.id, id),
6
+ * tenantCondition(invoices.tenantId, this.scope)))`. The tenant of the work, or the tenants of an
7
+ * elevation; work that names no tenant is refused (`NoCurrentTenantError`). The one way a
8
+ * repository of a tenant-scoped project reads (`tenancy/scoped-statement`); writes use
9
+ * `ownTenantCondition`, which an elevation does not widen.
10
+ */
11
+ export declare function tenantCondition(column: PgColumn, scope: ExecutionScope): SQL;
12
+ //# sourceMappingURL=tenant-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-condition.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/tenant-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,GAAG,GAAG,CAE5E"}
@@ -0,0 +1,13 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { reachCondition } from './reach-condition.js';
3
+ /**
4
+ * The condition every read of a table of tenant data carries: `.where(and(eq(invoices.id, id),
5
+ * tenantCondition(invoices.tenantId, this.scope)))`. The tenant of the work, or the tenants of an
6
+ * elevation; work that names no tenant is refused (`NoCurrentTenantError`). The one way a
7
+ * repository of a tenant-scoped project reads (`tenancy/scoped-statement`); writes use
8
+ * `ownTenantCondition`, which an elevation does not widen.
9
+ */
10
+ export function tenantCondition(column, scope) {
11
+ return reachCondition(sql `${column}`, scope);
12
+ }
13
+ //# sourceMappingURL=tenant-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-condition.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/tenant-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAY,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB,EAAE,KAAqB;IACrE,OAAO,cAAc,CAAC,GAAG,CAAA,GAAG,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type PgColumn, type PgPolicy } from 'drizzle-orm/pg-core';
2
+ /**
3
+ * The row-level security policies of a table of tenant data, one per command, declared with the
4
+ * table so that drizzle-kit generates them:
5
+ * `pgTable('invoices', {...}, (table) => [...tenantPolicies(table.tenantId)]).enableRLS()`.
6
+ * A select sees the tenant of the work and the tenants an elevation reaches; an insert, an
7
+ * update and a delete only ever touch `ddd_ts_kit.tenant_id`, elevated or not. drizzle-kit does
8
+ * not force the policies on the owner of the table: add `forceRowLevelSecurity(table)` to a
9
+ * custom migration, or connect with a role that does not own it.
10
+ */
11
+ export declare function tenantPolicies(column: PgColumn): readonly PgPolicy[];
12
+ //# sourceMappingURL=tenant-policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-policies.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/tenant-policies.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG7E;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,QAAQ,EAAE,CAcpE"}
@@ -0,0 +1,27 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { pgPolicy } from 'drizzle-orm/pg-core';
3
+ import { TENANT_ISOLATION_POLICIES, tenantPolicyExpressions } from '@ddd-ts-kit/kernel';
4
+ /**
5
+ * The row-level security policies of a table of tenant data, one per command, declared with the
6
+ * table so that drizzle-kit generates them:
7
+ * `pgTable('invoices', {...}, (table) => [...tenantPolicies(table.tenantId)]).enableRLS()`.
8
+ * A select sees the tenant of the work and the tenants an elevation reaches; an insert, an
9
+ * update and a delete only ever touch `ddd_ts_kit.tenant_id`, elevated or not. drizzle-kit does
10
+ * not force the policies on the owner of the table: add `forceRowLevelSecurity(table)` to a
11
+ * custom migration, or connect with a role that does not own it.
12
+ */
13
+ export function tenantPolicies(column) {
14
+ const { read, write } = tenantPolicyExpressions(`"${column.name}"`);
15
+ return [
16
+ pgPolicy(TENANT_ISOLATION_POLICIES.select, { as: 'permissive', for: 'select', using: sql.raw(read) }),
17
+ pgPolicy(TENANT_ISOLATION_POLICIES.insert, { as: 'permissive', for: 'insert', withCheck: sql.raw(write) }),
18
+ pgPolicy(TENANT_ISOLATION_POLICIES.update, {
19
+ as: 'permissive',
20
+ for: 'update',
21
+ using: sql.raw(write),
22
+ withCheck: sql.raw(write),
23
+ }),
24
+ pgPolicy(TENANT_ISOLATION_POLICIES.delete, { as: 'permissive', for: 'delete', using: sql.raw(write) }),
25
+ ];
26
+ }
27
+ //# sourceMappingURL=tenant-policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-policies.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/tenant-policies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAgC,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAExF;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgB;IAC7C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAEpE,OAAO;QACL,QAAQ,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrG,QAAQ,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1G,QAAQ,CAAC,yBAAyB,CAAC,MAAM,EAAE;YACzC,EAAE,EAAE,YAAY;YAChB,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YACrB,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;SAC1B,CAAC;QACF,QAAQ,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;KACvG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ExecutionScope } from '@ddd-ts-kit/kernel';
2
+ import type { SqlExecutor } from './sql-executor.js';
3
+ /**
4
+ * The `begin` of a unit of work under row-level security: sets the tenant settings for the
5
+ * transaction only, from the execution context of the work, so that a pooled connection never
6
+ * carries them to the next transaction. Work without a tenant sets them empty, and the policies
7
+ * then show it nothing.
8
+ */
9
+ export declare function tenantSession(scope: ExecutionScope): (transaction: SqlExecutor) => Promise<void>;
10
+ //# sourceMappingURL=tenant-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-session.d.ts","sourceRoot":"","sources":["../../../src/postgres/tenancy/tenant-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAQhG"}
@@ -0,0 +1,15 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { TENANT_SETTINGS, tenantSettingValues } from '@ddd-ts-kit/kernel';
3
+ /**
4
+ * The `begin` of a unit of work under row-level security: sets the tenant settings for the
5
+ * transaction only, from the execution context of the work, so that a pooled connection never
6
+ * carries them to the next transaction. Work without a tenant sets them empty, and the policies
7
+ * then show it nothing.
8
+ */
9
+ export function tenantSession(scope) {
10
+ return async (transaction) => {
11
+ const { tenant, reach, everyTenant } = tenantSettingValues(scope.current());
12
+ await transaction.execute(sql `select set_config(${TENANT_SETTINGS.tenant}, ${tenant}, true), set_config(${TENANT_SETTINGS.reach}, ${reach}, true), set_config(${TENANT_SETTINGS.everyTenant}, ${everyTenant}, true)`);
13
+ };
14
+ }
15
+ //# sourceMappingURL=tenant-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-session.js","sourceRoot":"","sources":["../../../src/postgres/tenancy/tenant-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAuB,MAAM,oBAAoB,CAAC;AAG/F;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE;QAC3B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5E,MAAM,WAAW,CAAC,OAAO,CACvB,GAAG,CAAA,qBAAqB,eAAe,CAAC,MAAM,KAAK,MAAM,uBAAuB,eAAe,CAAC,KAAK,KAAK,KAAK,uBAAuB,eAAe,CAAC,WAAW,KAAK,WAAW,SAAS,CAC3L,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1,10 +1,15 @@
1
1
  import type { ExtractTablesWithRelations, TablesRelationalConfig } from 'drizzle-orm';
2
2
  import type { PgDatabase, PgQueryResultHKT, PgTransactionConfig } from 'drizzle-orm/pg-core';
3
3
  import { type UnitOfWork } from '@ddd-ts-kit/kernel';
4
+ import type { SqlExecutor } from '../tenancy/sql-executor.js';
4
5
  import type { DrizzleContext } from './drizzle-context.js';
5
6
  /** One object for both ports: bind it to `UnitOfWork` and to the `DrizzleContext` of the project. */
6
7
  export interface DrizzleUnitOfWork<Q extends PgQueryResultHKT, F extends Record<string, unknown> = Record<string, never>, S extends TablesRelationalConfig = ExtractTablesWithRelations<F>> extends UnitOfWork, DrizzleContext<Q, F, S> {
7
8
  }
9
+ export interface DrizzleUnitOfWorkOptions {
10
+ /** Runs first in each outermost transaction, before the work: `tenantSession(scope)` sets the tenant settings row-level security reads. */
11
+ readonly begin?: (transaction: SqlExecutor) => Promise<void>;
12
+ }
8
13
  /**
9
14
  * A unit of work over `db.transaction`, for any drizzle PostgreSQL driver (node-postgres,
10
15
  * postgres-js, PGlite, Neon...). The transaction travels in an AsyncLocalStorage owned by this
@@ -12,5 +17,5 @@ export interface DrizzleUnitOfWork<Q extends PgQueryResultHKT, F extends Record<
12
17
  * outer transaction: it commits or rolls back as a whole. Domain events are dispatched at the end
13
18
  * of the outermost `run`, before its commit (`withinUnitOfWork`).
14
19
  */
15
- export declare function createDrizzleUnitOfWork<Q extends PgQueryResultHKT, F extends Record<string, unknown>, S extends TablesRelationalConfig>(db: PgDatabase<Q, F, S>, config?: PgTransactionConfig): DrizzleUnitOfWork<Q, F, S>;
20
+ export declare function createDrizzleUnitOfWork<Q extends PgQueryResultHKT, F extends Record<string, unknown>, S extends TablesRelationalConfig>(db: PgDatabase<Q, F, S>, config?: PgTransactionConfig, options?: DrizzleUnitOfWorkOptions): DrizzleUnitOfWork<Q, F, S>;
16
21
  //# sourceMappingURL=create-drizzle-unit-of-work.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-drizzle-unit-of-work.d.ts","sourceRoot":"","sources":["../../../src/postgres/unit-of-work/create-drizzle-unit-of-work.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAiB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qGAAqG;AACrG,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,gBAAgB,EAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACzD,CAAC,SAAS,sBAAsB,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAChE,SAAQ,UAAU,EAChB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAAG;AAE9B;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,gBAAgB,EAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,sBAAsB,EAChC,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAgBnF"}
1
+ {"version":3,"file":"create-drizzle-unit-of-work.d.ts","sourceRoot":"","sources":["../../../src/postgres/unit-of-work/create-drizzle-unit-of-work.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAiB,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qGAAqG;AACrG,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,gBAAgB,EAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACzD,CAAC,SAAS,sBAAsB,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAChE,SAAQ,UAAU,EAChB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAAG;AAE9B,MAAM,WAAW,wBAAwB;IACvC,2IAA2I;IAC3I,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,gBAAgB,EAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,sBAAsB,EAEhC,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACvB,MAAM,CAAC,EAAE,mBAAmB,EAC5B,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAuB5B"}
@@ -7,15 +7,20 @@ import { withinUnitOfWork } from '@ddd-ts-kit/kernel';
7
7
  * outer transaction: it commits or rolls back as a whole. Domain events are dispatched at the end
8
8
  * of the outermost `run`, before its commit (`withinUnitOfWork`).
9
9
  */
10
- export function createDrizzleUnitOfWork(db, config) {
10
+ export function createDrizzleUnitOfWork(db, config, options = {}) {
11
11
  const current = new AsyncLocalStorage();
12
+ const { begin } = options;
12
13
  return {
13
14
  run(work) {
14
15
  return withinUnitOfWork(work, (scoped) => {
15
16
  if (current.getStore() !== undefined) {
16
17
  return scoped();
17
18
  }
18
- return db.transaction((transaction) => current.run(transaction, scoped), config);
19
+ const opened = async (transaction) => {
20
+ await begin?.(transaction);
21
+ return scoped();
22
+ };
23
+ return db.transaction((transaction) => current.run(transaction, () => opened(transaction)), config);
19
24
  });
20
25
  },
21
26
  executor: () => current.getStore() ?? db,
@@ -1 +1 @@
1
- {"version":3,"file":"create-drizzle-unit-of-work.js","sourceRoot":"","sources":["../../../src/postgres/unit-of-work/create-drizzle-unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAC;AAWvE;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAIrC,EAAuB,EAAE,MAA4B;IACrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAA0B,CAAC;IAEhE,OAAO;QACL,GAAG,CAAI,IAAsB;YAC3B,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;gBACvC,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,SAAS,EAAE,CAAC;oBACrC,OAAO,MAAM,EAAE,CAAC;gBAClB,CAAC;gBAED,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;QACxC,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,SAAS;KACtD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"create-drizzle-unit-of-work.js","sourceRoot":"","sources":["../../../src/postgres/unit-of-work/create-drizzle-unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,oBAAoB,CAAC;AAiBvE;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAKrC,EAAuB,EACvB,MAA4B,EAC5B,OAAO,GAA6B,EAAE;IAEtC,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAA0B,CAAC;IAChE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1B,OAAO;QACL,GAAG,CAAI,IAAsB;YAC3B,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;gBACvC,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,SAAS,EAAE,CAAC;oBACrC,OAAO,MAAM,EAAE,CAAC;gBAClB,CAAC;gBAED,MAAM,MAAM,GAAG,KAAK,EAAE,WAAmC,EAAc,EAAE;oBACvE,MAAM,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC;oBAE3B,OAAO,MAAM,EAAE,CAAC;gBAClB,CAAC,CAAC;gBAEF,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACtG,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;QACxC,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,SAAS;KACtD,CAAC;AACJ,CAAC"}
@@ -3,6 +3,7 @@ export * from './postgres/unit-of-work/drizzle-context.js';
3
3
  export * from './postgres/unit-of-work/create-drizzle-unit-of-work.js';
4
4
  export * from './postgres/schema/context-schema.js';
5
5
  export * from './postgres/outbox/outbox-table.js';
6
+ export * from './postgres/outbox/tenant-outbox-table.js';
6
7
  export * from './postgres/outbox/processed-events-table.js';
7
8
  export * from './postgres/outbox/drizzle-outbox-store.js';
8
9
  export * from './postgres/outbox/drizzle-processed-event-store.js';
@@ -12,6 +13,13 @@ export * from './postgres/read-model/read-model-columns.js';
12
13
  export * from './postgres/read-model/predicate-to-drizzle.js';
13
14
  export * from './postgres/read-model/criteria-to-drizzle.js';
14
15
  export * from './postgres/read-model/drizzle-read-model-options.js';
16
+ export * from './postgres/read-model/read-model-tenant.js';
15
17
  export * from './postgres/read-model/drizzle-read-model-table.js';
16
18
  export * from './postgres/read-model/drizzle-read-model-store.js';
19
+ export * from './postgres/tenancy/sql-executor.js';
20
+ export * from './postgres/tenancy/tenant-condition.js';
21
+ export * from './postgres/tenancy/own-tenant-condition.js';
22
+ export * from './postgres/tenancy/tenant-policies.js';
23
+ export * from './postgres/tenancy/force-row-level-security.js';
24
+ export * from './postgres/tenancy/tenant-session.js';
17
25
  //# sourceMappingURL=postgres.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wDAAwD,CAAC;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC"}
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,KAAK,WAAW,GACjB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wDAAwD,CAAC;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC"}
package/dist/postgres.js CHANGED
@@ -3,6 +3,7 @@ export * from './postgres/unit-of-work/drizzle-context.js';
3
3
  export * from './postgres/unit-of-work/create-drizzle-unit-of-work.js';
4
4
  export * from './postgres/schema/context-schema.js';
5
5
  export * from './postgres/outbox/outbox-table.js';
6
+ export * from './postgres/outbox/tenant-outbox-table.js';
6
7
  export * from './postgres/outbox/processed-events-table.js';
7
8
  export * from './postgres/outbox/drizzle-outbox-store.js';
8
9
  export * from './postgres/outbox/drizzle-processed-event-store.js';
@@ -12,6 +13,13 @@ export * from './postgres/read-model/read-model-columns.js';
12
13
  export * from './postgres/read-model/predicate-to-drizzle.js';
13
14
  export * from './postgres/read-model/criteria-to-drizzle.js';
14
15
  export * from './postgres/read-model/drizzle-read-model-options.js';
16
+ export * from './postgres/read-model/read-model-tenant.js';
15
17
  export * from './postgres/read-model/drizzle-read-model-table.js';
16
18
  export * from './postgres/read-model/drizzle-read-model-store.js';
19
+ export * from './postgres/tenancy/sql-executor.js';
20
+ export * from './postgres/tenancy/tenant-condition.js';
21
+ export * from './postgres/tenancy/own-tenant-condition.js';
22
+ export * from './postgres/tenancy/tenant-policies.js';
23
+ export * from './postgres/tenancy/force-row-level-security.js';
24
+ export * from './postgres/tenancy/tenant-session.js';
17
25
  //# sourceMappingURL=postgres.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GAEb,MAAM,oBAAoB,CAAC;AAC5B,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wDAAwD,CAAC;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GAEb,MAAM,oBAAoB,CAAC;AAC5B,cAAc,4CAA4C,CAAC;AAC3D,cAAc,wDAAwD,CAAC;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,oDAAoD,CAAC;AACnE,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts-kit/drizzle",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Drizzle adapters for the kernel ports on PostgreSQL: unit of work, transactional outbox store, processed-event store, one schema per context.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,8 +26,8 @@
26
26
  "dist"
27
27
  ],
28
28
  "dependencies": {
29
- "@ddd-ts-kit/kernel": "0.7.0",
30
- "@ddd-ts-kit/events": "0.7.0"
29
+ "@ddd-ts-kit/kernel": "0.9.0",
30
+ "@ddd-ts-kit/events": "0.9.0"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "drizzle-orm": ">=0.40.0"
@@ -35,7 +35,7 @@
35
35
  "devDependencies": {
36
36
  "drizzle-orm": "latest",
37
37
  "@electric-sql/pglite": "0.5.9",
38
- "@ddd-ts-kit/testing": "0.7.0",
38
+ "@ddd-ts-kit/testing": "0.9.0",
39
39
  "pg": "^8.23.1",
40
40
  "@types/pg": "^8.23.1"
41
41
  }