@quilla-be-kit/persistence-init-test 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 (211) hide show
  1. package/README.md +684 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/dao/audit-columns.d.ts +19 -0
  4. package/dist/dao/audit-columns.d.ts.map +1 -0
  5. package/dist/dao/audit-columns.js +26 -0
  6. package/dist/dao/audit-columns.js.map +1 -0
  7. package/dist/dao/base-read.dao.d.ts +50 -0
  8. package/dist/dao/base-read.dao.d.ts.map +1 -0
  9. package/dist/dao/base-read.dao.js +65 -0
  10. package/dist/dao/base-read.dao.js.map +1 -0
  11. package/dist/dao/base-write.dao.d.ts +49 -0
  12. package/dist/dao/base-write.dao.d.ts.map +1 -0
  13. package/dist/dao/base-write.dao.js +130 -0
  14. package/dist/dao/base-write.dao.js.map +1 -0
  15. package/dist/dao/index.d.ts +3 -0
  16. package/dist/dao/index.d.ts.map +1 -0
  17. package/dist/dao/index.js +3 -0
  18. package/dist/dao/index.js.map +1 -0
  19. package/dist/database/database-health.type.d.ts +4 -0
  20. package/dist/database/database-health.type.d.ts.map +1 -0
  21. package/dist/database/database-health.type.js +2 -0
  22. package/dist/database/database-health.type.js.map +1 -0
  23. package/dist/database/database-result.type.d.ts +5 -0
  24. package/dist/database/database-result.type.d.ts.map +1 -0
  25. package/dist/database/database-result.type.js +2 -0
  26. package/dist/database/database-result.type.js.map +1 -0
  27. package/dist/database/database-transaction.interface.d.ts +10 -0
  28. package/dist/database/database-transaction.interface.d.ts.map +1 -0
  29. package/dist/database/database-transaction.interface.js +2 -0
  30. package/dist/database/database-transaction.interface.js.map +1 -0
  31. package/dist/database/database.interface.d.ts +10 -0
  32. package/dist/database/database.interface.d.ts.map +1 -0
  33. package/dist/database/database.interface.js +2 -0
  34. package/dist/database/database.interface.js.map +1 -0
  35. package/dist/database/index.d.ts +5 -0
  36. package/dist/database/index.d.ts.map +1 -0
  37. package/dist/database/index.js +2 -0
  38. package/dist/database/index.js.map +1 -0
  39. package/dist/db-adapter/filter-query.type.d.ts +4 -0
  40. package/dist/db-adapter/filter-query.type.d.ts.map +1 -0
  41. package/dist/db-adapter/filter-query.type.js +2 -0
  42. package/dist/db-adapter/filter-query.type.js.map +1 -0
  43. package/dist/db-adapter/index.d.ts +4 -0
  44. package/dist/db-adapter/index.d.ts.map +1 -0
  45. package/dist/db-adapter/index.js +2 -0
  46. package/dist/db-adapter/index.js.map +1 -0
  47. package/dist/db-adapter/read-db-adapter.interface.d.ts +37 -0
  48. package/dist/db-adapter/read-db-adapter.interface.d.ts.map +1 -0
  49. package/dist/db-adapter/read-db-adapter.interface.js +2 -0
  50. package/dist/db-adapter/read-db-adapter.interface.js.map +1 -0
  51. package/dist/db-adapter/write-db-adapter.interface.d.ts +61 -0
  52. package/dist/db-adapter/write-db-adapter.interface.d.ts.map +1 -0
  53. package/dist/db-adapter/write-db-adapter.interface.js +2 -0
  54. package/dist/db-adapter/write-db-adapter.interface.js.map +1 -0
  55. package/dist/errors/cross-scope-access.error.d.ts +10 -0
  56. package/dist/errors/cross-scope-access.error.d.ts.map +1 -0
  57. package/dist/errors/cross-scope-access.error.js +15 -0
  58. package/dist/errors/cross-scope-access.error.js.map +1 -0
  59. package/dist/errors/index.d.ts +3 -0
  60. package/dist/errors/index.d.ts.map +1 -0
  61. package/dist/errors/index.js +3 -0
  62. package/dist/errors/index.js.map +1 -0
  63. package/dist/errors/optimistic-lock.error.d.ts +9 -0
  64. package/dist/errors/optimistic-lock.error.d.ts.map +1 -0
  65. package/dist/errors/optimistic-lock.error.js +11 -0
  66. package/dist/errors/optimistic-lock.error.js.map +1 -0
  67. package/dist/index.d.ts +8 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +8 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/postgres/index.d.ts +7 -0
  72. package/dist/postgres/index.d.ts.map +1 -0
  73. package/dist/postgres/index.js +7 -0
  74. package/dist/postgres/index.js.map +1 -0
  75. package/dist/postgres/pg-query-builder.d.ts +42 -0
  76. package/dist/postgres/pg-query-builder.d.ts.map +1 -0
  77. package/dist/postgres/pg-query-builder.js +260 -0
  78. package/dist/postgres/pg-query-builder.js.map +1 -0
  79. package/dist/postgres/pg-read-db-adapter.d.ts +20 -0
  80. package/dist/postgres/pg-read-db-adapter.d.ts.map +1 -0
  81. package/dist/postgres/pg-read-db-adapter.js +28 -0
  82. package/dist/postgres/pg-read-db-adapter.js.map +1 -0
  83. package/dist/postgres/pg-sql.d.ts +44 -0
  84. package/dist/postgres/pg-sql.d.ts.map +1 -0
  85. package/dist/postgres/pg-sql.js +128 -0
  86. package/dist/postgres/pg-sql.js.map +1 -0
  87. package/dist/postgres/pg-write-db-adapter.d.ts +30 -0
  88. package/dist/postgres/pg-write-db-adapter.d.ts.map +1 -0
  89. package/dist/postgres/pg-write-db-adapter.js +133 -0
  90. package/dist/postgres/pg-write-db-adapter.js.map +1 -0
  91. package/dist/postgres/pg.database.d.ts +25 -0
  92. package/dist/postgres/pg.database.d.ts.map +1 -0
  93. package/dist/postgres/pg.database.js +48 -0
  94. package/dist/postgres/pg.database.js.map +1 -0
  95. package/dist/postgres/pg.transaction.d.ts +22 -0
  96. package/dist/postgres/pg.transaction.d.ts.map +1 -0
  97. package/dist/postgres/pg.transaction.js +78 -0
  98. package/dist/postgres/pg.transaction.js.map +1 -0
  99. package/dist/query/case.d.ts +3 -0
  100. package/dist/query/case.d.ts.map +1 -0
  101. package/dist/query/case.js +7 -0
  102. package/dist/query/case.js.map +1 -0
  103. package/dist/query/column-resolver.interface.d.ts +4 -0
  104. package/dist/query/column-resolver.interface.d.ts.map +1 -0
  105. package/dist/query/column-resolver.interface.js +2 -0
  106. package/dist/query/column-resolver.interface.js.map +1 -0
  107. package/dist/query/default.resolver.d.ts +10 -0
  108. package/dist/query/default.resolver.d.ts.map +1 -0
  109. package/dist/query/default.resolver.js +14 -0
  110. package/dist/query/default.resolver.js.map +1 -0
  111. package/dist/query/field-descriptor.type.d.ts +11 -0
  112. package/dist/query/field-descriptor.type.d.ts.map +1 -0
  113. package/dist/query/field-descriptor.type.js +20 -0
  114. package/dist/query/field-descriptor.type.js.map +1 -0
  115. package/dist/query/filter-query.type.d.ts +4 -0
  116. package/dist/query/filter-query.type.d.ts.map +1 -0
  117. package/dist/query/filter-query.type.js +2 -0
  118. package/dist/query/filter-query.type.js.map +1 -0
  119. package/dist/query/index.d.ts +9 -0
  120. package/dist/query/index.d.ts.map +1 -0
  121. package/dist/query/index.js +3 -0
  122. package/dist/query/index.js.map +1 -0
  123. package/dist/query/list-query.type.d.ts +12 -0
  124. package/dist/query/list-query.type.d.ts.map +1 -0
  125. package/dist/query/list-query.type.js +2 -0
  126. package/dist/query/list-query.type.js.map +1 -0
  127. package/dist/query/paginated-result.type.d.ts +7 -0
  128. package/dist/query/paginated-result.type.d.ts.map +1 -0
  129. package/dist/query/paginated-result.type.js +2 -0
  130. package/dist/query/paginated-result.type.js.map +1 -0
  131. package/dist/query/query-product.type.d.ts +6 -0
  132. package/dist/query/query-product.type.d.ts.map +1 -0
  133. package/dist/query/query-product.type.js +2 -0
  134. package/dist/query/query-product.type.js.map +1 -0
  135. package/dist/query/read-query-builder.interface.d.ts +17 -0
  136. package/dist/query/read-query-builder.interface.d.ts.map +1 -0
  137. package/dist/query/read-query-builder.interface.js +2 -0
  138. package/dist/query/read-query-builder.interface.js.map +1 -0
  139. package/dist/query/sql-query-builder.interface.d.ts +99 -0
  140. package/dist/query/sql-query-builder.interface.d.ts.map +1 -0
  141. package/dist/query/sql-query-builder.interface.js +2 -0
  142. package/dist/query/sql-query-builder.interface.js.map +1 -0
  143. package/dist/query/sql-statement.type.d.ts +5 -0
  144. package/dist/query/sql-statement.type.d.ts.map +1 -0
  145. package/dist/query/sql-statement.type.js +2 -0
  146. package/dist/query/sql-statement.type.js.map +1 -0
  147. package/dist/query/write-query-builder.interface.d.ts +34 -0
  148. package/dist/query/write-query-builder.interface.d.ts.map +1 -0
  149. package/dist/query/write-query-builder.interface.js +2 -0
  150. package/dist/query/write-query-builder.interface.js.map +1 -0
  151. package/dist/query-schema/field-descriptor-from-zod.d.ts +4 -0
  152. package/dist/query-schema/field-descriptor-from-zod.d.ts.map +1 -0
  153. package/dist/query-schema/field-descriptor-from-zod.js +31 -0
  154. package/dist/query-schema/field-descriptor-from-zod.js.map +1 -0
  155. package/dist/query-schema/index.d.ts +3 -0
  156. package/dist/query-schema/index.d.ts.map +1 -0
  157. package/dist/query-schema/index.js +3 -0
  158. package/dist/query-schema/index.js.map +1 -0
  159. package/dist/query-schema/zod.d.ts +73 -0
  160. package/dist/query-schema/zod.d.ts.map +1 -0
  161. package/dist/query-schema/zod.js +191 -0
  162. package/dist/query-schema/zod.js.map +1 -0
  163. package/dist/repository/base-aggregate.repository.d.ts +28 -0
  164. package/dist/repository/base-aggregate.repository.d.ts.map +1 -0
  165. package/dist/repository/base-aggregate.repository.js +49 -0
  166. package/dist/repository/base-aggregate.repository.js.map +1 -0
  167. package/dist/repository/base-basic.repository.d.ts +22 -0
  168. package/dist/repository/base-basic.repository.d.ts.map +1 -0
  169. package/dist/repository/base-basic.repository.js +30 -0
  170. package/dist/repository/base-basic.repository.js.map +1 -0
  171. package/dist/repository/base-persistence.mapper.d.ts +61 -0
  172. package/dist/repository/base-persistence.mapper.d.ts.map +1 -0
  173. package/dist/repository/base-persistence.mapper.js +119 -0
  174. package/dist/repository/base-persistence.mapper.js.map +1 -0
  175. package/dist/repository/base-scoped-aggregate.repository.d.ts +19 -0
  176. package/dist/repository/base-scoped-aggregate.repository.d.ts.map +1 -0
  177. package/dist/repository/base-scoped-aggregate.repository.js +35 -0
  178. package/dist/repository/base-scoped-aggregate.repository.js.map +1 -0
  179. package/dist/repository/base-unscoped-aggregate.repository.d.ts +17 -0
  180. package/dist/repository/base-unscoped-aggregate.repository.d.ts.map +1 -0
  181. package/dist/repository/base-unscoped-aggregate.repository.js +21 -0
  182. package/dist/repository/base-unscoped-aggregate.repository.js.map +1 -0
  183. package/dist/repository/index.d.ts +7 -0
  184. package/dist/repository/index.d.ts.map +1 -0
  185. package/dist/repository/index.js +6 -0
  186. package/dist/repository/index.js.map +1 -0
  187. package/dist/repository/mapper.interface.d.ts +5 -0
  188. package/dist/repository/mapper.interface.d.ts.map +1 -0
  189. package/dist/repository/mapper.interface.js +2 -0
  190. package/dist/repository/mapper.interface.js.map +1 -0
  191. package/dist/unit-of-work/event-sink.interface.d.ts +5 -0
  192. package/dist/unit-of-work/event-sink.interface.d.ts.map +1 -0
  193. package/dist/unit-of-work/event-sink.interface.js +2 -0
  194. package/dist/unit-of-work/event-sink.interface.js.map +1 -0
  195. package/dist/unit-of-work/index.d.ts +4 -0
  196. package/dist/unit-of-work/index.d.ts.map +1 -0
  197. package/dist/unit-of-work/index.js +2 -0
  198. package/dist/unit-of-work/index.js.map +1 -0
  199. package/dist/unit-of-work/outbox-writer.interface.d.ts +14 -0
  200. package/dist/unit-of-work/outbox-writer.interface.d.ts.map +1 -0
  201. package/dist/unit-of-work/outbox-writer.interface.js +2 -0
  202. package/dist/unit-of-work/outbox-writer.interface.js.map +1 -0
  203. package/dist/unit-of-work/unit-of-work-context.type.d.ts +8 -0
  204. package/dist/unit-of-work/unit-of-work-context.type.d.ts.map +1 -0
  205. package/dist/unit-of-work/unit-of-work-context.type.js +2 -0
  206. package/dist/unit-of-work/unit-of-work-context.type.js.map +1 -0
  207. package/dist/unit-of-work/unit-of-work.d.ts +20 -0
  208. package/dist/unit-of-work/unit-of-work.d.ts.map +1 -0
  209. package/dist/unit-of-work/unit-of-work.js +60 -0
  210. package/dist/unit-of-work/unit-of-work.js.map +1 -0
  211. package/package.json +83 -0
