@ddd-ts-kit/knex 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +545 -2
  2. package/dist/columns/audit-columns.d.ts +7 -0
  3. package/dist/columns/audit-columns.d.ts.map +1 -0
  4. package/dist/columns/audit-columns.js +13 -0
  5. package/dist/columns/audit-columns.js.map +1 -0
  6. package/dist/columns/audit-row.d.ts +16 -0
  7. package/dist/columns/audit-row.d.ts.map +1 -0
  8. package/dist/columns/audit-row.js +5 -0
  9. package/dist/columns/audit-row.js.map +1 -0
  10. package/dist/columns/indexable-length.d.ts +3 -0
  11. package/dist/columns/indexable-length.d.ts.map +1 -0
  12. package/dist/columns/indexable-length.js +3 -0
  13. package/dist/columns/indexable-length.js.map +1 -0
  14. package/dist/columns/instant.d.ts +6 -0
  15. package/dist/columns/instant.d.ts.map +1 -0
  16. package/dist/columns/instant.js +3 -0
  17. package/dist/columns/instant.js.map +1 -0
  18. package/dist/columns/tenant-column.d.ts +4 -0
  19. package/dist/columns/tenant-column.d.ts.map +1 -0
  20. package/dist/columns/tenant-column.js +6 -0
  21. package/dist/columns/tenant-column.js.map +1 -0
  22. package/dist/columns/tenant-row.d.ts +7 -0
  23. package/dist/columns/tenant-row.d.ts.map +1 -0
  24. package/dist/columns/tenant-row.js +5 -0
  25. package/dist/columns/tenant-row.js.map +1 -0
  26. package/dist/index.d.ts +21 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +21 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/outbox/builder-in.d.ts +3 -0
  31. package/dist/outbox/builder-in.d.ts.map +1 -0
  32. package/dist/outbox/builder-in.js +4 -0
  33. package/dist/outbox/builder-in.js.map +1 -0
  34. package/dist/outbox/create-outbox-tables.d.ts +9 -0
  35. package/dist/outbox/create-outbox-tables.d.ts.map +1 -0
  36. package/dist/outbox/create-outbox-tables.js +97 -0
  37. package/dist/outbox/create-outbox-tables.js.map +1 -0
  38. package/dist/outbox/drop-outbox-tables.d.ts +5 -0
  39. package/dist/outbox/drop-outbox-tables.d.ts.map +1 -0
  40. package/dist/outbox/drop-outbox-tables.js +8 -0
  41. package/dist/outbox/drop-outbox-tables.js.map +1 -0
  42. package/dist/outbox/knex-outbox-store.d.ts +61 -0
  43. package/dist/outbox/knex-outbox-store.d.ts.map +1 -0
  44. package/dist/outbox/knex-outbox-store.js +184 -0
  45. package/dist/outbox/knex-outbox-store.js.map +1 -0
  46. package/dist/outbox/knex-processed-event-store.d.ts +21 -0
  47. package/dist/outbox/knex-processed-event-store.d.ts.map +1 -0
  48. package/dist/outbox/knex-processed-event-store.js +26 -0
  49. package/dist/outbox/knex-processed-event-store.js.map +1 -0
  50. package/dist/outbox/outbox-tables-options.d.ts +12 -0
  51. package/dist/outbox/outbox-tables-options.d.ts.map +1 -0
  52. package/dist/outbox/outbox-tables-options.js +2 -0
  53. package/dist/outbox/outbox-tables-options.js.map +1 -0
  54. package/dist/outbox/table-names.d.ts +3 -0
  55. package/dist/outbox/table-names.d.ts.map +1 -0
  56. package/dist/outbox/table-names.js +3 -0
  57. package/dist/outbox/table-names.js.map +1 -0
  58. package/dist/read-model/column-of.d.ts +3 -0
  59. package/dist/read-model/column-of.d.ts.map +1 -0
  60. package/dist/read-model/column-of.js +9 -0
  61. package/dist/read-model/column-of.js.map +1 -0
  62. package/dist/read-model/criteria-to-knex.d.ts +11 -0
  63. package/dist/read-model/criteria-to-knex.d.ts.map +1 -0
  64. package/dist/read-model/criteria-to-knex.js +28 -0
  65. package/dist/read-model/criteria-to-knex.js.map +1 -0
  66. package/dist/read-model/knex-read-model-options.d.ts +10 -0
  67. package/dist/read-model/knex-read-model-options.d.ts.map +1 -0
  68. package/dist/read-model/knex-read-model-options.js +2 -0
  69. package/dist/read-model/knex-read-model-options.js.map +1 -0
  70. package/dist/read-model/knex-read-model-store.d.ts +16 -0
  71. package/dist/read-model/knex-read-model-store.d.ts.map +1 -0
  72. package/dist/read-model/knex-read-model-store.js +13 -0
  73. package/dist/read-model/knex-read-model-store.js.map +1 -0
  74. package/dist/read-model/knex-read-model-table.d.ts +32 -0
  75. package/dist/read-model/knex-read-model-table.d.ts.map +1 -0
  76. package/dist/read-model/knex-read-model-table.js +83 -0
  77. package/dist/read-model/knex-read-model-table.js.map +1 -0
  78. package/dist/read-model/knex-stamped-rows.d.ts +19 -0
  79. package/dist/read-model/knex-stamped-rows.d.ts.map +1 -0
  80. package/dist/read-model/knex-stamped-rows.js +68 -0
  81. package/dist/read-model/knex-stamped-rows.js.map +1 -0
  82. package/dist/read-model/like-pattern.d.ts +4 -0
  83. package/dist/read-model/like-pattern.d.ts.map +1 -0
  84. package/dist/read-model/like-pattern.js +6 -0
  85. package/dist/read-model/like-pattern.js.map +1 -0
  86. package/dist/read-model/predicate-to-knex.d.ts +11 -0
  87. package/dist/read-model/predicate-to-knex.d.ts.map +1 -0
  88. package/dist/read-model/predicate-to-knex.js +63 -0
  89. package/dist/read-model/predicate-to-knex.js.map +1 -0
  90. package/dist/read-model/read-model-columns.d.ts +8 -0
  91. package/dist/read-model/read-model-columns.d.ts.map +1 -0
  92. package/dist/read-model/read-model-columns.js +14 -0
  93. package/dist/read-model/read-model-columns.js.map +1 -0
  94. package/dist/read-model/records-of.d.ts +3 -0
  95. package/dist/read-model/records-of.d.ts.map +1 -0
  96. package/dist/read-model/records-of.js +9 -0
  97. package/dist/read-model/records-of.js.map +1 -0
  98. package/dist/read-model/row.mapper.d.ts +8 -0
  99. package/dist/read-model/row.mapper.d.ts.map +1 -0
  100. package/dist/read-model/row.mapper.js +17 -0
  101. package/dist/read-model/row.mapper.js.map +1 -0
  102. package/dist/sql/dialect-of.d.ts +4 -0
  103. package/dist/sql/dialect-of.d.ts.map +1 -0
  104. package/dist/sql/dialect-of.js +17 -0
  105. package/dist/sql/dialect-of.js.map +1 -0
  106. package/dist/sql/insert-ignoring-conflict.d.ts +16 -0
  107. package/dist/sql/insert-ignoring-conflict.d.ts.map +1 -0
  108. package/dist/sql/insert-ignoring-conflict.js +28 -0
  109. package/dist/sql/insert-ignoring-conflict.js.map +1 -0
  110. package/dist/sql/sql-dialect.d.ts +3 -0
  111. package/dist/sql/sql-dialect.d.ts.map +1 -0
  112. package/dist/sql/sql-dialect.js +2 -0
  113. package/dist/sql/sql-dialect.js.map +1 -0
  114. package/dist/unit-of-work/create-knex-unit-of-work.d.ts +14 -0
  115. package/dist/unit-of-work/create-knex-unit-of-work.d.ts.map +1 -0
  116. package/dist/unit-of-work/create-knex-unit-of-work.js +24 -0
  117. package/dist/unit-of-work/create-knex-unit-of-work.js.map +1 -0
  118. package/dist/unit-of-work/knex-context.d.ts +13 -0
  119. package/dist/unit-of-work/knex-context.d.ts.map +1 -0
  120. package/dist/unit-of-work/knex-context.js +10 -0
  121. package/dist/unit-of-work/knex-context.js.map +1 -0
  122. package/package.json +41 -4
