@ddd-ts-kit/prisma 0.0.0-stage → 0.1.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 (118) hide show
  1. package/README.md +629 -2
  2. package/dist/index.d.ts +20 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +22 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/outbox/locked-id-of.d.ts +2 -0
  7. package/dist/outbox/locked-id-of.d.ts.map +1 -0
  8. package/dist/outbox/locked-id-of.js +7 -0
  9. package/dist/outbox/locked-id-of.js.map +1 -0
  10. package/dist/outbox/locking-select.d.ts +4 -0
  11. package/dist/outbox/locking-select.d.ts.map +1 -0
  12. package/dist/outbox/locking-select.js +20 -0
  13. package/dist/outbox/locking-select.js.map +1 -0
  14. package/dist/outbox/payload-field.d.ts +9 -0
  15. package/dist/outbox/payload-field.d.ts.map +1 -0
  16. package/dist/outbox/payload-field.js +12 -0
  17. package/dist/outbox/payload-field.js.map +1 -0
  18. package/dist/outbox/prisma-json-input.d.ts +5 -0
  19. package/dist/outbox/prisma-json-input.d.ts.map +1 -0
  20. package/dist/outbox/prisma-json-input.js +2 -0
  21. package/dist/outbox/prisma-json-input.js.map +1 -0
  22. package/dist/outbox/prisma-outbox-claim.d.ts +25 -0
  23. package/dist/outbox/prisma-outbox-claim.d.ts.map +1 -0
  24. package/dist/outbox/prisma-outbox-claim.js +2 -0
  25. package/dist/outbox/prisma-outbox-claim.js.map +1 -0
  26. package/dist/outbox/prisma-outbox-delegate.d.ts +87 -0
  27. package/dist/outbox/prisma-outbox-delegate.d.ts.map +1 -0
  28. package/dist/outbox/prisma-outbox-delegate.js +2 -0
  29. package/dist/outbox/prisma-outbox-delegate.js.map +1 -0
  30. package/dist/outbox/prisma-outbox-store.d.ts +54 -0
  31. package/dist/outbox/prisma-outbox-store.d.ts.map +1 -0
  32. package/dist/outbox/prisma-outbox-store.js +150 -0
  33. package/dist/outbox/prisma-outbox-store.js.map +1 -0
  34. package/dist/outbox/prisma-processed-event-delegate.d.ts +17 -0
  35. package/dist/outbox/prisma-processed-event-delegate.d.ts.map +1 -0
  36. package/dist/outbox/prisma-processed-event-delegate.js +2 -0
  37. package/dist/outbox/prisma-processed-event-delegate.js.map +1 -0
  38. package/dist/outbox/prisma-processed-event-store.d.ts +19 -0
  39. package/dist/outbox/prisma-processed-event-store.d.ts.map +1 -0
  40. package/dist/outbox/prisma-processed-event-store.js +23 -0
  41. package/dist/outbox/prisma-processed-event-store.js.map +1 -0
  42. package/dist/outbox/prisma-raw-queries.d.ts +5 -0
  43. package/dist/outbox/prisma-raw-queries.d.ts.map +1 -0
  44. package/dist/outbox/prisma-raw-queries.js +2 -0
  45. package/dist/outbox/prisma-raw-queries.js.map +1 -0
  46. package/dist/outbox/to-outbox-record.d.ts +4 -0
  47. package/dist/outbox/to-outbox-record.d.ts.map +1 -0
  48. package/dist/outbox/to-outbox-record.js +25 -0
  49. package/dist/outbox/to-outbox-record.js.map +1 -0
  50. package/dist/read-model/criteria-to-prisma.d.ts +10 -0
  51. package/dist/read-model/criteria-to-prisma.d.ts.map +1 -0
  52. package/dist/read-model/criteria-to-prisma.js +23 -0
  53. package/dist/read-model/criteria-to-prisma.js.map +1 -0
  54. package/dist/read-model/predicate-to-prisma.d.ts +11 -0
  55. package/dist/read-model/predicate-to-prisma.d.ts.map +1 -0
  56. package/dist/read-model/predicate-to-prisma.js +41 -0
  57. package/dist/read-model/predicate-to-prisma.js.map +1 -0
  58. package/dist/read-model/prisma-criteria.d.ts +13 -0
  59. package/dist/read-model/prisma-criteria.d.ts.map +1 -0
  60. package/dist/read-model/prisma-criteria.js +2 -0
  61. package/dist/read-model/prisma-criteria.js.map +1 -0
  62. package/dist/read-model/prisma-model-rows.d.ts +17 -0
  63. package/dist/read-model/prisma-model-rows.d.ts.map +1 -0
  64. package/dist/read-model/prisma-model-rows.js +50 -0
  65. package/dist/read-model/prisma-model-rows.js.map +1 -0
  66. package/dist/read-model/prisma-read-model-delegate.d.ts +21 -0
  67. package/dist/read-model/prisma-read-model-delegate.d.ts.map +1 -0
  68. package/dist/read-model/prisma-read-model-delegate.js +2 -0
  69. package/dist/read-model/prisma-read-model-delegate.js.map +1 -0
  70. package/dist/read-model/prisma-read-model-options.d.ts +13 -0
  71. package/dist/read-model/prisma-read-model-options.d.ts.map +1 -0
  72. package/dist/read-model/prisma-read-model-options.js +2 -0
  73. package/dist/read-model/prisma-read-model-options.js.map +1 -0
  74. package/dist/read-model/prisma-read-model-store.d.ts +17 -0
  75. package/dist/read-model/prisma-read-model-store.d.ts.map +1 -0
  76. package/dist/read-model/prisma-read-model-store.js +13 -0
  77. package/dist/read-model/prisma-read-model-store.js.map +1 -0
  78. package/dist/read-model/prisma-read-model-table.d.ts +32 -0
  79. package/dist/read-model/prisma-read-model-table.d.ts.map +1 -0
  80. package/dist/read-model/prisma-read-model-table.js +84 -0
  81. package/dist/read-model/prisma-read-model-table.js.map +1 -0
  82. package/dist/read-model/prisma-table-rows.d.ts +27 -0
  83. package/dist/read-model/prisma-table-rows.d.ts.map +1 -0
  84. package/dist/read-model/prisma-table-rows.js +59 -0
  85. package/dist/read-model/prisma-table-rows.js.map +1 -0
  86. package/dist/read-model/row.mapper.d.ts +17 -0
  87. package/dist/read-model/row.mapper.d.ts.map +1 -0
  88. package/dist/read-model/row.mapper.js +58 -0
  89. package/dist/read-model/row.mapper.js.map +1 -0
  90. package/dist/read-model/stamped-row-of.d.ts +11 -0
  91. package/dist/read-model/stamped-row-of.d.ts.map +1 -0
  92. package/dist/read-model/stamped-row-of.js +13 -0
  93. package/dist/read-model/stamped-row-of.js.map +1 -0
  94. package/dist/read-model/written-of.d.ts +4 -0
  95. package/dist/read-model/written-of.d.ts.map +1 -0
  96. package/dist/read-model/written-of.js +12 -0
  97. package/dist/read-model/written-of.js.map +1 -0
  98. package/dist/unit-of-work/create-prisma-unit-of-work.d.ts +18 -0
  99. package/dist/unit-of-work/create-prisma-unit-of-work.d.ts.map +1 -0
  100. package/dist/unit-of-work/create-prisma-unit-of-work.js +30 -0
  101. package/dist/unit-of-work/create-prisma-unit-of-work.js.map +1 -0
  102. package/dist/unit-of-work/prisma-context.d.ts +15 -0
  103. package/dist/unit-of-work/prisma-context.d.ts.map +1 -0
  104. package/dist/unit-of-work/prisma-context.js +14 -0
  105. package/dist/unit-of-work/prisma-context.js.map +1 -0
  106. package/dist/unit-of-work/prisma-transaction-client.d.ts +8 -0
  107. package/dist/unit-of-work/prisma-transaction-client.d.ts.map +1 -0
  108. package/dist/unit-of-work/prisma-transaction-client.js +2 -0
  109. package/dist/unit-of-work/prisma-transaction-client.js.map +1 -0
  110. package/dist/unit-of-work/prisma-transaction-host.d.ts +9 -0
  111. package/dist/unit-of-work/prisma-transaction-host.d.ts.map +1 -0
  112. package/dist/unit-of-work/prisma-transaction-host.js +2 -0
  113. package/dist/unit-of-work/prisma-transaction-host.js.map +1 -0
  114. package/package.json +44 -4
  115. package/prisma/outbox.mysql.prisma +40 -0
  116. package/prisma/outbox.postgresql.prisma +43 -0
  117. package/prisma/outbox.sqlite.prisma +42 -0
  118. package/prisma/read-model.postgresql.prisma +26 -0
