@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,260 @@
1
+ import { ALL_FILTER_OPERATORS, FILTER_DELIMITER, } from '../query/field-descriptor.type.js';
2
+ const IDENT_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
3
+ const QUALIFIED_IDENT_RE = /^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)?$/;
4
+ // `table` or `schema.table` or `table alias` or `table AS alias`.
5
+ const FROM_RE = /^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)?(\s+(AS\s+)?[a-zA-Z_][a-zA-Z0-9_]*)?$/i;
6
+ const ALIAS_RE = /^(.+?)\s+AS\s+"([a-zA-Z_][a-zA-Z0-9_]*)"$/i;
7
+ const STAR_RE = /^([a-zA-Z_][a-zA-Z0-9_]*\.)?\*$/;
8
+ const KNOWN_OPERATORS = new Set(ALL_FILTER_OPERATORS);
9
+ const EMPTY_STATE = {
10
+ columns: [],
11
+ table: null,
12
+ joins: [],
13
+ groupBys: [],
14
+ rawConditions: [],
15
+ filterMap: {},
16
+ sort: null,
17
+ sortOptions: null,
18
+ pagination: null,
19
+ };
20
+ export class PgSqlQueryBuilder {
21
+ resolver;
22
+ state;
23
+ constructor(resolver, state = EMPTY_STATE) {
24
+ this.resolver = resolver;
25
+ this.state = state;
26
+ }
27
+ select(columns) {
28
+ for (const c of columns)
29
+ validateSelectColumn(c);
30
+ return this.fork({ columns: [...columns] });
31
+ }
32
+ from(table) {
33
+ if (!FROM_RE.test(table)) {
34
+ throw new Error(`SqlQueryBuilder.from: invalid identifier ${JSON.stringify(table)}. Accepts "table", "schema.table", "table alias", or "table AS alias".`);
35
+ }
36
+ return this.fork({ table });
37
+ }
38
+ join(clause) {
39
+ return this.fork({ joins: [...this.state.joins, clause] });
40
+ }
41
+ groupBy(columns) {
42
+ for (const c of columns)
43
+ validateQualifiedIdentifier(c, 'groupBy');
44
+ return this.fork({ groupBys: [...this.state.groupBys, ...columns] });
45
+ }
46
+ where(condition, ...params) {
47
+ return this.fork({
48
+ rawConditions: [...this.state.rawConditions, { sql: condition, params }],
49
+ });
50
+ }
51
+ filters(filters) {
52
+ const merged = { ...this.state.filterMap };
53
+ for (const [k, v] of Object.entries(filters)) {
54
+ if (v === undefined)
55
+ continue;
56
+ merged[k] = v;
57
+ }
58
+ return this.fork({ filterMap: merged });
59
+ }
60
+ orderBy(sort, options) {
61
+ return this.fork({
62
+ sort: sort ? [...sort] : null,
63
+ sortOptions: options ?? null,
64
+ });
65
+ }
66
+ paginate(options) {
67
+ return this.fork({ pagination: options });
68
+ }
69
+ build() {
70
+ if (!this.state.table) {
71
+ throw new Error('SqlQueryBuilder.build: .from(table) is required');
72
+ }
73
+ const params = [];
74
+ const columnsSql = this.buildColumnsSql();
75
+ const { whereSql } = this.buildWhereSql(params);
76
+ let sql = `SELECT ${columnsSql} FROM ${this.state.table}`;
77
+ for (const j of this.state.joins)
78
+ sql += ` ${j}`;
79
+ if (whereSql)
80
+ sql += ` WHERE ${whereSql}`;
81
+ if (this.state.groupBys.length > 0) {
82
+ sql += ` GROUP BY ${this.state.groupBys.map((c) => this.resolveOrPassThrough(c)).join(', ')}`;
83
+ }
84
+ const orderSql = this.buildOrderSql();
85
+ if (orderSql)
86
+ sql += ` ORDER BY ${orderSql}`;
87
+ let countSql;
88
+ if (this.state.pagination) {
89
+ const { page, pageSize, distinctOn } = this.state.pagination;
90
+ if (distinctOn?.length) {
91
+ const distinctCols = distinctOn.map((c) => this.resolveOrPassThrough(c)).join(', ');
92
+ sql = sql.replace(/^SELECT /, `SELECT DISTINCT ON (${distinctCols}) `);
93
+ }
94
+ const offset = Math.max(0, (page - 1) * pageSize);
95
+ sql += ` LIMIT ${pageSize} OFFSET ${offset}`;
96
+ countSql = this.buildCountSql(whereSql);
97
+ }
98
+ return countSql !== undefined ? { sql, countSql, params } : { sql, params };
99
+ }
100
+ fork(patch) {
101
+ return new PgSqlQueryBuilder(this.resolver, { ...this.state, ...patch });
102
+ }
103
+ buildColumnsSql() {
104
+ if (this.state.columns.length === 0)
105
+ return '*';
106
+ return this.state.columns.map((c) => this.projectColumn(c)).join(', ');
107
+ }
108
+ projectColumn(column) {
109
+ if (STAR_RE.test(column))
110
+ return column;
111
+ if (ALIAS_RE.test(column))
112
+ return column;
113
+ if (column.includes('.')) {
114
+ validateQualifiedIdentifier(column, 'select');
115
+ return column;
116
+ }
117
+ if (!IDENT_RE.test(column)) {
118
+ throw new Error(`SqlQueryBuilder.select: invalid column expression ${JSON.stringify(column)}. Use a plain identifier, a qualified "table.col", "*", or pre-aliased "expr AS \\"name\\"".`);
119
+ }
120
+ const resolved = this.resolver.resolve(column);
121
+ return resolved === column ? resolved : `${resolved} AS "${column}"`;
122
+ }
123
+ resolveOrPassThrough(key) {
124
+ if (key.includes('.') || !IDENT_RE.test(key)) {
125
+ validateQualifiedIdentifier(key, 'column reference');
126
+ return key;
127
+ }
128
+ return this.resolver.resolve(key);
129
+ }
130
+ buildWhereSql(params) {
131
+ const fragments = [];
132
+ for (const [rawKey, value] of Object.entries(this.state.filterMap)) {
133
+ const fragment = this.filterFragment(rawKey, value, params);
134
+ if (fragment)
135
+ fragments.push(fragment);
136
+ }
137
+ for (const raw of this.state.rawConditions) {
138
+ fragments.push(rebaseQuestionMarks(raw.sql, params, raw.params));
139
+ }
140
+ return { whereSql: fragments.join(' AND ') };
141
+ }
142
+ filterFragment(rawKey, value, params) {
143
+ const { field, operator } = parseFilterKey(rawKey);
144
+ const column = this.resolveOrPassThrough(field);
145
+ switch (operator) {
146
+ case 'eq':
147
+ if (value === null)
148
+ return `${column} IS NULL`;
149
+ return `${column} = ${pushParam(params, value)}`;
150
+ case 'contains':
151
+ return `${column} ILIKE ${pushParam(params, `%${String(value)}%`)}`;
152
+ case 'in':
153
+ return `${column} = ANY(${pushParam(params, value)})`;
154
+ case 'notIn':
155
+ return `(${column} <> ALL(${pushParam(params, value)}) OR ${column} IS NULL)`;
156
+ case 'gt':
157
+ return `${column} > ${pushParam(params, value)}`;
158
+ case 'gte':
159
+ return `${column} >= ${pushParam(params, value)}`;
160
+ case 'lt':
161
+ return `${column} < ${pushParam(params, value)}`;
162
+ case 'lte':
163
+ return `${column} <= ${pushParam(params, value)}`;
164
+ case 'isNull':
165
+ return value === false ? `${column} IS NOT NULL` : `${column} IS NULL`;
166
+ case 'isNotNull':
167
+ return value === false ? `${column} IS NULL` : `${column} IS NOT NULL`;
168
+ default:
169
+ return null;
170
+ }
171
+ }
172
+ buildOrderSql() {
173
+ const { sort, sortOptions } = this.state;
174
+ const enforced = sortOptions?.enforced ?? [];
175
+ const defaults = sortOptions?.defaults ?? [];
176
+ const user = sort ?? [];
177
+ const effective = user.length > 0 ? [...enforced, ...user] : [...enforced, ...defaults];
178
+ if (effective.length === 0)
179
+ return '';
180
+ const clauses = [];
181
+ for (const entry of effective) {
182
+ for (const [field, direction] of Object.entries(entry)) {
183
+ const column = this.resolveOrPassThrough(field);
184
+ const dir = direction === 'desc' ? 'DESC' : 'ASC';
185
+ clauses.push(`${column} ${dir}`);
186
+ }
187
+ }
188
+ return clauses.join(', ');
189
+ }
190
+ buildCountSql(whereSql) {
191
+ // If GROUP BY is present, count must be over the grouped set.
192
+ if (this.state.groupBys.length > 0) {
193
+ let inner = `SELECT 1 FROM ${this.state.table}`;
194
+ for (const j of this.state.joins)
195
+ inner += ` ${j}`;
196
+ if (whereSql)
197
+ inner += ` WHERE ${whereSql}`;
198
+ inner += ` GROUP BY ${this.state.groupBys
199
+ .map((c) => this.resolveOrPassThrough(c))
200
+ .join(', ')}`;
201
+ return `SELECT COUNT(*)::bigint AS count FROM (${inner}) AS _grouped`;
202
+ }
203
+ let sql = `SELECT COUNT(*)::bigint AS count FROM ${this.state.table}`;
204
+ for (const j of this.state.joins)
205
+ sql += ` ${j}`;
206
+ if (whereSql)
207
+ sql += ` WHERE ${whereSql}`;
208
+ return sql;
209
+ }
210
+ }
211
+ function pushParam(params, value) {
212
+ params.push(value);
213
+ return `$${params.length}`;
214
+ }
215
+ function rebaseQuestionMarks(sql, targetParams, sourceParams) {
216
+ let i = 0;
217
+ const rebased = sql.replace(/\?/g, () => {
218
+ if (i >= sourceParams.length) {
219
+ throw new Error(`SqlQueryBuilder.where: more "?" placeholders than parameters in fragment ${JSON.stringify(sql)}`);
220
+ }
221
+ targetParams.push(sourceParams[i]);
222
+ i++;
223
+ return `$${targetParams.length}`;
224
+ });
225
+ if (i < sourceParams.length) {
226
+ throw new Error(`SqlQueryBuilder.where: more parameters than "?" placeholders in fragment ${JSON.stringify(sql)}`);
227
+ }
228
+ return rebased;
229
+ }
230
+ function parseFilterKey(rawKey) {
231
+ const delimiterIndex = rawKey.indexOf(FILTER_DELIMITER);
232
+ if (delimiterIndex < 0) {
233
+ return { field: rawKey, operator: 'eq' };
234
+ }
235
+ const field = rawKey.slice(0, delimiterIndex);
236
+ const opString = rawKey.slice(delimiterIndex + FILTER_DELIMITER.length);
237
+ if (!KNOWN_OPERATORS.has(opString)) {
238
+ throw new Error(`SqlQueryBuilder.filters: unknown operator "${opString}" in key "${rawKey}". ` +
239
+ `Known operators: ${[...KNOWN_OPERATORS].join(', ')}.`);
240
+ }
241
+ if (!IDENT_RE.test(field)) {
242
+ throw new Error(`SqlQueryBuilder.filters: invalid field name "${field}" in key "${rawKey}".`);
243
+ }
244
+ return { field, operator: opString };
245
+ }
246
+ function validateSelectColumn(column) {
247
+ if (STAR_RE.test(column))
248
+ return;
249
+ if (ALIAS_RE.test(column))
250
+ return;
251
+ if (QUALIFIED_IDENT_RE.test(column))
252
+ return;
253
+ throw new Error(`SqlQueryBuilder.select: invalid column expression ${JSON.stringify(column)}. Use a plain identifier, a qualified "table.col", "*", or pre-aliased "expr AS \\"name\\"".`);
254
+ }
255
+ function validateQualifiedIdentifier(value, context) {
256
+ if (!QUALIFIED_IDENT_RE.test(value)) {
257
+ throw new Error(`SqlQueryBuilder.${context}: invalid identifier ${JSON.stringify(value)}. Must match /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)?$/.`);
258
+ }
259
+ }
260
+ //# sourceMappingURL=pg-query-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-query-builder.js","sourceRoot":"","sources":["../../src/postgres/pg-query-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Database } from '../database/database.interface.js';
2
+ import type { ReadDbAdapter, SelectOptions } from '../db-adapter/read-db-adapter.interface.js';
3
+ import { PgColumnTypeCache } from './pg-sql.js';
4
+ /**
5
+ * Postgres `ReadDbAdapter`. Query side — never accepts a transaction;
6
+ * always runs on the pool (or the read-replica pool, depending on which
7
+ * `Database` is injected).
8
+ *
9
+ * Shares the column-type cache with its sibling `PgWriteDbAdapter` when
10
+ * one is passed in — so a given table's metadata is fetched at most once
11
+ * per process regardless of which adapter hits it first.
12
+ */
13
+ export declare class PgReadDbAdapter implements ReadDbAdapter {
14
+ private readonly db;
15
+ private readonly columnTypes;
16
+ constructor(db: Database, columnTypeCache?: PgColumnTypeCache);
17
+ select<T>(opts: SelectOptions<T>): Promise<readonly T[]>;
18
+ raw<T>(sql: string, params: readonly unknown[]): Promise<readonly T[]>;
19
+ }
20
+ //# sourceMappingURL=pg-read-db-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-read-db-adapter.d.ts","sourceRoot":"","sources":["../../src/postgres/pg-read-db-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAa,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,aAAa;IAIjD,OAAO,CAAC,QAAQ,CAAC,EAAE;IAHrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAG7B,EAAE,EAAE,QAAQ,EAC7B,eAAe,CAAC,EAAE,iBAAiB;IAK/B,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAMxD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;CAI7E"}
@@ -0,0 +1,28 @@
1
+ import { PgColumnTypeCache, runSelect } from './pg-sql.js';
2
+ /**
3
+ * Postgres `ReadDbAdapter`. Query side — never accepts a transaction;
4
+ * always runs on the pool (or the read-replica pool, depending on which
5
+ * `Database` is injected).
6
+ *
7
+ * Shares the column-type cache with its sibling `PgWriteDbAdapter` when
8
+ * one is passed in — so a given table's metadata is fetched at most once
9
+ * per process regardless of which adapter hits it first.
10
+ */
11
+ export class PgReadDbAdapter {
12
+ db;
13
+ columnTypes;
14
+ constructor(db, columnTypeCache) {
15
+ this.db = db;
16
+ this.columnTypes = columnTypeCache ?? new PgColumnTypeCache(db);
17
+ }
18
+ async select(opts) {
19
+ const types = await this.columnTypes.get(opts.table);
20
+ const result = await runSelect(this.db, opts, types, { forUpdate: false });
21
+ return result.rows;
22
+ }
23
+ async raw(sql, params) {
24
+ const result = await this.db.query(sql, params);
25
+ return result.rows;
26
+ }
27
+ }
28
+ //# sourceMappingURL=pg-read-db-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-read-db-adapter.js","sourceRoot":"","sources":["../../src/postgres/pg-read-db-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IAIP;IAHF,WAAW,CAAoB;IAEhD,YACmB,EAAY,EAC7B,eAAmC;QADlB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,WAAW,GAAG,eAAe,IAAI,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,IAAsB;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,IAAoB,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,MAA0B;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC,IAAoB,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ import type { DatabaseResult } from '../database/database-result.type.js';
2
+ import type { DatabaseTransaction } from '../database/database-transaction.interface.js';
3
+ import type { Database } from '../database/database.interface.js';
4
+ import type { FilterQuery } from '../db-adapter/filter-query.type.js';
5
+ import type { SelectOptions } from '../db-adapter/read-db-adapter.interface.js';
6
+ export type ColumnTypeMap = Record<string, string>;
7
+ /**
8
+ * Maps `information_schema.columns.data_type` (or `udt_name` for arrays)
9
+ * to the Postgres type name used for explicit parameter casting
10
+ * (`$1::UUID`, `$2::JSONB`, etc.). Unknown types fall back to `TEXT`.
11
+ */
12
+ export declare function mapPostgresType(dataType: string | undefined): string;
13
+ /**
14
+ * Builds a parameterised `WHERE` clause from a `FilterQuery`. Scalar values
15
+ * emit `col = $n::TYPE`; arrays emit `col = ANY($n::TYPE[])`.
16
+ *
17
+ * `startIndex` is the placeholder offset — pass the number of params
18
+ * already consumed upstream (e.g. by a SET clause in UPDATE). Read-side
19
+ * callers pass `0`.
20
+ */
21
+ export declare function buildWhere<T>(filters: FilterQuery<T>, types: ColumnTypeMap, startIndex?: number): {
22
+ sql: string;
23
+ values: unknown[];
24
+ };
25
+ /**
26
+ * Assembles a parameterised `SELECT` statement for the shared read path
27
+ * (used by both `PgWriteDbAdapter.find*` and `PgReadDbAdapter.select`).
28
+ */
29
+ export declare function runSelect<T>(db: Database, opts: SelectOptions<T>, types: ColumnTypeMap, flags: {
30
+ forUpdate: boolean;
31
+ trx?: DatabaseTransaction | undefined;
32
+ }): Promise<DatabaseResult>;
33
+ /**
34
+ * Caches column types per table across the life of a process. Shared by
35
+ * `PgWriteDbAdapter` and `PgReadDbAdapter` so a given table's metadata is
36
+ * fetched at most once, regardless of which adapter gets there first.
37
+ */
38
+ export declare class PgColumnTypeCache {
39
+ private readonly db;
40
+ private readonly cache;
41
+ constructor(db: Database);
42
+ get(table: string): Promise<ColumnTypeMap>;
43
+ }
44
+ //# sourceMappingURL=pg-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-sql.d.ts","sourceRoot":"","sources":["../../src/postgres/pg-sql.ts"],"names":[],"mappings":"AAAA,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;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAEhF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAwCpE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EACvB,KAAK,EAAE,aAAa,EACpB,UAAU,SAAI,GACb;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAkBpC;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAA;CAAE,GACnE,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAMD;;;;GAIG;AACH,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAF/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAE7B,EAAE,EAAE,QAAQ;IAEnC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAgBjD"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Maps `information_schema.columns.data_type` (or `udt_name` for arrays)
3
+ * to the Postgres type name used for explicit parameter casting
4
+ * (`$1::UUID`, `$2::JSONB`, etc.). Unknown types fall back to `TEXT`.
5
+ */
6
+ export function mapPostgresType(dataType) {
7
+ if (!dataType)
8
+ return 'TEXT';
9
+ switch (dataType) {
10
+ case 'uuid':
11
+ return 'UUID';
12
+ case 'integer':
13
+ case 'smallint':
14
+ case 'bigint':
15
+ return 'INTEGER';
16
+ case 'boolean':
17
+ return 'BOOLEAN';
18
+ case 'timestamp without time zone':
19
+ case 'timestamp with time zone':
20
+ case 'timestamptz':
21
+ return 'TIMESTAMPTZ';
22
+ case 'date':
23
+ return 'DATE';
24
+ case 'numeric':
25
+ case 'real':
26
+ case 'double precision':
27
+ return 'NUMERIC';
28
+ case 'json':
29
+ return 'JSON';
30
+ case 'jsonb':
31
+ return 'JSONB';
32
+ case 'text':
33
+ case 'character varying':
34
+ return 'TEXT';
35
+ case 'bytea':
36
+ return 'BYTEA';
37
+ case '_uuid':
38
+ return 'UUID[]';
39
+ case '_int4':
40
+ return 'INTEGER[]';
41
+ case '_text':
42
+ case '_varchar':
43
+ return 'TEXT[]';
44
+ default:
45
+ return 'TEXT';
46
+ }
47
+ }
48
+ /**
49
+ * Builds a parameterised `WHERE` clause from a `FilterQuery`. Scalar values
50
+ * emit `col = $n::TYPE`; arrays emit `col = ANY($n::TYPE[])`.
51
+ *
52
+ * `startIndex` is the placeholder offset — pass the number of params
53
+ * already consumed upstream (e.g. by a SET clause in UPDATE). Read-side
54
+ * callers pass `0`.
55
+ */
56
+ export function buildWhere(filters, types, startIndex = 0) {
57
+ const entries = Object.entries(filters);
58
+ if (entries.length === 0) {
59
+ throw new Error('WHERE clause requires at least one filter');
60
+ }
61
+ const values = [];
62
+ const clauses = entries.map(([key, value]) => {
63
+ const pgType = mapPostgresType(types[key]);
64
+ if (Array.isArray(value)) {
65
+ values.push(value);
66
+ return `${key} = ANY($${startIndex + values.length}::${pgType}[])`;
67
+ }
68
+ values.push(value);
69
+ return `${key} = $${startIndex + values.length}::${pgType}`;
70
+ });
71
+ return { sql: clauses.join(' AND '), values };
72
+ }
73
+ /**
74
+ * Assembles a parameterised `SELECT` statement for the shared read path
75
+ * (used by both `PgWriteDbAdapter.find*` and `PgReadDbAdapter.select`).
76
+ */
77
+ export async function runSelect(db, opts, types, flags) {
78
+ const columns = opts.columns?.length ? opts.columns.join(', ') : '*';
79
+ let sql = `SELECT ${columns} FROM ${opts.table}`;
80
+ const values = [];
81
+ if (opts.where && Object.keys(opts.where).length > 0) {
82
+ const where = buildWhere(opts.where, types);
83
+ values.push(...where.values);
84
+ sql += ` WHERE ${where.sql}`;
85
+ }
86
+ if (opts.orderBy?.length) {
87
+ const orderClauses = opts.orderBy.map((o) => `${o.column} ${o.direction.toUpperCase()}`);
88
+ sql += ` ORDER BY ${orderClauses.join(', ')}`;
89
+ }
90
+ if (opts.limit !== undefined) {
91
+ sql += ` LIMIT ${opts.limit}`;
92
+ }
93
+ if (flags.forUpdate) {
94
+ sql += ' FOR UPDATE';
95
+ }
96
+ return db.query(sql, values, flags.trx);
97
+ }
98
+ const INFO_SCHEMA_SQL = `SELECT column_name, data_type, udt_name
99
+ FROM information_schema.columns
100
+ WHERE table_name = $1`;
101
+ /**
102
+ * Caches column types per table across the life of a process. Shared by
103
+ * `PgWriteDbAdapter` and `PgReadDbAdapter` so a given table's metadata is
104
+ * fetched at most once, regardless of which adapter gets there first.
105
+ */
106
+ export class PgColumnTypeCache {
107
+ db;
108
+ cache = new Map();
109
+ constructor(db) {
110
+ this.db = db;
111
+ }
112
+ async get(table) {
113
+ const cached = this.cache.get(table);
114
+ if (cached)
115
+ return cached;
116
+ const result = await this.db.query(INFO_SCHEMA_SQL, [table]);
117
+ const types = {};
118
+ for (const row of result.rows) {
119
+ const name = String(row.column_name);
120
+ const dataType = String(row.data_type);
121
+ const udtName = String(row.udt_name);
122
+ types[name] = dataType === 'ARRAY' ? udtName : dataType;
123
+ }
124
+ this.cache.set(table, types);
125
+ return types;
126
+ }
127
+ }
128
+ //# sourceMappingURL=pg-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-sql.js","sourceRoot":"","sources":["../../src/postgres/pg-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { DatabaseResult } from '../database/database-result.type.js';
2
+ import type { DatabaseTransaction } from '../database/database-transaction.interface.js';
3
+ import type { Database } from '../database/database.interface.js';
4
+ import type { SelectOptions } from '../db-adapter/read-db-adapter.interface.js';
5
+ import type { DeleteOptions, ExistsOptions, InsertOptions, UpdateManyOptions, UpdateOptions, WriteDbAdapter } from '../db-adapter/write-db-adapter.interface.js';
6
+ import { PgColumnTypeCache } from './pg-sql.js';
7
+ /**
8
+ * Postgres `WriteDbAdapter`. Resolves column types once per table via
9
+ * `PgColumnTypeCache`, emits explicit parameter casts, JSON.stringify's
10
+ * JSONB values, and renders millisecond-truncated timestamps so
11
+ * optimistic-lock comparisons round-trip with JS `Date`.
12
+ *
13
+ * Accepts an optional shared `PgColumnTypeCache` so a sibling
14
+ * `PgReadDbAdapter` can share the same type cache (one info-schema fetch
15
+ * per table, regardless of which adapter hits it first).
16
+ */
17
+ export declare class PgWriteDbAdapter implements WriteDbAdapter {
18
+ private readonly columnTypes;
19
+ constructor(db: Database, columnTypeCache?: PgColumnTypeCache);
20
+ private readonly db;
21
+ insert(opts: InsertOptions, trx?: DatabaseTransaction): Promise<DatabaseResult>;
22
+ update<T>(opts: UpdateOptions<T>, trx?: DatabaseTransaction): Promise<DatabaseResult>;
23
+ updateMany(opts: UpdateManyOptions, trx?: DatabaseTransaction): Promise<DatabaseResult>;
24
+ delete<T>(opts: DeleteOptions<T>, trx?: DatabaseTransaction): Promise<DatabaseResult>;
25
+ find<T>(opts: SelectOptions<T>, trx?: DatabaseTransaction): Promise<readonly T[]>;
26
+ findForUpdate<T>(opts: SelectOptions<T>, trx: DatabaseTransaction): Promise<readonly T[]>;
27
+ exists<T>(opts: ExistsOptions<T>, trx?: DatabaseTransaction): Promise<boolean>;
28
+ private executeSelect;
29
+ }
30
+ //# sourceMappingURL=pg-write-db-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-write-db-adapter.d.ts","sourceRoot":"","sources":["../../src/postgres/pg-write-db-adapter.ts"],"names":[],"mappings":"AAAA,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;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,cAAc,EACf,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAA0C,MAAM,aAAa,CAAC;AAMxF;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;gBAEpC,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,iBAAiB;IAK7D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAExB,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA6B/E,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA8BrF,UAAU,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IAqCvF,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IAOrF,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAKjF,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IAKzF,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;YAQtE,aAAa;CAQ5B"}