@@ -0,0 +1,133 @@
1
+ import { PgColumnTypeCache, buildWhere, mapPostgresType, runSelect } from './pg-sql.js';
2
+ const TIMESTAMP_LITERAL = `date_trunc('milliseconds', CURRENT_TIMESTAMP)`;
3
+ const timestampComparison = (paramIndex) => `date_trunc('milliseconds', $${paramIndex}::timestamptz)`;
4
+ /**
5
+ * Postgres `WriteDbAdapter`. Resolves column types once per table via
6
+ * `PgColumnTypeCache`, emits explicit parameter casts, JSON.stringify's
7
+ * JSONB values, and renders millisecond-truncated timestamps so
8
+ * optimistic-lock comparisons round-trip with JS `Date`.
9
+ *
10
+ * Accepts an optional shared `PgColumnTypeCache` so a sibling
11
+ * `PgReadDbAdapter` can share the same type cache (one info-schema fetch
12
+ * per table, regardless of which adapter hits it first).
13
+ */
14
+ export class PgWriteDbAdapter {
15
+ columnTypes;
16
+ constructor(db, columnTypeCache) {
17
+ this.columnTypes = columnTypeCache ?? new PgColumnTypeCache(db);
18
+ this.db = db;
19
+ }
20
+ db;
21
+ async insert(opts, trx) {
22
+ if (opts.rows.length === 0) {
23
+ return { rows: [], rowCount: 0 };
24
+ }
25
+ const types = await this.columnTypes.get(opts.table);
26
+ const firstRow = opts.rows[0];
27
+ const keys = Object.keys(firstRow);
28
+ const values = [];
29
+ const rowPlaceholders = [];
30
+ for (const row of opts.rows) {
31
+ const rowData = row;
32
+ const placeholders = keys.map((key) => {
33
+ values.push(serializeValue(types[key], rowData[key]));
34
+ return `$${values.length}::${mapPostgresType(types[key])}`;
35
+ });
36
+ rowPlaceholders.push(`(${placeholders.join(', ')}, ${TIMESTAMP_LITERAL}, ${TIMESTAMP_LITERAL})`);
37
+ }
38
+ const allColumns = [...keys, 'created_at', 'updated_at'].join(', ');
39
+ const returning = buildReturning(opts.returning);
40
+ const sql = `INSERT INTO ${opts.table} (${allColumns}) VALUES ${rowPlaceholders.join(', ')}${returning}`;
41
+ return this.db.query(sql, values, trx);
42
+ }
43
+ async update(opts, trx) {
44
+ const types = await this.columnTypes.get(opts.table);
45
+ const setKeys = Object.keys(opts.set);
46
+ const values = [];
47
+ const setClauses = setKeys.map((key) => {
48
+ values.push(serializeValue(types[key], opts.set[key]));
49
+ return `${key} = $${values.length}::${mapPostgresType(types[key])}`;
50
+ });
51
+ setClauses.push(`updated_at = ${TIMESTAMP_LITERAL}`);
52
+ const where = buildWhere(opts.where, types, values.length);
53
+ values.push(...where.values);
54
+ let whereSql = where.sql;
55
+ if (opts.optimisticLock) {
56
+ values.push(opts.optimisticLock.expected instanceof Date
57
+ ? opts.optimisticLock.expected.toISOString()
58
+ : opts.optimisticLock.expected);
59
+ whereSql += ` AND ${opts.optimisticLock.column} = ${timestampComparison(values.length)}`;
60
+ }
61
+ const returning = buildReturning(opts.returning);
62
+ const sql = `UPDATE ${opts.table} SET ${setClauses.join(', ')} WHERE ${whereSql}${returning}`;
63
+ return this.db.query(sql, values, trx);
64
+ }
65
+ async updateMany(opts, trx) {
66
+ if (opts.rows.length === 0) {
67
+ return { rows: [], rowCount: 0 };
68
+ }
69
+ const types = await this.columnTypes.get(opts.table);
70
+ const firstRow = opts.rows[0];
71
+ const allKeys = Object.keys(firstRow);
72
+ const setKeys = allKeys.filter((key) => key !== 'id');
73
+ if (setKeys.length === 0) {
74
+ return { rows: [], rowCount: 0 };
75
+ }
76
+ const values = [];
77
+ const rowPlaceholders = [];
78
+ for (const row of opts.rows) {
79
+ const rowData = row;
80
+ const setPlaceholders = setKeys.map((key) => {
81
+ values.push(serializeValue(types[key], rowData[key]));
82
+ return `$${values.length}::${mapPostgresType(types[key])}`;
83
+ });
84
+ values.push(rowData.id);
85
+ rowPlaceholders.push(`(${setPlaceholders.join(', ')}, $${values.length}::${mapPostgresType(types.id)})`);
86
+ }
87
+ const setClauses = setKeys.map((key) => `${key} = data.${key}`);
88
+ setClauses.push(`updated_at = ${TIMESTAMP_LITERAL}`);
89
+ const dataColumns = [...setKeys, 'id'].join(', ');
90
+ const sql = `UPDATE ${opts.table} AS t SET ${setClauses.join(', ')} FROM (VALUES ${rowPlaceholders.join(', ')}) AS data(${dataColumns}) WHERE t.id = data.id`;
91
+ return this.db.query(sql, values, trx);
92
+ }
93
+ async delete(opts, trx) {
94
+ const types = await this.columnTypes.get(opts.table);
95
+ const where = buildWhere(opts.where, types);
96
+ const sql = `DELETE FROM ${opts.table} WHERE ${where.sql}`;
97
+ return this.db.query(sql, where.values, trx);
98
+ }
99
+ async find(opts, trx) {
100
+ const result = await this.executeSelect(opts, false, trx);
101
+ return result.rows;
102
+ }
103
+ async findForUpdate(opts, trx) {
104
+ const result = await this.executeSelect(opts, true, trx);
105
+ return result.rows;
106
+ }
107
+ async exists(opts, trx) {
108
+ const types = await this.columnTypes.get(opts.table);
109
+ const where = buildWhere(opts.where, types);
110
+ const sql = `SELECT 1 FROM ${opts.table} WHERE ${where.sql} LIMIT 1`;
111
+ const result = await this.db.query(sql, where.values, trx);
112
+ return result.rows.length > 0;
113
+ }
114
+ async executeSelect(opts, forUpdate, trx) {
115
+ const types = await this.columnTypes.get(opts.table);
116
+ return runSelect(this.db, opts, types, { forUpdate, trx });
117
+ }
118
+ }
119
+ function buildReturning(returning) {
120
+ if (!returning || returning.length === 0)
121
+ return '';
122
+ return ` RETURNING ${returning.join(', ')}`;
123
+ }
124
+ function serializeValue(dataType, value) {
125
+ if (value === null || value === undefined)
126
+ return value;
127
+ const lower = dataType?.toLowerCase();
128
+ if (lower === 'jsonb' || lower === 'json') {
129
+ return typeof value === 'string' ? value : JSON.stringify(value);
130
+ }
131
+ return value;
132
+ }
133
+ //# sourceMappingURL=pg-write-db-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-write-db-adapter.js","sourceRoot":"","sources":["../../src/postgres/pg-write-db-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Pool, type PoolConfig } from 'pg';
2
+ import type { DatabaseHealth } from '../database/database-health.type.js';
3
+ import type { DatabaseResult } from '../database/database-result.type.js';
4
+ import type { DatabaseTransaction } from '../database/database-transaction.interface.js';
5
+ import type { Database } from '../database/database.interface.js';
6
+ export type PgDatabaseOptions = PoolConfig | {
7
+ readonly pool: Pool;
8
+ };
9
+ /**
10
+ * Postgres implementation of `Database`. Accepts either a `PoolConfig` (the
11
+ * adapter creates and owns the pool) or `{ pool }` (the caller owns it —
12
+ * useful for sharing one `pg.Pool` with `PgLocalOutbox` / `PgEventBus` /
13
+ * other Postgres adapters). When the pool is caller-owned, `disconnect()`
14
+ * is a no-op; register `pool.end()` yourself on a `ShutdownManager`.
15
+ */
16
+ export declare class PgDatabase implements Database {
17
+ private readonly pool;
18
+ private readonly ownsPool;
19
+ constructor(options: PgDatabaseOptions);
20
+ query(sql: string, params?: readonly unknown[], trx?: DatabaseTransaction): Promise<DatabaseResult>;
21
+ getDbTransaction(): Promise<DatabaseTransaction>;
22
+ disconnect(): Promise<void>;
23
+ healthCheck(): Promise<DatabaseHealth>;
24
+ }
25
+ //# sourceMappingURL=pg.database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.database.d.ts","sourceRoot":"","sources":["../../src/postgres/pg.database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE;;;;;;GAMG;AACH,qBAAa,UAAW,YAAW,QAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,OAAO,EAAE,iBAAiB;IAUhC,KAAK,CACT,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,SAAS,OAAO,EAAO,EAC/B,GAAG,CAAC,EAAE,mBAAmB,GACxB,OAAO,CAAC,cAAc,CAAC;IAWpB,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKhD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;CAK7C"}
@@ -0,0 +1,48 @@
1
+ import { Pool } from 'pg';
2
+ import { PgTransaction } from './pg.transaction.js';
3
+ /**
4
+ * Postgres implementation of `Database`. Accepts either a `PoolConfig` (the
5
+ * adapter creates and owns the pool) or `{ pool }` (the caller owns it —
6
+ * useful for sharing one `pg.Pool` with `PgLocalOutbox` / `PgEventBus` /
7
+ * other Postgres adapters). When the pool is caller-owned, `disconnect()`
8
+ * is a no-op; register `pool.end()` yourself on a `ShutdownManager`.
9
+ */
10
+ export class PgDatabase {
11
+ pool;
12
+ ownsPool;
13
+ constructor(options) {
14
+ if ('pool' in options) {
15
+ this.pool = options.pool;
16
+ this.ownsPool = false;
17
+ }
18
+ else {
19
+ this.pool = new Pool(options);
20
+ this.ownsPool = true;
21
+ }
22
+ }
23
+ async query(sql, params = [], trx) {
24
+ if (trx) {
25
+ return trx.query(sql, params);
26
+ }
27
+ const result = await this.pool.query(sql, params);
28
+ return {
29
+ rows: result.rows,
30
+ rowCount: result.rowCount ?? 0,
31
+ };
32
+ }
33
+ async getDbTransaction() {
34
+ const client = await this.pool.connect();
35
+ return new PgTransaction(client);
36
+ }
37
+ async disconnect() {
38
+ if (this.ownsPool) {
39
+ await this.pool.end();
40
+ }
41
+ }
42
+ async healthCheck() {
43
+ const result = await this.pool.query('SELECT version() AS version');
44
+ const version = String(result.rows[0]?.version ?? 'unknown');
45
+ return { version };
46
+ }
47
+ }
48
+ //# sourceMappingURL=pg.database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.database.js","sourceRoot":"","sources":["../../src/postgres/pg.database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,IAAI,CAAC;AAK3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IACJ,IAAI,CAAO;IACX,QAAQ,CAAU;IAEnC,YAAY,OAA0B;QACpC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CACT,GAAW,EACX,SAA6B,EAAE,EAC/B,GAAyB;QAEzB,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAmB,CAAC,CAAC;QAC/D,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAA0C;YACvD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { PoolClient } from 'pg';
2
+ import type { DatabaseResult } from '../database/database-result.type.js';
3
+ import type { DatabaseTransaction } from '../database/database-transaction.interface.js';
4
+ /**
5
+ * Postgres `DatabaseTransaction` backed by a `pg.PoolClient`. Tracks its
6
+ * own lifecycle explicitly (NotStarted → Active → Committed | RolledBack)
7
+ * so callers can't commit twice, query a committed transaction, etc.
8
+ * `release()` warns if called while the transaction is still Active —
9
+ * that's almost always a bug (UoW should commit or rollback before release).
10
+ */
11
+ export declare class PgTransaction implements DatabaseTransaction {
12
+ private readonly client;
13
+ private state;
14
+ constructor(client: PoolClient);
15
+ get isActive(): boolean;
16
+ start(): Promise<void>;
17
+ query(sql: string, params?: readonly unknown[]): Promise<DatabaseResult>;
18
+ commit(): Promise<void>;
19
+ rollback(_reason: Error): Promise<void>;
20
+ release(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=pg.transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.transaction.d.ts","sourceRoot":"","sources":["../../src/postgres/pg.transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AASzF;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,mBAAmB;IAG3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,KAAK,CAAiD;gBAEjC,MAAM,EAAE,UAAU;IAE/C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,OAAO,EAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAW5E,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvB,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAevC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAS/B"}
@@ -0,0 +1,78 @@
1
+ var TransactionState;
2
+ (function (TransactionState) {
3
+ TransactionState[TransactionState["NotStarted"] = 0] = "NotStarted";
4
+ TransactionState[TransactionState["Active"] = 1] = "Active";
5
+ TransactionState[TransactionState["Committed"] = 2] = "Committed";
6
+ TransactionState[TransactionState["RolledBack"] = 3] = "RolledBack";
7
+ })(TransactionState || (TransactionState = {}));
8
+ /**
9
+ * Postgres `DatabaseTransaction` backed by a `pg.PoolClient`. Tracks its
10
+ * own lifecycle explicitly (NotStarted → Active → Committed | RolledBack)
11
+ * so callers can't commit twice, query a committed transaction, etc.
12
+ * `release()` warns if called while the transaction is still Active —
13
+ * that's almost always a bug (UoW should commit or rollback before release).
14
+ */
15
+ export class PgTransaction {
16
+ client;
17
+ state = TransactionState.NotStarted;
18
+ constructor(client) {
19
+ this.client = client;
20
+ }
21
+ get isActive() {
22
+ return this.state === TransactionState.Active;
23
+ }
24
+ async start() {
25
+ if (this.state !== TransactionState.NotStarted) {
26
+ throw new Error('Transaction already started or completed');
27
+ }
28
+ await this.client.query('BEGIN');
29
+ this.state = TransactionState.Active;
30
+ }
31
+ async query(sql, params = []) {
32
+ if (this.state !== TransactionState.Active) {
33
+ throw new Error('Transaction is not active');
34
+ }
35
+ const result = await this.client.query(sql, params);
36
+ return {
37
+ rows: result.rows,
38
+ rowCount: result.rowCount ?? 0,
39
+ };
40
+ }
41
+ async commit() {
42
+ if (this.state !== TransactionState.Active) {
43
+ throw new Error('No active transaction to commit');
44
+ }
45
+ try {
46
+ await this.client.query('COMMIT');
47
+ this.state = TransactionState.Committed;
48
+ }
49
+ catch (cause) {
50
+ throw new Error('Transaction commit failed', { cause });
51
+ }
52
+ }
53
+ async rollback(_reason) {
54
+ if (this.state !== TransactionState.Active) {
55
+ // Already committed / rolled back / never started — nothing to do.
56
+ // The caller (UoW) invokes rollback defensively in `catch`, so
57
+ // double-rollback must be a no-op rather than an error.
58
+ return;
59
+ }
60
+ try {
61
+ await this.client.query('ROLLBACK');
62
+ this.state = TransactionState.RolledBack;
63
+ }
64
+ catch (cause) {
65
+ throw new Error('Transaction rollback failed', { cause });
66
+ }
67
+ }
68
+ async release() {
69
+ if (this.state === TransactionState.Active) {
70
+ // Releasing a still-active transaction returns the client to the pool
71
+ // with an open BEGIN — subsequent work on that connection will observe
72
+ // uncommitted state. Almost always a bug.
73
+ console.warn('PgTransaction.release() called while transaction is still active');
74
+ }
75
+ this.client.release();
76
+ }
77
+ }
78
+ //# sourceMappingURL=pg.transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.transaction.js","sourceRoot":"","sources":["../../src/postgres/pg.transaction.ts"],"names":[],"mappings":"AAIA,IAAK,gBAKJ;AALD,WAAK,gBAAgB;IACnB,mEAAc,CAAA;IACd,2DAAU,CAAA;IACV,iEAAa,CAAA;IACb,mEAAc,CAAA;AAChB,CAAC,EALI,gBAAgB,KAAhB,gBAAgB,QAKpB;AAED;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAGK;IAFrB,KAAK,GAAqB,gBAAgB,CAAC,UAAU,CAAC;IAE9D,YAA6B,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAEnD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,MAAM,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,UAAU,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,SAA6B,EAAE;QACtD,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAmB,CAAC,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAA0C;YACvD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAc;QAC3B,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC3C,mEAAmE;YACnE,+DAA+D;YAC/D,wDAAwD;YACxD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC3C,sEAAsE;YACtE,uEAAuE;YACvE,0CAA0C;YAC1C,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare function camelToSnake(s: string): string;
2
+ export declare function snakeToCamel(s: string): string;
3
+ //# sourceMappingURL=case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case.d.ts","sourceRoot":"","sources":["../../src/query/case.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,7 @@
1
+ export function camelToSnake(s) {
2
+ return s.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase();
3
+ }
4
+ export function snakeToCamel(s) {
5
+ return s.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());
6
+ }
7
+ //# sourceMappingURL=case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case.js","sourceRoot":"","sources":["../../src/query/case.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface ColumnResolver {
2
+ resolve(domainKey: string): string;
3
+ }
4
+ //# sourceMappingURL=column-resolver.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-resolver.interface.d.ts","sourceRoot":"","sources":["../../src/query/column-resolver.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=column-resolver.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-resolver.interface.js","sourceRoot":"","sources":["../../src/query/column-resolver.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { ColumnResolver } from './column-resolver.interface.js';
2
+ export type DefaultColumnResolverOptions = {
3
+ readonly overrides?: Readonly<Record<string, string>>;
4
+ };
5
+ export declare class DefaultColumnResolver implements ColumnResolver {
6
+ private readonly overrides;
7
+ constructor(options?: DefaultColumnResolverOptions);
8
+ resolve(domainKey: string): string;
9
+ }
10
+ //# sourceMappingURL=default.resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.resolver.d.ts","sourceRoot":"","sources":["../../src/query/default.resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;gBAEjD,OAAO,GAAE,4BAAiC;IAItD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAKnC"}
@@ -0,0 +1,14 @@
1
+ import { camelToSnake } from './case.js';
2
+ export class DefaultColumnResolver {
3
+ overrides;
4
+ constructor(options = {}) {
5
+ this.overrides = options.overrides ?? {};
6
+ }
7
+ resolve(domainKey) {
8
+ const override = this.overrides[domainKey];
9
+ if (override !== undefined)
10
+ return override;
11
+ return camelToSnake(domainKey);
12
+ }
13
+ }
14
+ //# sourceMappingURL=default.resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.resolver.js","sourceRoot":"","sources":["../../src/query/default.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAOzC,MAAM,OAAO,qBAAqB;IACf,SAAS,CAAmC;IAE7D,YAAY,UAAwC,EAAE;QACpD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export type FieldKind = 'string' | 'number' | 'boolean' | 'date';
2
+ export declare const ALL_FILTER_OPERATORS: readonly ["eq", "contains", "in", "notIn", "gt", "gte", "lt", "lte", "isNull", "isNotNull"];
3
+ export type FilterOperator = (typeof ALL_FILTER_OPERATORS)[number];
4
+ export type FieldDescriptor = {
5
+ readonly kind: FieldKind;
6
+ readonly optional?: boolean;
7
+ };
8
+ export type FieldDescriptorMap = Readonly<Record<string, FieldDescriptor>>;
9
+ export declare const OPERATORS_BY_KIND: Readonly<Record<FieldKind, readonly FilterOperator[]>>;
10
+ export declare const FILTER_DELIMITER = "__";
11
+ //# sourceMappingURL=field-descriptor.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-descriptor.type.d.ts","sourceRoot":"","sources":["../../src/query/field-descriptor.type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,eAAO,MAAM,oBAAoB,6FAWvB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;AAE3E,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC,CAKpF,CAAC;AAEF,eAAO,MAAM,gBAAgB,OAAO,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const ALL_FILTER_OPERATORS = [
2
+ 'eq',
3
+ 'contains',
4
+ 'in',
5
+ 'notIn',
6
+ 'gt',
7
+ 'gte',
8
+ 'lt',
9
+ 'lte',
10
+ 'isNull',
11
+ 'isNotNull',
12
+ ];
13
+ export const OPERATORS_BY_KIND = {
14
+ string: ['contains', 'in', 'notIn', 'isNull', 'isNotNull'],
15
+ number: ['gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'isNull', 'isNotNull'],
16
+ date: ['gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'isNull', 'isNotNull'],
17
+ boolean: ['isNull', 'isNotNull'],
18
+ };
19
+ export const FILTER_DELIMITER = '__';
20
+ //# sourceMappingURL=field-descriptor.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-descriptor.type.js","sourceRoot":"","sources":["../../src/query/field-descriptor.type.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI;IACJ,UAAU;IACV,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,QAAQ;IACR,WAAW;CACH,CAAC;AAWX,MAAM,CAAC,MAAM,iBAAiB,GAA2D;IACvF,MAAM,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;IAC1D,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;IACxE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;IACtE,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type FilterQuery<T> = {
2
+ readonly [K in keyof T]?: T[K] | readonly T[K][];
3
+ };
4
+ //# sourceMappingURL=filter-query.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-query.type.d.ts","sourceRoot":"","sources":["../../src/query/filter-query.type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;CACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=filter-query.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-query.type.js","sourceRoot":"","sources":["../../src/query/filter-query.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export type { QueryProduct } from './query-product.type.js';
2
+ export type { PaginatedResult } from './paginated-result.type.js';
3
+ export type { PaginationOptions, SortDirection, SortOption, StandardListQuery, } from './list-query.type.js';
4
+ export type { FieldDescriptor, FieldDescriptorMap, FieldKind, FilterOperator, } from './field-descriptor.type.js';
5
+ export { ALL_FILTER_OPERATORS, OPERATORS_BY_KIND, FILTER_DELIMITER, } from './field-descriptor.type.js';
6
+ export type { ColumnResolver } from './column-resolver.interface.js';
7
+ export { DefaultColumnResolver, type DefaultColumnResolverOptions } from './default.resolver.js';
8
+ export type { OrderByOptions, PaginateOptions, SqlQueryBuilder, } from './sql-query-builder.interface.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,KAAK,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACjG,YAAY,EACV,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ALL_FILTER_OPERATORS, OPERATORS_BY_KIND, FILTER_DELIMITER, } from './field-descriptor.type.js';
2
+ export { DefaultColumnResolver } from './default.resolver.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,qBAAqB,EAAqC,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type SortDirection = 'asc' | 'desc';
2
+ export type SortOption = Readonly<Record<string, SortDirection>>;
3
+ export type PaginationOptions = {
4
+ readonly page: number;
5
+ readonly pageSize: number;
6
+ };
7
+ export type StandardListQuery<TFilters> = {
8
+ readonly filters?: TFilters;
9
+ readonly sort?: readonly SortOption[];
10
+ readonly pagination?: PaginationOptions;
11
+ };
12
+ //# sourceMappingURL=list-query.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-query.type.d.ts","sourceRoot":"","sources":["../../src/query/list-query.type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,QAAQ,IAAI;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list-query.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-query.type.js","sourceRoot":"","sources":["../../src/query/list-query.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export type PaginatedResult<T> = {
2
+ readonly rows: readonly T[];
3
+ readonly total: number;
4
+ readonly page: number;
5
+ readonly pageSize: number;
6
+ };
7
+ //# sourceMappingURL=paginated-result.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginated-result.type.d.ts","sourceRoot":"","sources":["../../src/query/paginated-result.type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=paginated-result.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginated-result.type.js","sourceRoot":"","sources":["../../src/query/paginated-result.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export type QueryProduct = {
2
+ readonly sql: string;
3
+ readonly countSql?: string;
4
+ readonly params: readonly unknown[];
5
+ };
6
+ //# sourceMappingURL=query-product.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-product.type.d.ts","sourceRoot":"","sources":["../../src/query/query-product.type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query-product.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-product.type.js","sourceRoot":"","sources":["../../src/query/query-product.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { FilterQuery } from './filter-query.type.js';
2
+ import type { SqlStatement } from './sql-statement.type.js';
3
+ export type OrderBy = {
4
+ readonly column: string;
5
+ readonly direction: 'asc' | 'desc';
6
+ };
7
+ export type SelectOptions<T> = {
8
+ readonly table: string;
9
+ readonly columns?: readonly string[];
10
+ readonly where?: FilterQuery<T>;
11
+ readonly limit?: number;
12
+ readonly orderBy?: readonly OrderBy[];
13
+ };
14
+ export interface ReadQueryBuilder {
15
+ select<T>(opts: SelectOptions<T>): SqlStatement;
16
+ }
17
+ //# sourceMappingURL=read-query-builder.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-query-builder.interface.d.ts","sourceRoot":"","sources":["../../src/query/read-query-builder.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=read-query-builder.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-query-builder.interface.js","sourceRoot":"","sources":["../../src/query/read-query-builder.interface.ts"],"names":[],"mappings":""}