@@ -0,0 +1,10 @@
1
+ import type { CriteriaPlan } from '@ddd-ts-kit/kernel';
2
+ import type { PrismaCriteria } from './prisma-criteria.js';
3
+ /**
4
+ * Turns a criteria plan into the arguments of a `findMany` on the model of a read model:
5
+ * `client.appointmentRow.findMany({ where, orderBy, take, skip })`, then `pageOfPlan(plan, rows)`.
6
+ * A field that may be null is ordered as the plan means it: nulls last ascending, first
7
+ * descending. `fields` renames a field of the read model whose model field differs.
8
+ */
9
+ export declare function criteriaToPrisma(plan: CriteriaPlan, fields?: Readonly<Record<string, string>>): PrismaCriteria;
10
+ //# sourceMappingURL=criteria-to-prisma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-to-prisma.d.ts","sourceRoot":"","sources":["../../src/read-model/criteria-to-prisma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAAG,cAAc,CAgBlH"}
@@ -0,0 +1,23 @@
1
+ import { predicateToPrisma } from './predicate-to-prisma.js';
2
+ /**
3
+ * Turns a criteria plan into the arguments of a `findMany` on the model of a read model:
4
+ * `client.appointmentRow.findMany({ where, orderBy, take, skip })`, then `pageOfPlan(plan, rows)`.
5
+ * A field that may be null is ordered as the plan means it: nulls last ascending, first
6
+ * descending. `fields` renames a field of the read model whose model field differs.
7
+ */
8
+ export function criteriaToPrisma(plan, fields = {}) {
9
+ const counted = predicateToPrisma(plan.filter, fields);
10
+ const seek = predicateToPrisma(plan.seek, fields);
11
+ return {
12
+ where: plan.seek === undefined ? counted : { AND: [counted, seek] },
13
+ counted,
14
+ orderBy: plan.sort.map(({ field, direction }) => {
15
+ const name = Object.hasOwn(fields, field) ? (fields[field] ?? field) : field;
16
+ const nulls = direction === 'asc' ? 'last' : 'first';
17
+ return { [name]: plan.fields[field]?.nullable === true ? { sort: direction, nulls } : direction };
18
+ }),
19
+ take: plan.fetch,
20
+ skip: plan.offset,
21
+ };
22
+ }
23
+ //# sourceMappingURL=criteria-to-prisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-to-prisma.js","sourceRoot":"","sources":["../../src/read-model/criteria-to-prisma.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,MAAM,GAAqC,EAAE;IAChG,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAElD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;QACnE,OAAO;QACP,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;YAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC7E,MAAM,KAAK,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAErD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACpG,CAAC,CAAC;QACF,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,IAAI,EAAE,IAAI,CAAC,MAAM;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Predicate } from '@ddd-ts-kit/kernel';
2
+ import type { PrismaWhere } from './prisma-criteria.js';
3
+ type Fields = Readonly<Record<string, string>>;
4
+ /**
5
+ * A predicate of a criteria plan as a Prisma `where`. It is data, never text: Prisma binds
6
+ * every value, and the keys are the model fields the adapter mapped. `fields` renames a field
7
+ * of the read model whose model field differs.
8
+ */
9
+ export declare function predicateToPrisma(predicate: Predicate | undefined, fields?: Fields): PrismaWhere;
10
+ export {};
11
+ //# sourceMappingURL=predicate-to-prisma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-to-prisma.d.ts","sourceRoot":"","sources":["../../src/read-model/predicate-to-prisma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAI/C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE,MAAM,GAAE,MAAW,GAAG,WAAW,CAepG"}
@@ -0,0 +1,41 @@
1
+ const COMPARISONS = { eq: 'equals', gt: 'gt', gte: 'gte', lt: 'lt', lte: 'lte', isNull: 'equals' };
2
+ /**
3
+ * A predicate of a criteria plan as a Prisma `where`. It is data, never text: Prisma binds
4
+ * every value, and the keys are the model fields the adapter mapped. `fields` renames a field
5
+ * of the read model whose model field differs.
6
+ */
7
+ export function predicateToPrisma(predicate, fields = {}) {
8
+ if (predicate === undefined) {
9
+ return {};
10
+ }
11
+ if (predicate.kind === 'test') {
12
+ return tested(predicate, Object.hasOwn(fields, predicate.field) ? (fields[predicate.field] ?? predicate.field) : predicate.field);
13
+ }
14
+ const parts = predicate.parts.map((part) => predicateToPrisma(part, fields));
15
+ return predicate.kind === 'and' ? { AND: parts } : { OR: parts };
16
+ }
17
+ function tested(test, field) {
18
+ if (test.operator === 'isNull') {
19
+ return { [field]: test.value === true ? null : { not: null } };
20
+ }
21
+ return test.negated ? { NOT: { [field]: compared(test) } } : { [field]: compared(test) };
22
+ }
23
+ function compared({ operator, value }) {
24
+ const values = typeof value === 'object' && !(value instanceof Date) ? [...value] : [value];
25
+ const [first = null, second = null] = values;
26
+ if (operator === 'in') {
27
+ return { in: values };
28
+ }
29
+ if (operator === 'between') {
30
+ return { gte: first, lte: second };
31
+ }
32
+ if (operator === 'contains' || operator === 'startsWith') {
33
+ return { [operator]: literal(String(first)) };
34
+ }
35
+ return operator === 'ne' ? { not: { equals: first } } : { [COMPARISONS[operator]]: first };
36
+ }
37
+ /** Prisma hands the text of a search to `LIKE` as it is: `%`, `_` and `\` are escaped here. */
38
+ function literal(text) {
39
+ return text.replace(/[\\%_]/g, (special) => `\\${special}`);
40
+ }
41
+ //# sourceMappingURL=predicate-to-prisma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-to-prisma.js","sourceRoot":"","sources":["../../src/read-model/predicate-to-prisma.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** A `where` of Prisma, as plain data: what `findMany`, `count` and `updateMany` take. */
2
+ export type PrismaWhere = Readonly<Record<string, unknown>>;
3
+ /** A criteria plan as the arguments of a Prisma `findMany`. */
4
+ export interface PrismaCriteria {
5
+ /** The filters, the scope of the actor and the keyset of a cursor page. */
6
+ readonly where: PrismaWhere;
7
+ /** The filters and the scope alone: what the total of an offset page counts. */
8
+ readonly counted: PrismaWhere;
9
+ readonly orderBy: Readonly<Record<string, unknown>>[];
10
+ readonly take: number;
11
+ readonly skip: number;
12
+ }
13
+ //# sourceMappingURL=prisma-criteria.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-criteria.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-criteria.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE5D,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prisma-criteria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-criteria.js","sourceRoot":"","sources":["../../src/read-model/prisma-criteria.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { EventStamp, ReadModelRows, StampedRow } from '@ddd-ts-kit/kernel';
2
+ import type { PrismaContext } from '../unit-of-work/prisma-context.js';
3
+ import type { PrismaReadModelDelegate } from './prisma-read-model-delegate.js';
4
+ import type { PrismaReadModelOptions } from './prisma-read-model-options.js';
5
+ /** The stamped rows of the table of a read model, through its model. */
6
+ export declare class PrismaModelRows<Row extends object, Tx> implements ReadModelRows<Row> {
7
+ private readonly context;
8
+ private readonly options;
9
+ private readonly mapper;
10
+ constructor(context: PrismaContext<Tx>, options: PrismaReadModelOptions<Row, Tx>);
11
+ find(key: string): Promise<StampedRow<Row> | undefined>;
12
+ insert(entry: StampedRow<Row>): Promise<boolean>;
13
+ replace(entry: StampedRow<Row>, held: EventStamp): Promise<boolean>;
14
+ model(): PrismaReadModelDelegate;
15
+ private keyField;
16
+ }
17
+ //# sourceMappingURL=prisma-model-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-model-rows.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-model-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAK7E,wEAAwE;AACxE,qBAAa,eAAe,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,CAAE,YAAW,aAAa,CAAC,GAAG,CAAC;IAI9E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,YACmB,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAC1B,OAAO,EAAE,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC,EAG1D;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAc5D;IAEK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAWrD;IAEK,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;IAED,KAAK,IAAI,uBAAuB,CAE/B;IAED,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,50 @@
1
+ import { RowMapper } from './row.mapper.js';
2
+ import { stampedRowOf } from './stamped-row-of.js';
3
+ import { writtenOf } from './written-of.js';
4
+ /** The stamped rows of the table of a read model, through its model. */
5
+ export class PrismaModelRows {
6
+ context;
7
+ options;
8
+ mapper;
9
+ constructor(context, options) {
10
+ this.context = context;
11
+ this.options = options;
12
+ this.mapper = new RowMapper(options.columns);
13
+ }
14
+ async find(key) {
15
+ const [found] = await this.model().findMany({ where: { [this.keyField()]: key }, take: 1 });
16
+ if (found === undefined) {
17
+ return undefined;
18
+ }
19
+ const read = (field) => Reflect.get(found, field);
20
+ return stampedRowOf({
21
+ key,
22
+ stamps: [read('lastEventId'), read('lastEventAt'), read('lastEventVersion'), read('deleted')],
23
+ row: () => this.mapper.toRow(found),
24
+ });
25
+ }
26
+ async insert(entry) {
27
+ if (entry.row === undefined) {
28
+ return false;
29
+ }
30
+ const { count } = await this.model().createMany({
31
+ data: [writtenOf(entry, this.keyField())],
32
+ skipDuplicates: true,
33
+ });
34
+ return count === 1;
35
+ }
36
+ async replace(entry, held) {
37
+ const { count } = await this.model().updateMany({
38
+ where: { [this.keyField()]: entry.key, lastEventId: held.eventId, lastEventAt: held.occurredAt },
39
+ data: writtenOf(entry, this.keyField()),
40
+ });
41
+ return count === 1;
42
+ }
43
+ model() {
44
+ return this.options.delegate(this.context.client());
45
+ }
46
+ keyField() {
47
+ return this.options.key ?? 'id';
48
+ }
49
+ }
50
+ //# sourceMappingURL=prisma-model-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-model-rows.js","sourceRoot":"","sources":["../../src/read-model/prisma-model-rows.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,wEAAwE;AACxE,MAAM,OAAO,eAAe;IAIP,OAAO;IACP,OAAO;IAJT,MAAM,CAAiB;IAExC,YACmB,OAA0B,EAC1B,OAAwC;uBADxC,OAAO;uBACP,OAAO;QAExB,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAE5F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEnE,OAAO,YAAY,CAAC;YAClB,GAAG;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7F,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAsB;QACjC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC;YAC9C,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzC,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,OAAO,KAAK,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAsB,EAAE,IAAgB;QACpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC;YAC9C,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;YAChG,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;SACxC,CAAC,CAAC;QAEH,OAAO,KAAK,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,QAAQ;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The methods the read model calls on its model: `client.appointmentRow` fits as is on the
3
+ * databases where Prisma offers `skipDuplicates` (PostgreSQL, MySQL, CockroachDB). The
4
+ * arguments are built from the fields of the row at run time, which the generated types
5
+ * cannot follow: they are typed as objects, and it is the model that validates them.
6
+ */
7
+ export interface PrismaReadModelDelegate {
8
+ /** `{ where, orderBy, take, skip }` */
9
+ findMany(args?: object): Promise<object[]>;
10
+ /** `{ where }` */
11
+ count(args?: object): Promise<number>;
12
+ /** `{ data: [row], skipDuplicates: true }` */
13
+ createMany(args?: object): Promise<{
14
+ count: number;
15
+ }>;
16
+ /** `{ where, data }` */
17
+ updateMany(args?: object): Promise<{
18
+ count: number;
19
+ }>;
20
+ }
21
+ //# sourceMappingURL=prisma-read-model-delegate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-delegate.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-delegate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,kBAAkB;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,8CAA8C;IAC9C,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,wBAAwB;IACxB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prisma-read-model-delegate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-delegate.js","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-delegate.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { PrismaReadModelDelegate } from './prisma-read-model-delegate.js';
2
+ export interface PrismaReadModelOptions<Row, Tx> {
3
+ /** How to reach the model from a client: `(client) => client.appointmentRow`. */
4
+ readonly delegate: (client: Tx) => PrismaReadModelDelegate;
5
+ /** The table of the model (`@@map`), and its schema (`@@schema`): the rebuild works on the table. */
6
+ readonly table: string;
7
+ readonly schema?: string;
8
+ /** The column of every field of the row (`@map`): `{ startsAt: 'starts_at' }`. */
9
+ readonly columns: Readonly<Record<keyof Row & string, string>>;
10
+ /** The field of the key, which is the `@id` of the model. Default `id`. */
11
+ readonly key?: keyof Row & string;
12
+ }
13
+ //# sourceMappingURL=prisma-read-model-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-options.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE/E,MAAM,WAAW,sBAAsB,CAAC,GAAG,EAAE,EAAE;IAC7C,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,uBAAuB,CAAC;IAC3D,qGAAqG;IACrG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prisma-read-model-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-options.js","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { TableReadModelStore, type CriteriaDefinition } from '@ddd-ts-kit/kernel';
2
+ import type { PrismaRawQueries } from '../outbox/prisma-raw-queries.js';
3
+ import type { PrismaContext } from '../unit-of-work/prisma-context.js';
4
+ import type { PrismaReadModelOptions } from './prisma-read-model-options.js';
5
+ export interface PrismaReadModel<Row, Tx> extends PrismaReadModelOptions<Row, Tx> {
6
+ /** What a read of the read model may filter and sort by. */
7
+ readonly definition: CriteriaDefinition<Row>;
8
+ }
9
+ /**
10
+ * The read model of a projection in a Prisma model. The adapter of a read model port extends
11
+ * it and adds nothing: `class PrismaAppointmentList extends PrismaReadModelStore<AppointmentRow, Prisma.TransactionClient>
12
+ * implements AppointmentList`. Its `table` is what a `ProjectionRebuild` takes.
13
+ */
14
+ export declare class PrismaReadModelStore<Row extends object, Tx extends PrismaRawQueries> extends TableReadModelStore<Row> {
15
+ constructor(context: PrismaContext<Tx>, { definition, ...options }: PrismaReadModel<Row, Tx>);
16
+ }
17
+ //# sourceMappingURL=prisma-read-model-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-store.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAG7E,MAAM,WAAW,eAAe,CAAC,GAAG,EAAE,EAAE,CAAE,SAAQ,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/E,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CAC9C;AAED;;;;GAIG;AACH,qBAAa,oBAAoB,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,SAAS,gBAAgB,CAAE,SAAQ,mBAAmB,CAAC,GAAG,CAAC;IACjH,YAAY,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,EAAE,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,EAE3F;CACF"}
@@ -0,0 +1,13 @@
1
+ import { TableReadModelStore } from '@ddd-ts-kit/kernel';
2
+ import { PrismaReadModelTable } from './prisma-read-model-table.js';
3
+ /**
4
+ * The read model of a projection in a Prisma model. The adapter of a read model port extends
5
+ * it and adds nothing: `class PrismaAppointmentList extends PrismaReadModelStore<AppointmentRow, Prisma.TransactionClient>
6
+ * implements AppointmentList`. Its `table` is what a `ProjectionRebuild` takes.
7
+ */
8
+ export class PrismaReadModelStore extends TableReadModelStore {
9
+ constructor(context, { definition, ...options }) {
10
+ super(new PrismaReadModelTable(context, options), definition);
11
+ }
12
+ }
13
+ //# sourceMappingURL=prisma-read-model-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-store.js","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA2B,MAAM,oBAAoB,CAAC;AAIlF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAOpE;;;;GAIG;AACH,MAAM,OAAO,oBAAsE,SAAQ,mBAAwB;IACjH,YAAY,OAA0B,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,EAA4B;QAC1F,KAAK,CAAC,IAAI,oBAAoB,CAAU,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import { type CriteriaPlan, type EventStamp, type SearchedRows, type ReadModelRows, type ReadModelTable, type StampedRow, type TouchedKey } from '@ddd-ts-kit/kernel';
2
+ import type { PrismaRawQueries } from '../outbox/prisma-raw-queries.js';
3
+ import type { PrismaContext } from '../unit-of-work/prisma-context.js';
4
+ import type { PrismaReadModelOptions } from './prisma-read-model-options.js';
5
+ /**
6
+ * The table of one read model on Prisma: what `TableReadModelStore` and `ProjectionRebuild`
7
+ * are given. Every statement runs on the client of the context, so a write made by a
8
+ * projection commits with the processed mark of its event. The rebuild is PostgreSQL only.
9
+ */
10
+ export declare class PrismaReadModelTable<Row extends object, Tx extends PrismaRawQueries> implements ReadModelTable<Row> {
11
+ private readonly context;
12
+ private readonly rows;
13
+ private readonly copy;
14
+ private readonly mapper;
15
+ private readonly rebuild;
16
+ constructor(context: PrismaContext<Tx>, options: PrismaReadModelOptions<Row, Tx>);
17
+ find(key: string): Promise<StampedRow<Row> | undefined>;
18
+ insert(entry: StampedRow<Row>): Promise<boolean>;
19
+ replace(entry: StampedRow<Row>, held: EventStamp): Promise<boolean>;
20
+ search(plan: CriteriaPlan): Promise<SearchedRows<Row>>;
21
+ rebuilding(): Promise<boolean>;
22
+ touch(key: string): Promise<void>;
23
+ beginRebuild(): Promise<void>;
24
+ shadow(): ReadModelRows<Row>;
25
+ touched(limit: number): Promise<readonly TouchedKey[]>;
26
+ settle(keys: readonly TouchedKey[]): Promise<void>;
27
+ holdWriters(): Promise<void>;
28
+ promote(): Promise<void>;
29
+ abandonRebuild(): Promise<void>;
30
+ private run;
31
+ }
32
+ //# sourceMappingURL=prisma-read-model-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-table.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAM7E;;;;GAIG;AACH,qBAAa,oBAAoB,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,SAAS,gBAAgB,CAAE,YAAW,cAAc,CAAC,GAAG,CAAC;IAU7G,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAEhD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAEhD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD,YACmB,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAC3C,OAAO,EAAE,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC,EAkBzC;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAEtD;IAED,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/C;IAED,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAElE;IAEK,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAO3D;IAED,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7B;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhC;IAED,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAED,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,CAE3B;IAED,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAErD;IAED,MAAM,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;IAED,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvB;IAED,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9B;YAEa,GAAG;CAUlB"}
@@ -0,0 +1,84 @@
1
+ import { PostgresReadModelRebuild, } from '@ddd-ts-kit/kernel';
2
+ import { criteriaToPrisma } from './criteria-to-prisma.js';
3
+ import { PrismaModelRows } from './prisma-model-rows.js';
4
+ import { PrismaTableRows } from './prisma-table-rows.js';
5
+ import { RowMapper } from './row.mapper.js';
6
+ const KEPT = { deleted: false };
7
+ /**
8
+ * The table of one read model on Prisma: what `TableReadModelStore` and `ProjectionRebuild`
9
+ * are given. Every statement runs on the client of the context, so a write made by a
10
+ * projection commits with the processed mark of its event. The rebuild is PostgreSQL only.
11
+ */
12
+ export class PrismaReadModelTable {
13
+ context;
14
+ rows;
15
+ copy;
16
+ mapper;
17
+ rebuild;
18
+ constructor(context, options) {
19
+ this.context = context;
20
+ const { table, schema } = options;
21
+ const shadow = `"${PostgresReadModelRebuild.shadowOf(table).replaceAll('"', '""')}"`;
22
+ this.mapper = new RowMapper(options.columns);
23
+ this.rows = new PrismaModelRows(context, options);
24
+ this.copy = new PrismaTableRows(context, {
25
+ path: schema === undefined ? shadow : `"${schema.replaceAll('"', '""')}".${shadow}`,
26
+ key: options.key ?? 'id',
27
+ mapper: this.mapper,
28
+ });
29
+ this.rebuild = new PostgresReadModelRebuild((statement, parameters) => this.run(statement, parameters), {
30
+ table,
31
+ ...(schema === undefined ? {} : { schema }),
32
+ });
33
+ }
34
+ find(key) {
35
+ return this.rows.find(key);
36
+ }
37
+ insert(entry) {
38
+ return this.rows.insert(entry);
39
+ }
40
+ replace(entry, held) {
41
+ return this.rows.replace(entry, held);
42
+ }
43
+ async search(plan) {
44
+ const { where, counted, orderBy, take, skip } = criteriaToPrisma(plan);
45
+ const model = this.rows.model();
46
+ const found = await model.findMany({ where: { AND: [KEPT, where] }, orderBy, take, skip });
47
+ const rows = found.map((row) => this.mapper.toRow(row));
48
+ return plan.kind === 'cursor' ? { rows } : { rows, total: await model.count({ where: { AND: [KEPT, counted] } }) };
49
+ }
50
+ rebuilding() {
51
+ return this.rebuild.rebuilding();
52
+ }
53
+ touch(key) {
54
+ return this.rebuild.touch(key);
55
+ }
56
+ beginRebuild() {
57
+ return this.rebuild.begin();
58
+ }
59
+ shadow() {
60
+ return this.copy;
61
+ }
62
+ touched(limit) {
63
+ return this.rebuild.touched(limit);
64
+ }
65
+ settle(keys) {
66
+ return this.rebuild.settle(keys);
67
+ }
68
+ holdWriters() {
69
+ return this.rebuild.holdWriters();
70
+ }
71
+ promote() {
72
+ return this.rebuild.promote();
73
+ }
74
+ abandonRebuild() {
75
+ return this.rebuild.abandon();
76
+ }
77
+ async run(statement, parameters) {
78
+ const rows = await this.context.client().$queryRawUnsafe(statement, ...parameters);
79
+ return Array.isArray(rows)
80
+ ? rows.filter((row) => typeof row === 'object' && row !== null)
81
+ : [];
82
+ }
83
+ }
84
+ //# sourceMappingURL=prisma-read-model-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-read-model-table.js","sourceRoot":"","sources":["../../src/read-model/prisma-read-model-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { EventStamp, ReadModelRows, StampedRow } from '@ddd-ts-kit/kernel';
2
+ import type { PrismaRawQueries } from '../outbox/prisma-raw-queries.js';
3
+ import type { PrismaContext } from '../unit-of-work/prisma-context.js';
4
+ import type { RowMapper } from './row.mapper.js';
5
+ export interface NamedTable<Row extends object> {
6
+ /** The table, quoted and qualified. */
7
+ readonly path: string;
8
+ /** A field of the row, not a column. */
9
+ readonly key: string;
10
+ readonly mapper: RowMapper<Row>;
11
+ }
12
+ /**
13
+ * The stamped rows of a table that has no model: the copy of a rebuild, on PostgreSQL.
14
+ * Statements are written here with quoted identifiers that come from the options of the
15
+ * adapter; every value is a `$n` parameter.
16
+ */
17
+ export declare class PrismaTableRows<Row extends object, Tx extends PrismaRawQueries> implements ReadModelRows<Row> {
18
+ private readonly context;
19
+ private readonly target;
20
+ constructor(context: PrismaContext<Tx>, target: NamedTable<Row>);
21
+ find(key: string): Promise<StampedRow<Row> | undefined>;
22
+ insert(entry: StampedRow<Row>): Promise<boolean>;
23
+ replace(entry: StampedRow<Row>, held: EventStamp): Promise<boolean>;
24
+ private column;
25
+ private run;
26
+ }
27
+ //# sourceMappingURL=prisma-table-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-table-rows.d.ts","sourceRoot":"","sources":["../../src/read-model/prisma-table-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW,UAAU,CAAC,GAAG,SAAS,MAAM;IAC5C,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACjC;AAED;;;;GAIG;AACH,qBAAa,eAAe,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,SAAS,gBAAgB,CAAE,YAAW,aAAa,CAAC,GAAG,CAAC;IAEvG,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFzB,YACmB,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAC1B,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,EACtC;IAEE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAa5D;IAEK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBrD;IAEK,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAYxE;IAED,OAAO,CAAC,MAAM;YAIA,GAAG;CAOlB"}
@@ -0,0 +1,59 @@
1
+ import { stampedRowOf } from './stamped-row-of.js';
2
+ import { writtenOf } from './written-of.js';
3
+ /**
4
+ * The stamped rows of a table that has no model: the copy of a rebuild, on PostgreSQL.
5
+ * Statements are written here with quoted identifiers that come from the options of the
6
+ * adapter; every value is a `$n` parameter.
7
+ */
8
+ export class PrismaTableRows {
9
+ context;
10
+ target;
11
+ constructor(context, target) {
12
+ this.context = context;
13
+ this.target = target;
14
+ }
15
+ async find(key) {
16
+ const { path, mapper } = this.target;
17
+ const [record] = await this.run(`select * from ${path} where ${this.column(this.target.key)} = $1 limit 1`, [key]);
18
+ if (record === undefined) {
19
+ return undefined;
20
+ }
21
+ return stampedRowOf({
22
+ key,
23
+ stamps: [record['last_event_id'], record['last_event_at'], record['last_event_version'], record['deleted']],
24
+ row: () => mapper.fromRecord(record),
25
+ });
26
+ }
27
+ async insert(entry) {
28
+ if (entry.row === undefined) {
29
+ return false;
30
+ }
31
+ const record = Object.entries(this.target.mapper.toRecord(writtenOf(entry, this.target.key)));
32
+ const columns = record.map(([column]) => quoted(column)).join(', ');
33
+ const places = record.map((_, index) => `$${String(index + 1)}`).join(', ');
34
+ const key = this.column(this.target.key);
35
+ const inserted = await this.run(`insert into ${this.target.path} (${columns}) values (${places}) on conflict (${key}) do nothing returning ${key}`, record.map(([, value]) => value));
36
+ return inserted.length === 1;
37
+ }
38
+ async replace(entry, held) {
39
+ const record = Object.entries(this.target.mapper.toRecord(writtenOf(entry, this.target.key)));
40
+ const changes = record.map(([column], index) => `${quoted(column)} = $${String(index + 1)}`).join(', ');
41
+ const key = this.column(this.target.key);
42
+ const next = (offset) => `$${String(record.length + offset)}`;
43
+ const replaced = await this.run(`update ${this.target.path} set ${changes} where ${key} = ${next(1)} and "last_event_id" = ${next(2)} and "last_event_at" = ${next(3)} returning ${key}`, [...record.map(([, value]) => value), entry.key, held.eventId, held.occurredAt]);
44
+ return replaced.length === 1;
45
+ }
46
+ column(field) {
47
+ return quoted(this.target.mapper.columnOf(field));
48
+ }
49
+ async run(statement, values) {
50
+ const rows = await this.context.client().$queryRawUnsafe(statement, ...values);
51
+ return Array.isArray(rows)
52
+ ? rows.filter((row) => typeof row === 'object' && row !== null)
53
+ : [];
54
+ }
55
+ }
56
+ function quoted(identifier) {
57
+ return `"${identifier.replaceAll('"', '""')}"`;
58
+ }
59
+ //# sourceMappingURL=prisma-table-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-table-rows.js","sourceRoot":"","sources":["../../src/read-model/prisma-table-rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Translates between the row of a read model and what Prisma holds: the model, keyed by
3
+ * field, and the table, keyed by column, which is how the copy of a rebuild is reached since
4
+ * it has no model. A `Decimal` reads back as a string, a `BigInt` as a number.
5
+ */
6
+ export declare class RowMapper<Row extends object> {
7
+ private readonly columns;
8
+ constructor(columns: Readonly<Record<string, string>>);
9
+ /** From what the model answered, by field. */
10
+ toRow(found: object): Row;
11
+ /** From a record of the table, by column. */
12
+ fromRecord(record: Readonly<Record<string, unknown>>): Row;
13
+ /** What the model wrote by field, by column: the fields of the row and the four stamps. */
14
+ toRecord(written: Readonly<Record<string, unknown>>): Record<string, unknown>;
15
+ columnOf(field: string): string;
16
+ }
17
+ //# sourceMappingURL=row.mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row.mapper.d.ts","sourceRoot":"","sources":["../../src/read-model/row.mapper.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,qBAAa,SAAS,CAAC,GAAG,SAAS,MAAM;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAI;IAE1E,8CAA8C;IAC9C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAIxB;IAED,6CAA6C;IAC7C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAIzD;IAED,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS5E;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ9B;CACF"}