@@ -0,0 +1,9 @@
1
+ /** The column a field is mapped to. A field without a column is a mistake of the adapter, never of a caller. */
2
+ export function columnOf(columns, field) {
3
+ const column = Object.hasOwn(columns, field) ? columns[field] : undefined;
4
+ if (column === undefined) {
5
+ throw new Error(`The field "${field}" is mapped to no column`);
6
+ }
7
+ return column;
8
+ }
9
+ //# sourceMappingURL=column-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-of.js","sourceRoot":"","sources":["../../src/read-model/column-of.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,MAAM,UAAU,QAAQ,CAAC,OAAyC,EAAE,KAAa;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,0BAA0B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Knex } from 'knex';
2
+ import type { CriteriaPlan } from '@ddd-ts-kit/kernel';
3
+ /**
4
+ * Adds a criteria plan to a query on the table of a read model: its filters and the scope of
5
+ * the actor, the keyset of a cursor page, the total order and the window.
6
+ * `criteriaToKnex(db('appointment_list'), planCriteria(definition, criteria), columns)`, then
7
+ * `pageOfPlan(plan, rows)`. A field that may be null is ordered as the plan means it, on every
8
+ * dialect: nulls last ascending, first descending.
9
+ */
10
+ export declare function criteriaToKnex<Builder extends Knex.QueryBuilder>(builder: Builder, plan: CriteriaPlan, columns: Readonly<Record<string, string>>): Builder;
11
+ //# sourceMappingURL=criteria-to-knex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-to-knex.d.ts","sourceRoot":"","sources":["../../src/read-model/criteria-to-knex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,IAAI,CAAC,YAAY,EAC9D,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACxC,OAAO,CAqBT"}
@@ -0,0 +1,28 @@
1
+ import { columnOf } from './column-of.js';
2
+ import { predicateToKnex } from './predicate-to-knex.js';
3
+ /**
4
+ * Adds a criteria plan to a query on the table of a read model: its filters and the scope of
5
+ * the actor, the keyset of a cursor page, the total order and the window.
6
+ * `criteriaToKnex(db('appointment_list'), planCriteria(definition, criteria), columns)`, then
7
+ * `pageOfPlan(plan, rows)`. A field that may be null is ordered as the plan means it, on every
8
+ * dialect: nulls last ascending, first descending.
9
+ */
10
+ export function criteriaToKnex(builder, plan, columns) {
11
+ predicateToKnex(builder, plan.filter, columns);
12
+ predicateToKnex(builder, plan.seek, columns);
13
+ for (const { field, direction } of plan.sort) {
14
+ const column = columnOf(columns, field);
15
+ if (plan.fields[field]?.nullable === true) {
16
+ void builder.orderBy(column, direction, direction === 'asc' ? 'last' : 'first');
17
+ }
18
+ else {
19
+ void builder.orderBy(column, direction);
20
+ }
21
+ }
22
+ void builder.limit(plan.fetch);
23
+ if (plan.offset > 0) {
24
+ void builder.offset(plan.offset);
25
+ }
26
+ return builder;
27
+ }
28
+ //# sourceMappingURL=criteria-to-knex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-to-knex.js","sourceRoot":"","sources":["../../src/read-model/criteria-to-knex.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,IAAkB,EAClB,OAAyC;IAEzC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE7C,KAAK,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAExC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC1C,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface KnexReadModelOptions<Row> {
2
+ readonly table: string;
3
+ /** The schema of the context. Default: the default schema of the connection. */
4
+ readonly schema?: string;
5
+ /** The column of the key, which is the primary key of the table. Default `id`. */
6
+ readonly keyColumn?: string;
7
+ /** The column of every field of the row: `{ startsAt: 'starts_at' }`. */
8
+ readonly columns: Readonly<Record<keyof Row & string, string>>;
9
+ }
10
+ //# sourceMappingURL=knex-read-model-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-read-model-options.d.ts","sourceRoot":"","sources":["../../src/read-model/knex-read-model-options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB,CAAC,GAAG;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAChE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=knex-read-model-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-read-model-options.js","sourceRoot":"","sources":["../../src/read-model/knex-read-model-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { TableReadModelStore, type CriteriaDefinition } from '@ddd-ts-kit/kernel';
2
+ import type { KnexContext } from '../unit-of-work/knex-context.js';
3
+ import type { KnexReadModelOptions } from './knex-read-model-options.js';
4
+ export interface KnexReadModel<Row> extends KnexReadModelOptions<Row> {
5
+ /** What a read of the read model may filter and sort by. */
6
+ readonly definition: CriteriaDefinition<Row>;
7
+ }
8
+ /**
9
+ * The read model of a projection in a knex table. The adapter of a read model port extends
10
+ * it and adds nothing: `class KnexAppointmentList extends KnexReadModelStore<AppointmentRow>
11
+ * implements AppointmentList`. Its `table` is what a `ProjectionRebuild` takes.
12
+ */
13
+ export declare class KnexReadModelStore<Row extends object> extends TableReadModelStore<Row> {
14
+ constructor(context: KnexContext, { definition, ...options }: KnexReadModel<Row>);
15
+ }
16
+ //# sourceMappingURL=knex-read-model-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-read-model-store.d.ts","sourceRoot":"","sources":["../../src/read-model/knex-read-model-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,MAAM,WAAW,aAAa,CAAC,GAAG,CAAE,SAAQ,oBAAoB,CAAC,GAAG,CAAC;IACnE,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CAC9C;AAED;;;;GAIG;AACH,qBAAa,kBAAkB,CAAC,GAAG,SAAS,MAAM,CAAE,SAAQ,mBAAmB,CAAC,GAAG,CAAC;IAClF,YAAY,OAAO,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,EAE/E;CACF"}
@@ -0,0 +1,13 @@
1
+ import { TableReadModelStore } from '@ddd-ts-kit/kernel';
2
+ import { KnexReadModelTable } from './knex-read-model-table.js';
3
+ /**
4
+ * The read model of a projection in a knex table. The adapter of a read model port extends
5
+ * it and adds nothing: `class KnexAppointmentList extends KnexReadModelStore<AppointmentRow>
6
+ * implements AppointmentList`. Its `table` is what a `ProjectionRebuild` takes.
7
+ */
8
+ export class KnexReadModelStore extends TableReadModelStore {
9
+ constructor(context, { definition, ...options }) {
10
+ super(new KnexReadModelTable(context, options), definition);
11
+ }
12
+ }
13
+ //# sourceMappingURL=knex-read-model-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-read-model-store.js","sourceRoot":"","sources":["../../src/read-model/knex-read-model-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA2B,MAAM,oBAAoB,CAAC;AAGlF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAOhE;;;;GAIG;AACH,MAAM,OAAO,kBAAuC,SAAQ,mBAAwB;IAClF,YAAY,OAAoB,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,EAAsB;QAC9E,KAAK,CAAC,IAAI,kBAAkB,CAAM,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACnE,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 { KnexContext } from '../unit-of-work/knex-context.js';
3
+ import type { KnexReadModelOptions } from './knex-read-model-options.js';
4
+ /**
5
+ * The table of one read model on knex: what `TableReadModelStore` and `ProjectionRebuild` are
6
+ * given. Every statement runs on the executor of the context, so a write made by a projection
7
+ * commits with the processed mark of its event. The rebuild is PostgreSQL only.
8
+ */
9
+ export declare class KnexReadModelTable<Row extends object> implements ReadModelTable<Row> {
10
+ private readonly context;
11
+ private readonly options;
12
+ private readonly rows;
13
+ private readonly copy;
14
+ private readonly rebuild;
15
+ constructor(context: KnexContext, options: KnexReadModelOptions<Row>);
16
+ find(key: string): Promise<StampedRow<Row> | undefined>;
17
+ insert(entry: StampedRow<Row>): Promise<boolean>;
18
+ replace(entry: StampedRow<Row>, held: EventStamp): Promise<boolean>;
19
+ search(plan: CriteriaPlan): Promise<SearchedRows<Row>>;
20
+ rebuilding(): Promise<boolean>;
21
+ touch(key: string): Promise<void>;
22
+ beginRebuild(): Promise<void>;
23
+ shadow(): ReadModelRows<Row>;
24
+ touched(limit: number): Promise<readonly TouchedKey[]>;
25
+ settle(keys: readonly TouchedKey[]): Promise<void>;
26
+ holdWriters(): Promise<void>;
27
+ promote(): Promise<void>;
28
+ abandonRebuild(): Promise<void>;
29
+ /** knex writes its bindings `?`: the statements of the rebuild name each of theirs once, in order. */
30
+ private run;
31
+ }
32
+ //# sourceMappingURL=knex-read-model-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-read-model-table.d.ts","sourceRoot":"","sources":["../../src/read-model/knex-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,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAMzE;;;;GAIG;AACH,qBAAa,kBAAkB,CAAC,GAAG,SAAS,MAAM,CAAE,YAAW,cAAc,CAAC,GAAG,CAAC;IAQ9E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAE5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAE5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD,YACmB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAWpD;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,CAc3D;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;IAED,sGAAsG;YACxF,GAAG;CAQlB"}
@@ -0,0 +1,83 @@
1
+ import { PostgresReadModelRebuild, } from '@ddd-ts-kit/kernel';
2
+ import { criteriaToKnex } from './criteria-to-knex.js';
3
+ import { KnexStampedRows } from './knex-stamped-rows.js';
4
+ import { predicateToKnex } from './predicate-to-knex.js';
5
+ import { recordsOf } from './records-of.js';
6
+ import { RowMapper } from './row.mapper.js';
7
+ /**
8
+ * The table of one read model on knex: what `TableReadModelStore` and `ProjectionRebuild` are
9
+ * given. Every statement runs on the executor of the context, so a write made by a projection
10
+ * commits with the processed mark of its event. The rebuild is PostgreSQL only.
11
+ */
12
+ export class KnexReadModelTable {
13
+ context;
14
+ options;
15
+ rows;
16
+ copy;
17
+ rebuild;
18
+ constructor(context, options) {
19
+ this.context = context;
20
+ this.options = options;
21
+ const { table, schema } = options;
22
+ this.rows = new KnexStampedRows(context, options);
23
+ this.copy = new KnexStampedRows(context, { ...options, table: PostgresReadModelRebuild.shadowOf(table) });
24
+ this.rebuild = new PostgresReadModelRebuild((statement, parameters) => this.run(statement, parameters), {
25
+ table,
26
+ ...(schema === undefined ? {} : { schema }),
27
+ });
28
+ }
29
+ find(key) {
30
+ return this.rows.find(key);
31
+ }
32
+ insert(entry) {
33
+ return this.rows.insert(entry);
34
+ }
35
+ replace(entry, held) {
36
+ return this.rows.replace(entry, held);
37
+ }
38
+ async search(plan) {
39
+ const { columns } = this.options;
40
+ const mapper = new RowMapper(columns);
41
+ const kept = () => this.rows.table().where('deleted', false);
42
+ const answered = await criteriaToKnex(kept().select(Object.values(columns)), plan, columns);
43
+ const rows = recordsOf(answered).map((record) => mapper.toRow(record));
44
+ if (plan.kind === 'cursor') {
45
+ return { rows };
46
+ }
47
+ const counted = await predicateToKnex(kept(), plan.filter, columns).count({ total: '*' });
48
+ return { rows, total: Number(recordsOf(counted)[0]?.['total'] ?? 0) };
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
+ /** knex writes its bindings `?`: the statements of the rebuild name each of theirs once, in order. */
78
+ async run(statement, parameters) {
79
+ const result = await this.context.executor().raw(statement.replace(/\$\d+/g, '?'), [...parameters]);
80
+ return recordsOf(typeof result === 'object' && result !== null && 'rows' in result ? result.rows : []);
81
+ }
82
+ }
83
+ //# sourceMappingURL=knex-read-model-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-read-model-table.js","sourceRoot":"","sources":["../../src/read-model/knex-read-model-table.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAQzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAQV,OAAO;IACP,OAAO;IART,IAAI,CAAuB;IAE3B,IAAI,CAAuB;IAE3B,OAAO,CAA2B;IAEnD,YACmB,OAAoB,EACpB,OAAkC;uBADlC,OAAO;uBACP,OAAO;QAExB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAElC,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE1G,IAAI,CAAC,OAAO,GAAG,IAAI,wBAAwB,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;YACtG,KAAK;YACL,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,KAAsB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,KAAsB,EAAE,IAAgB;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAkB;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAM,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAY,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAS,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7G,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAY,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAEnG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,IAA2B;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,sGAAsG;IAC9F,KAAK,CAAC,GAAG,CACf,SAAiB,EACjB,UAAwC;QAExC,MAAM,MAAM,GAAY,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;QAE7G,OAAO,SAAS,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { Knex } from 'knex';
2
+ import type { EventStamp, ReadModelRows, StampedRow } from '@ddd-ts-kit/kernel';
3
+ import type { KnexContext } from '../unit-of-work/knex-context.js';
4
+ import type { KnexReadModelOptions } from './knex-read-model-options.js';
5
+ /** The stamped rows of one table, the copy of a rebuild as well as the table itself. */
6
+ export declare class KnexStampedRows<Row extends object> implements ReadModelRows<Row> {
7
+ private readonly context;
8
+ private readonly options;
9
+ private readonly mapper;
10
+ constructor(context: KnexContext, options: KnexReadModelOptions<Row>);
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
+ /** The table, on the executor of the current unit of work. */
15
+ table(): Knex.QueryBuilder;
16
+ private recordOf;
17
+ private keyColumn;
18
+ }
19
+ //# sourceMappingURL=knex-stamped-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-stamped-rows.d.ts","sourceRoot":"","sources":["../../src/read-model/knex-stamped-rows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAIzE,wFAAwF;AACxF,qBAAa,eAAe,CAAC,GAAG,SAAS,MAAM,CAAE,YAAW,aAAa,CAAC,GAAG,CAAC;IAI1E,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,YACmB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAGpD;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAmB5D;IAEK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CASrD;IAEK,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAQxE;IAED,8DAA8D;IAC9D,KAAK,IAAI,IAAI,CAAC,YAAY,CAKzB;IAED,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,68 @@
1
+ import { insertIgnoringConflict } from '../sql/insert-ignoring-conflict.js';
2
+ import { recordsOf } from './records-of.js';
3
+ import { RowMapper } from './row.mapper.js';
4
+ /** The stamped rows of one table, the copy of a rebuild as well as the table itself. */
5
+ export class KnexStampedRows {
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 answered = await this.table().where(this.keyColumn(), key).limit(1);
16
+ const [record] = recordsOf(answered);
17
+ if (record === undefined) {
18
+ return undefined;
19
+ }
20
+ const version = record['last_event_version'];
21
+ return {
22
+ key,
23
+ row: record['deleted'] === true ? undefined : this.mapper.toRow(record),
24
+ stamp: {
25
+ eventId: String(record['last_event_id']),
26
+ occurredAt: new Date(String(record['last_event_at'])),
27
+ ...(version === null || version === undefined ? {} : { version: Number(version) }),
28
+ },
29
+ };
30
+ }
31
+ async insert(entry) {
32
+ if (entry.row === undefined) {
33
+ return false;
34
+ }
35
+ return insertIgnoringConflict(this.context.executor(), this.table(), {
36
+ row: this.recordOf(entry),
37
+ conflict: this.keyColumn(),
38
+ });
39
+ }
40
+ async replace(entry, held) {
41
+ const replaced = await this.table()
42
+ .where(this.keyColumn(), entry.key)
43
+ .where('last_event_id', held.eventId)
44
+ .where('last_event_at', held.occurredAt)
45
+ .update(this.recordOf(entry));
46
+ return Number(replaced) === 1;
47
+ }
48
+ /** The table, on the executor of the current unit of work. */
49
+ table() {
50
+ const { table, schema } = this.options;
51
+ const builder = this.context.executor()(table);
52
+ return schema === undefined ? builder : builder.withSchema(schema);
53
+ }
54
+ recordOf({ key, row, stamp }) {
55
+ return {
56
+ ...(row === undefined ? {} : this.mapper.toRecord(row)),
57
+ [this.keyColumn()]: key,
58
+ last_event_id: stamp.eventId,
59
+ last_event_at: stamp.occurredAt,
60
+ last_event_version: stamp.version ?? null,
61
+ deleted: row === undefined,
62
+ };
63
+ }
64
+ keyColumn() {
65
+ return this.options.keyColumn ?? 'id';
66
+ }
67
+ }
68
+ //# sourceMappingURL=knex-stamped-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knex-stamped-rows.js","sourceRoot":"","sources":["../../src/read-model/knex-stamped-rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { FilterOperator } from '@ddd-ts-kit/kernel';
2
+ /** The `LIKE` pattern of a text search, the text itself taken literally: `%`, `_` and `\` are escaped by `\`. */
3
+ export declare function likePattern(operator: FilterOperator, text: string): string;
4
+ //# sourceMappingURL=like-pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"like-pattern.d.ts","sourceRoot":"","sources":["../../src/read-model/like-pattern.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,iHAAiH;AACjH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1E"}
@@ -0,0 +1,6 @@
1
+ /** The `LIKE` pattern of a text search, the text itself taken literally: `%`, `_` and `\` are escaped by `\`. */
2
+ export function likePattern(operator, text) {
3
+ const literal = text.replace(/[\\%_]/g, (special) => `\\${special}`);
4
+ return operator === 'startsWith' ? `${literal}%` : `%${literal}%`;
5
+ }
6
+ //# sourceMappingURL=like-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"like-pattern.js","sourceRoot":"","sources":["../../src/read-model/like-pattern.ts"],"names":[],"mappings":"AAEA,iHAAiH;AACjH,MAAM,UAAU,WAAW,CAAC,QAAwB,EAAE,IAAY;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAErE,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC;AACpE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Knex } from 'knex';
2
+ import type { Predicate } from '@ddd-ts-kit/kernel';
3
+ type Columns = Readonly<Record<string, string>>;
4
+ /**
5
+ * Adds a predicate of a criteria plan to a query, as one parenthesised condition. Every
6
+ * value is a binding and every column comes from the mapping of the adapter: nothing a caller
7
+ * wrote is ever part of the statement.
8
+ */
9
+ export declare function predicateToKnex<Builder extends Knex.QueryBuilder>(builder: Builder, predicate: Predicate | undefined, columns: Columns): Builder;
10
+ export {};
11
+ //# sourceMappingURL=predicate-to-knex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-to-knex.d.ts","sourceRoot":"","sources":["../../src/read-model/predicate-to-knex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAc,SAAS,EAAiB,MAAM,oBAAoB,CAAC;AAI/E,KAAK,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAIhD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,IAAI,CAAC,YAAY,EAC/D,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,OAAO,EAAE,OAAO,GACf,OAAO,CAUT"}
@@ -0,0 +1,63 @@
1
+ import { columnOf } from './column-of.js';
2
+ import { likePattern } from './like-pattern.js';
3
+ const COMPARISONS = { eq: '=', ne: '<>', gt: '>', gte: '>=', lt: '<', lte: '<=' };
4
+ /**
5
+ * Adds a predicate of a criteria plan to a query, as one parenthesised condition. Every
6
+ * value is a binding and every column comes from the mapping of the adapter: nothing a caller
7
+ * wrote is ever part of the statement.
8
+ */
9
+ export function predicateToKnex(builder, predicate, columns) {
10
+ if (predicate === undefined) {
11
+ return builder;
12
+ }
13
+ void builder.where((group) => {
14
+ held(group, predicate, columns);
15
+ });
16
+ return builder;
17
+ }
18
+ function held(builder, predicate, columns) {
19
+ if (predicate.kind === 'test') {
20
+ tested(builder, predicate, columnOf(columns, predicate.field));
21
+ return;
22
+ }
23
+ for (const part of predicate.parts) {
24
+ const nested = (group) => {
25
+ held(group, part, columns);
26
+ };
27
+ void (predicate.kind === 'and' ? builder.andWhere(nested) : builder.orWhere(nested));
28
+ }
29
+ }
30
+ function tested(builder, test, column) {
31
+ if (test.operator === 'isNull') {
32
+ void (test.value === true ? builder.whereNull(column) : builder.whereNotNull(column));
33
+ }
34
+ else if (test.negated) {
35
+ void builder.whereNot((refuted) => {
36
+ compared(refuted, test, column);
37
+ });
38
+ }
39
+ else {
40
+ compared(builder, test, column);
41
+ }
42
+ }
43
+ function compared(builder, { operator, value }, column) {
44
+ const values = typeof value === 'object' && !(value instanceof Date) ? [...value] : [value];
45
+ const [first = null, second = null] = values;
46
+ switch (operator) {
47
+ case 'in':
48
+ void builder.whereIn(column, values);
49
+ break;
50
+ case 'between':
51
+ void builder.whereBetween(column, [first, second]);
52
+ break;
53
+ case 'contains':
54
+ case 'startsWith':
55
+ void builder.whereRaw('?? like ? escape ?', [column, likePattern(operator, String(first)), '\\']);
56
+ break;
57
+ case 'isNull':
58
+ break;
59
+ default:
60
+ void builder.where(column, COMPARISONS[operator], first);
61
+ }
62
+ }
63
+ //# sourceMappingURL=predicate-to-knex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-to-knex.js","sourceRoot":"","sources":["../../src/read-model/predicate-to-knex.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;AAE3F;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,SAAgC,EAChC,OAAgB;IAEhB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,IAAI,CAAC,OAA0B,EAAE,SAAoB,EAAE,OAAgB;IAC9E,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/D,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,KAAwB,EAAQ,EAAE;YAChD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,OAA0B,EAAE,IAAmB,EAAE,MAAc;IAC7E,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAA0B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAiB,EAAE,MAAc;IAC9F,MAAM,MAAM,GAAiB,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1G,MAAM,CAAC,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;IAE7C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,SAAS;YACZ,KAAK,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,MAAM;QACR,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YACf,KAAK,OAAO,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAClG,MAAM;QACR,KAAK,QAAQ;YACX,MAAM;QACR;YACE,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Knex } from 'knex';
2
+ /**
3
+ * Adds to a read model table the columns a projection orders its events by, under the same
4
+ * names in every project: `last_event_id`, `last_event_at`, `last_event_version` and `deleted`,
5
+ * the trace a removed row leaves so that a late event does not bring it back.
6
+ */
7
+ export declare function readModelColumns(table: Knex.CreateTableBuilder): void;
8
+ //# sourceMappingURL=read-model-columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-model-columns.d.ts","sourceRoot":"","sources":["../../src/read-model/read-model-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAKrE"}
@@ -0,0 +1,14 @@
1
+ import { INDEXABLE_LENGTH } from '../columns/indexable-length.js';
2
+ import { INSTANT } from '../columns/instant.js';
3
+ /**
4
+ * Adds to a read model table the columns a projection orders its events by, under the same
5
+ * names in every project: `last_event_id`, `last_event_at`, `last_event_version` and `deleted`,
6
+ * the trace a removed row leaves so that a late event does not bring it back.
7
+ */
8
+ export function readModelColumns(table) {
9
+ table.string('last_event_id', INDEXABLE_LENGTH).notNullable();
10
+ table.datetime('last_event_at', INSTANT).notNullable();
11
+ table.bigInteger('last_event_version').nullable();
12
+ table.boolean('deleted').notNullable().defaultTo(false);
13
+ }
14
+ //# sourceMappingURL=read-model-columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-model-columns.js","sourceRoot":"","sources":["../../src/read-model/read-model-columns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA8B;IAC7D,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACvD,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** What a driver answered, as records: anything else is left out. */
2
+ export declare function recordsOf(answered: unknown): Readonly<Record<string, unknown>>[];
3
+ //# sourceMappingURL=records-of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-of.d.ts","sourceRoot":"","sources":["../../src/read-model/records-of.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAIhF"}
@@ -0,0 +1,9 @@
1
+ /** What a driver answered, as records: anything else is left out. */
2
+ export function recordsOf(answered) {
3
+ const records = Array.isArray(answered) ? answered : [];
4
+ return records.filter(isRecord);
5
+ }
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null;
8
+ }
9
+ //# sourceMappingURL=records-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-of.js","sourceRoot":"","sources":["../../src/read-model/records-of.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,UAAU,SAAS,CAAC,QAAiB;IACzC,MAAM,OAAO,GAAuB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5E,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Translates between the row of a read model, keyed by field, and the record of its table, keyed by column. */
2
+ export declare class RowMapper<Row extends object> {
3
+ private readonly columns;
4
+ constructor(columns: Readonly<Record<string, string>>);
5
+ toRow(record: Readonly<Record<string, unknown>>): Row;
6
+ toRecord(row: Row): Record<string, unknown>;
7
+ }
8
+ //# 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":"AAAA,gHAAgH;AAChH,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,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAIpD;IAED,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ1C;CACF"}
@@ -0,0 +1,17 @@
1
+ /** Translates between the row of a read model, keyed by field, and the record of its table, keyed by column. */
2
+ export class RowMapper {
3
+ columns;
4
+ constructor(columns) {
5
+ this.columns = columns;
6
+ }
7
+ toRow(record) {
8
+ return Object.fromEntries(Object.entries(this.columns).map(([field, column]) => [field, record[column] ?? null]));
9
+ }
10
+ toRecord(row) {
11
+ return Object.fromEntries(Object.entries(this.columns).map(([field, column]) => {
12
+ const value = Reflect.get(row, field);
13
+ return [column, value === undefined ? null : value];
14
+ }));
15
+ }
16
+ }
17
+ //# sourceMappingURL=row.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row.mapper.js","sourceRoot":"","sources":["../../src/read-model/row.mapper.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,MAAM,OAAO,SAAS;IACS,OAAO;IAApC,YAA6B,OAAyC;uBAAzC,OAAO;IAAqC,CAAC;IAE1E,KAAK,CAAC,MAAyC;QAC7C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAChF,CAAC;IACX,CAAC;IAED,QAAQ,CAAC,GAAQ;QACf,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE;YACnD,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAE/C,OAAO,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Knex } from 'knex';
2
+ import type { SqlDialect } from './sql-dialect.js';
3
+ export declare function dialectOf(knex: Knex): SqlDialect;
4
+ //# sourceMappingURL=dialect-of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect-of.d.ts","sourceRoot":"","sources":["../../src/sql/dialect-of.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAkBhD"}
@@ -0,0 +1,17 @@
1
+ export function dialectOf(knex) {
2
+ // `client.dialect` is the name knex itself gives the dialect, whatever driver is behind it.
3
+ const client = knex.client;
4
+ const name = typeof client === 'object' && client !== null && 'dialect' in client ? client.dialect : undefined;
5
+ switch (name) {
6
+ case 'postgresql':
7
+ case 'cockroachdb':
8
+ return 'postgres';
9
+ case 'mysql':
10
+ return 'mysql';
11
+ case 'sqlite3':
12
+ return 'sqlite';
13
+ default:
14
+ return 'other';
15
+ }
16
+ }
17
+ //# sourceMappingURL=dialect-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect-of.js","sourceRoot":"","sources":["../../src/sql/dialect-of.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,4FAA4F;IAC5F,MAAM,MAAM,GAAY,IAAI,CAAC,MAAM,CAAC;IAEpC,MAAM,IAAI,GACR,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpG,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC;QAClB,KAAK,aAAa;YAChB,OAAO,UAAU,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Knex } from 'knex';
2
+ export interface IgnoringInsert {
3
+ readonly row: Readonly<Record<string, unknown>>;
4
+ /** The column or columns of the key that may already exist. */
5
+ readonly conflict: string | readonly string[];
6
+ }
7
+ /**
8
+ * Inserts one row unless its key already exists, and says whether it did insert. Unlike
9
+ * catching the unique violation, it leaves the surrounding transaction usable on PostgreSQL.
10
+ * It serves the processed-event store and the first save of an aggregate alike.
11
+ *
12
+ * `table` is the query builder of the target table, built on `executor`:
13
+ * `insertIgnoringConflict(db, db('invoices').withSchema('billing'), { row, conflict: 'id' })`.
14
+ */
15
+ export declare function insertIgnoringConflict(executor: Knex, table: Knex.QueryBuilder, { row, conflict }: IgnoringInsert): Promise<boolean>;
16
+ //# sourceMappingURL=insert-ignoring-conflict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-ignoring-conflict.d.ts","sourceRoot":"","sources":["../../src/sql/insert-ignoring-conflict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,IAAI,EACd,KAAK,EAAE,IAAI,CAAC,YAAY,EACxB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,cAAc,GAChC,OAAO,CAAC,OAAO,CAAC,CAYlB"}