@relq/orm 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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/dist/cjs/__test-types.cjs +17 -0
  4. package/dist/cjs/addon/cursor.cjs +1473 -0
  5. package/dist/cjs/addon/pg.cjs +4969 -0
  6. package/dist/cjs/cache/index.cjs +9 -0
  7. package/dist/cjs/cache/query-cache.cjs +311 -0
  8. package/dist/cjs/condition/array-condition-builder.cjs +527 -0
  9. package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
  10. package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
  11. package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
  12. package/dist/cjs/condition/base-condition-builder.cjs +2 -0
  13. package/dist/cjs/condition/condition-collector.cjs +461 -0
  14. package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
  15. package/dist/cjs/condition/geometric-condition-builder.cjs +228 -0
  16. package/dist/cjs/condition/index.cjs +29 -0
  17. package/dist/cjs/condition/jsonb-condition-builder.cjs +448 -0
  18. package/dist/cjs/condition/network-condition-builder.cjs +237 -0
  19. package/dist/cjs/condition/postgis-condition-builder.cjs +188 -0
  20. package/dist/cjs/condition/range-condition-builder.cjs +98 -0
  21. package/dist/cjs/core/helpers/ConnectedAggregateBuilder.cjs +132 -0
  22. package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +53 -0
  23. package/dist/cjs/core/helpers/ConnectedCountBuilder.cjs +73 -0
  24. package/dist/cjs/core/helpers/ConnectedDeleteBuilder.cjs +65 -0
  25. package/dist/cjs/core/helpers/ConnectedInsertBuilder.cjs +112 -0
  26. package/dist/cjs/core/helpers/ConnectedInsertFromSelectBuilder.cjs +66 -0
  27. package/dist/cjs/core/helpers/ConnectedQueryBuilder.cjs +146 -0
  28. package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +46 -0
  29. package/dist/cjs/core/helpers/ConnectedSelectBuilder.cjs +331 -0
  30. package/dist/cjs/core/helpers/ConnectedTransactionBuilder.cjs +105 -0
  31. package/dist/cjs/core/helpers/ConnectedUpdateBuilder.cjs +79 -0
  32. package/dist/cjs/core/helpers/PaginateBuilder.cjs +178 -0
  33. package/dist/cjs/core/helpers/ReturningExecutor.cjs +70 -0
  34. package/dist/cjs/core/helpers/capability-guard.cjs +10 -0
  35. package/dist/cjs/core/helpers/index.cjs +31 -0
  36. package/dist/cjs/core/helpers/methods.cjs +10 -0
  37. package/dist/cjs/core/helpers/query-convenience.cjs +238 -0
  38. package/dist/cjs/core/helpers/select-joins.cjs +251 -0
  39. package/dist/cjs/core/helpers/select-pagination.cjs +233 -0
  40. package/dist/cjs/core/helpers/select-types.cjs +2 -0
  41. package/dist/cjs/core/pg-family/cockroachdb-client/capabilities.cjs +31 -0
  42. package/dist/cjs/core/pg-family/cockroachdb-client/index.cjs +7 -0
  43. package/dist/cjs/core/pg-family/cockroachdb-client/relq-cockroach.cjs +16 -0
  44. package/dist/cjs/core/pg-family/dsql-client/capabilities.cjs +31 -0
  45. package/dist/cjs/core/pg-family/dsql-client/index.cjs +7 -0
  46. package/dist/cjs/core/pg-family/dsql-client/relq-dsql.cjs +16 -0
  47. package/dist/cjs/core/pg-family/index.cjs +19 -0
  48. package/dist/cjs/core/pg-family/nile-client/capabilities.cjs +31 -0
  49. package/dist/cjs/core/pg-family/nile-client/index.cjs +7 -0
  50. package/dist/cjs/core/pg-family/nile-client/relq-nile.cjs +36 -0
  51. package/dist/cjs/core/pg-family/nile-client/tenant-context.cjs +44 -0
  52. package/dist/cjs/core/pg-family/pg-client/capabilities.cjs +31 -0
  53. package/dist/cjs/core/pg-family/pg-client/index.cjs +7 -0
  54. package/dist/cjs/core/pg-family/pg-client/relq-postgres.cjs +43 -0
  55. package/dist/cjs/core/pg-family/shared/pg-base.cjs +385 -0
  56. package/dist/cjs/core/pg-family/shared/pg-dialect.cjs +67 -0
  57. package/dist/cjs/core/pg-family/shared/pg-error-parser.cjs +34 -0
  58. package/dist/cjs/core/pg-family/shared/pg-type-coercion.cjs +14 -0
  59. package/dist/cjs/core/relq-base.cjs +307 -0
  60. package/dist/cjs/core/relq-client.cjs +56 -0
  61. package/dist/cjs/core/shared/cleanup.cjs +36 -0
  62. package/dist/cjs/core/shared/column-mapping.cjs +97 -0
  63. package/dist/cjs/core/shared/errors.cjs +17 -0
  64. package/dist/cjs/core/shared/index.cjs +24 -0
  65. package/dist/cjs/core/shared/table-accessor.cjs +22 -0
  66. package/dist/cjs/core/shared/transform.cjs +35 -0
  67. package/dist/cjs/core/shared/types.cjs +2 -0
  68. package/dist/cjs/core/shared/validation.cjs +140 -0
  69. package/dist/cjs/core/types/core.types.cjs +2 -0
  70. package/dist/cjs/count/count-builder.cjs +88 -0
  71. package/dist/cjs/count/index.cjs +5 -0
  72. package/dist/cjs/delete/delete-builder.cjs +176 -0
  73. package/dist/cjs/delete/index.cjs +5 -0
  74. package/dist/cjs/explain/explain-builder.cjs +99 -0
  75. package/dist/cjs/explain/index.cjs +5 -0
  76. package/dist/cjs/index.cjs +26 -0
  77. package/dist/cjs/insert/conflict-builder.cjs +213 -0
  78. package/dist/cjs/insert/index.cjs +5 -0
  79. package/dist/cjs/insert/insert-builder.cjs +320 -0
  80. package/dist/cjs/insert/insert-from-select-builder.cjs +86 -0
  81. package/dist/cjs/pubsub/index.cjs +7 -0
  82. package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
  83. package/dist/cjs/pubsub/listener-connection.cjs +180 -0
  84. package/dist/cjs/raw/index.cjs +8 -0
  85. package/dist/cjs/raw/raw-query-builder.cjs +27 -0
  86. package/dist/cjs/raw/sql-template.cjs +73 -0
  87. package/dist/cjs/select/aggregate-builder.cjs +179 -0
  88. package/dist/cjs/select/index.cjs +16 -0
  89. package/dist/cjs/select/join-builder.cjs +192 -0
  90. package/dist/cjs/select/join-condition-builder.cjs +189 -0
  91. package/dist/cjs/select/join-internals.cjs +5 -0
  92. package/dist/cjs/select/join-many-condition-builder.cjs +159 -0
  93. package/dist/cjs/select/scalar-query-builder.cjs +134 -0
  94. package/dist/cjs/select/scalar-select-builder.cjs +78 -0
  95. package/dist/cjs/select/select-builder.cjs +426 -0
  96. package/dist/cjs/select/sql-expression.cjs +38 -0
  97. package/dist/cjs/select/table-proxy.cjs +99 -0
  98. package/dist/cjs/shared/aws-dsql.cjs +181 -0
  99. package/dist/cjs/shared/errors/relq-errors.cjs +361 -0
  100. package/dist/cjs/shared/pg-format.cjs +383 -0
  101. package/dist/cjs/shared/types/config-types.cjs +51 -0
  102. package/dist/cjs/transaction/index.cjs +6 -0
  103. package/dist/cjs/transaction/transaction-builder.cjs +78 -0
  104. package/dist/cjs/types/aggregate-types.cjs +2 -0
  105. package/dist/cjs/types/inference-types.cjs +18 -0
  106. package/dist/cjs/types/pagination-types.cjs +7 -0
  107. package/dist/cjs/types/result-types.cjs +2 -0
  108. package/dist/cjs/types/scalar-types.cjs +2 -0
  109. package/dist/cjs/types/schema-types.cjs +2 -0
  110. package/dist/cjs/types/subscription-types.cjs +2 -0
  111. package/dist/cjs/types.cjs +2 -0
  112. package/dist/cjs/update/array-update-builder.cjs +232 -0
  113. package/dist/cjs/update/index.cjs +16 -0
  114. package/dist/cjs/update/jsonb-update-builder.cjs +219 -0
  115. package/dist/cjs/update/update-builder.cjs +274 -0
  116. package/dist/cjs/utils/addon/pg/cursor.cjs +8 -0
  117. package/dist/cjs/utils/addon/pg/pg.cjs +23 -0
  118. package/dist/cjs/utils/case-converter.cjs +58 -0
  119. package/dist/cjs/utils/env-resolver.cjs +226 -0
  120. package/dist/cjs/utils/environment-detection.cjs +124 -0
  121. package/dist/cjs/utils/fk-resolver.cjs +186 -0
  122. package/dist/cjs/utils/index.cjs +25 -0
  123. package/dist/cjs/utils/pool-defaults.cjs +91 -0
  124. package/dist/cjs/utils/type-coercion.cjs +120 -0
  125. package/dist/cjs/window/index.cjs +5 -0
  126. package/dist/cjs/window/window-builder.cjs +80 -0
  127. package/dist/esm/__test-types.js +15 -0
  128. package/dist/esm/addon/cursor.js +1440 -0
  129. package/dist/esm/addon/pg.js +4931 -0
  130. package/dist/esm/cache/index.js +1 -0
  131. package/dist/esm/cache/query-cache.js +303 -0
  132. package/dist/esm/condition/array-condition-builder.js +519 -0
  133. package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
  134. package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
  135. package/dist/esm/condition/array-string-condition-builder.js +142 -0
  136. package/dist/esm/condition/base-condition-builder.js +1 -0
  137. package/dist/esm/condition/condition-collector.js +452 -0
  138. package/dist/esm/condition/fulltext-condition-builder.js +53 -0
  139. package/dist/esm/condition/geometric-condition-builder.js +220 -0
  140. package/dist/esm/condition/index.js +8 -0
  141. package/dist/esm/condition/jsonb-condition-builder.js +439 -0
  142. package/dist/esm/condition/network-condition-builder.js +229 -0
  143. package/dist/esm/condition/postgis-condition-builder.js +180 -0
  144. package/dist/esm/condition/range-condition-builder.js +90 -0
  145. package/dist/esm/core/helpers/ConnectedAggregateBuilder.js +128 -0
  146. package/dist/esm/core/helpers/ConnectedCTEBuilder.js +49 -0
  147. package/dist/esm/core/helpers/ConnectedCountBuilder.js +69 -0
  148. package/dist/esm/core/helpers/ConnectedDeleteBuilder.js +61 -0
  149. package/dist/esm/core/helpers/ConnectedInsertBuilder.js +108 -0
  150. package/dist/esm/core/helpers/ConnectedInsertFromSelectBuilder.js +62 -0
  151. package/dist/esm/core/helpers/ConnectedQueryBuilder.js +142 -0
  152. package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +42 -0
  153. package/dist/esm/core/helpers/ConnectedSelectBuilder.js +327 -0
  154. package/dist/esm/core/helpers/ConnectedTransactionBuilder.js +100 -0
  155. package/dist/esm/core/helpers/ConnectedUpdateBuilder.js +75 -0
  156. package/dist/esm/core/helpers/PaginateBuilder.js +174 -0
  157. package/dist/esm/core/helpers/ReturningExecutor.js +66 -0
  158. package/dist/esm/core/helpers/capability-guard.js +7 -0
  159. package/dist/esm/core/helpers/index.js +13 -0
  160. package/dist/esm/core/helpers/methods.js +6 -0
  161. package/dist/esm/core/helpers/query-convenience.js +194 -0
  162. package/dist/esm/core/helpers/select-joins.js +246 -0
  163. package/dist/esm/core/helpers/select-pagination.js +226 -0
  164. package/dist/esm/core/helpers/select-types.js +1 -0
  165. package/dist/esm/core/pg-family/cockroachdb-client/capabilities.js +28 -0
  166. package/dist/esm/core/pg-family/cockroachdb-client/index.js +2 -0
  167. package/dist/esm/core/pg-family/cockroachdb-client/relq-cockroach.js +12 -0
  168. package/dist/esm/core/pg-family/dsql-client/capabilities.js +28 -0
  169. package/dist/esm/core/pg-family/dsql-client/index.js +2 -0
  170. package/dist/esm/core/pg-family/dsql-client/relq-dsql.js +12 -0
  171. package/dist/esm/core/pg-family/index.js +6 -0
  172. package/dist/esm/core/pg-family/nile-client/capabilities.js +28 -0
  173. package/dist/esm/core/pg-family/nile-client/index.js +2 -0
  174. package/dist/esm/core/pg-family/nile-client/relq-nile.js +32 -0
  175. package/dist/esm/core/pg-family/nile-client/tenant-context.js +40 -0
  176. package/dist/esm/core/pg-family/pg-client/capabilities.js +28 -0
  177. package/dist/esm/core/pg-family/pg-client/index.js +2 -0
  178. package/dist/esm/core/pg-family/pg-client/relq-postgres.js +39 -0
  179. package/dist/esm/core/pg-family/shared/pg-base.js +347 -0
  180. package/dist/esm/core/pg-family/shared/pg-dialect.js +63 -0
  181. package/dist/esm/core/pg-family/shared/pg-error-parser.js +29 -0
  182. package/dist/esm/core/pg-family/shared/pg-type-coercion.js +6 -0
  183. package/dist/esm/core/relq-base.js +270 -0
  184. package/dist/esm/core/relq-client.js +48 -0
  185. package/dist/esm/core/shared/cleanup.js +27 -0
  186. package/dist/esm/core/shared/column-mapping.js +90 -0
  187. package/dist/esm/core/shared/errors.js +13 -0
  188. package/dist/esm/core/shared/index.js +6 -0
  189. package/dist/esm/core/shared/table-accessor.js +19 -0
  190. package/dist/esm/core/shared/transform.js +30 -0
  191. package/dist/esm/core/shared/types.js +1 -0
  192. package/dist/esm/core/shared/validation.js +136 -0
  193. package/dist/esm/core/types/core.types.js +1 -0
  194. package/dist/esm/count/count-builder.js +81 -0
  195. package/dist/esm/count/index.js +1 -0
  196. package/dist/esm/delete/delete-builder.js +169 -0
  197. package/dist/esm/delete/index.js +1 -0
  198. package/dist/esm/explain/explain-builder.js +95 -0
  199. package/dist/esm/explain/index.js +1 -0
  200. package/dist/esm/index.js +7 -0
  201. package/dist/esm/insert/conflict-builder.js +202 -0
  202. package/dist/esm/insert/index.js +1 -0
  203. package/dist/esm/insert/insert-builder.js +313 -0
  204. package/dist/esm/insert/insert-from-select-builder.js +79 -0
  205. package/dist/esm/pubsub/index.js +1 -0
  206. package/dist/esm/pubsub/listen-notify-builder.js +48 -0
  207. package/dist/esm/pubsub/listener-connection.js +173 -0
  208. package/dist/esm/raw/index.js +2 -0
  209. package/dist/esm/raw/raw-query-builder.js +20 -0
  210. package/dist/esm/raw/sql-template.js +66 -0
  211. package/dist/esm/select/aggregate-builder.js +172 -0
  212. package/dist/esm/select/index.js +4 -0
  213. package/dist/esm/select/join-builder.js +184 -0
  214. package/dist/esm/select/join-condition-builder.js +181 -0
  215. package/dist/esm/select/join-internals.js +2 -0
  216. package/dist/esm/select/join-many-condition-builder.js +151 -0
  217. package/dist/esm/select/scalar-query-builder.js +126 -0
  218. package/dist/esm/select/scalar-select-builder.js +70 -0
  219. package/dist/esm/select/select-builder.js +419 -0
  220. package/dist/esm/select/sql-expression.js +33 -0
  221. package/dist/esm/select/table-proxy.js +91 -0
  222. package/dist/esm/shared/aws-dsql.js +140 -0
  223. package/dist/esm/shared/errors/relq-errors.js +339 -0
  224. package/dist/esm/shared/pg-format.js +375 -0
  225. package/dist/esm/shared/types/config-types.js +46 -0
  226. package/dist/esm/transaction/index.js +1 -0
  227. package/dist/esm/transaction/transaction-builder.js +70 -0
  228. package/dist/esm/types/aggregate-types.js +1 -0
  229. package/dist/esm/types/inference-types.js +12 -0
  230. package/dist/esm/types/pagination-types.js +4 -0
  231. package/dist/esm/types/result-types.js +1 -0
  232. package/dist/esm/types/scalar-types.js +1 -0
  233. package/dist/esm/types/schema-types.js +1 -0
  234. package/dist/esm/types/subscription-types.js +1 -0
  235. package/dist/esm/types.js +1 -0
  236. package/dist/esm/update/array-update-builder.js +219 -0
  237. package/dist/esm/update/index.js +3 -0
  238. package/dist/esm/update/jsonb-update-builder.js +211 -0
  239. package/dist/esm/update/update-builder.js +267 -0
  240. package/dist/esm/utils/addon/pg/cursor.js +1 -0
  241. package/dist/esm/utils/addon/pg/pg.js +2 -0
  242. package/dist/esm/utils/case-converter.js +55 -0
  243. package/dist/esm/utils/env-resolver.js +213 -0
  244. package/dist/esm/utils/environment-detection.js +114 -0
  245. package/dist/esm/utils/fk-resolver.js +178 -0
  246. package/dist/esm/utils/index.js +4 -0
  247. package/dist/esm/utils/pool-defaults.js +85 -0
  248. package/dist/esm/utils/type-coercion.js +112 -0
  249. package/dist/esm/window/index.js +1 -0
  250. package/dist/esm/window/window-builder.js +73 -0
  251. package/dist/index.cjs +1 -0
  252. package/dist/index.d.ts +7281 -0
  253. package/dist/index.js +1 -0
  254. package/package.json +52 -0
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.executeCursorEach = executeCursorEach;
7
+ exports.executePagination = executePagination;
8
+ const pg_cursor_1 = __importDefault(require("../../addon/cursor.cjs"));
9
+ const relq_errors_1 = require("../../../shared/errors/relq-errors.cjs");
10
+ const pagination_types_1 = require("../../types/pagination-types.cjs");
11
+ const methods_1 = require("./methods.cjs");
12
+ async function executeCursorEach(ctx, callback, options = {}) {
13
+ const batchSize = options.batchSize ?? 100;
14
+ const sql = ctx.builder.toString();
15
+ const relqAny = ctx.relq;
16
+ if (relqAny.usePooling === false || (!relqAny.pool && relqAny.client)) {
17
+ throw new relq_errors_1.RelqConfigError('each() requires pooled connections', { field: 'pooling', value: 'false (must be true)' });
18
+ }
19
+ const { client, release } = await ctx.relq[methods_1.INTERNAL].getClientForCursor();
20
+ let cursor = null;
21
+ try {
22
+ await client.query('BEGIN');
23
+ cursor = client.query(new pg_cursor_1.default(sql));
24
+ let rows;
25
+ let index = 0;
26
+ outer: do {
27
+ rows = await new Promise((resolve, reject) => {
28
+ cursor.read(batchSize, (err, result) => {
29
+ if (err)
30
+ reject(err);
31
+ else
32
+ resolve(result);
33
+ });
34
+ });
35
+ const internal = ctx.relq[methods_1.INTERNAL];
36
+ const transformedRows = ctx.tableName && internal.hasColumnMapping()
37
+ ? internal.transformResultsFromDb(ctx.tableName, rows)
38
+ : rows;
39
+ for (const row of transformedRows) {
40
+ const result = await callback(row, index++);
41
+ if (result === false) {
42
+ break outer;
43
+ }
44
+ }
45
+ } while (rows.length > 0);
46
+ await closeCursor(cursor);
47
+ cursor = null;
48
+ await client.query('COMMIT');
49
+ }
50
+ catch (error) {
51
+ if (cursor) {
52
+ try {
53
+ await closeCursor(cursor);
54
+ }
55
+ catch {
56
+ }
57
+ }
58
+ try {
59
+ await client.query('ROLLBACK');
60
+ }
61
+ catch {
62
+ }
63
+ throw error;
64
+ }
65
+ finally {
66
+ release();
67
+ }
68
+ }
69
+ async function executePagination(ctx, options, recurse) {
70
+ if (!options.mode || !['paging', 'offset'].includes(options.mode)) {
71
+ throw new relq_errors_1.RelqQueryError('pagination() requires "mode" to be one of: \'paging\', \'offset\'', { hint: 'Set mode: "paging" or mode: "offset"' });
72
+ }
73
+ const orderByArr = options.orderBy
74
+ ? (Array.isArray(options.orderBy[0]) ? options.orderBy : [options.orderBy])
75
+ : [];
76
+ for (const [column, direction] of orderByArr) {
77
+ const dbColumn = ctx.relq[methods_1.INTERNAL].hasColumnMapping()
78
+ ? Object.keys(ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, { [column]: true }))[0]
79
+ : column;
80
+ ctx.builder.orderBy(dbColumn, direction);
81
+ }
82
+ const isPaging = options.mode === 'paging';
83
+ const shouldCount = options.count ?? isPaging;
84
+ let total = 0;
85
+ if (shouldCount) {
86
+ const countSql = ctx.builder.toCountSQL();
87
+ const countResult = await ctx.relq[methods_1.INTERNAL].executeCount(countSql);
88
+ total = countResult.count;
89
+ }
90
+ if (isPaging) {
91
+ return executePagingMode(ctx, options, total, recurse);
92
+ }
93
+ if (options.mode === 'offset') {
94
+ return executeOffsetMode(ctx, options, total, shouldCount, recurse);
95
+ }
96
+ throw new relq_errors_1.RelqQueryError('Invalid pagination mode');
97
+ }
98
+ async function executePagingMode(ctx, options, total, recurse) {
99
+ const { page, perPage } = options;
100
+ if (typeof page !== 'number' || isNaN(page) || page < 1) {
101
+ throw new relq_errors_1.RelqQueryError('pagination() paging mode requires "page" as a positive number (1-indexed)', { hint: 'page must be >= 1' });
102
+ }
103
+ if (typeof perPage !== 'number' || isNaN(perPage) || perPage < 1) {
104
+ throw new relq_errors_1.RelqQueryError('pagination() paging mode requires "perPage" as a positive number', { hint: 'perPage must be >= 1' });
105
+ }
106
+ const offset = (page - 1) * perPage;
107
+ ctx.builder.limit(perPage);
108
+ ctx.builder.offset(offset);
109
+ const sql = ctx.builder.toString();
110
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelect(sql, ctx.tableName);
111
+ const totalPages = Math.ceil(total / perPage);
112
+ const hasNext = page < totalPages;
113
+ const hasPrev = page > 1;
114
+ const pagination = {
115
+ page,
116
+ perPage,
117
+ total,
118
+ totalPages,
119
+ };
120
+ if (hasNext) {
121
+ pagination.hasNext = true;
122
+ pagination.nextPage = page + 1;
123
+ Object.defineProperty(pagination, 'loadNext', {
124
+ value: () => recurse({ ...options, page: page + 1 }),
125
+ enumerable: false,
126
+ configurable: false
127
+ });
128
+ }
129
+ else {
130
+ pagination.hasNext = false;
131
+ }
132
+ if (hasPrev) {
133
+ pagination.hasPrev = true;
134
+ pagination.prevPage = page - 1;
135
+ Object.defineProperty(pagination, 'loadPrev', {
136
+ value: () => recurse({ ...options, page: page - 1 }),
137
+ enumerable: false,
138
+ configurable: false
139
+ });
140
+ }
141
+ else {
142
+ pagination.hasPrev = false;
143
+ }
144
+ addInspectProperties(pagination, () => {
145
+ const visible = { page, perPage, total, totalPages, hasNext };
146
+ if (hasNext)
147
+ visible.nextPage = page + 1;
148
+ visible.hasPrev = hasPrev;
149
+ if (hasPrev)
150
+ visible.prevPage = page - 1;
151
+ return visible;
152
+ });
153
+ return { data: result.data, pagination };
154
+ }
155
+ async function executeOffsetMode(ctx, options, total, shouldCount, recurse) {
156
+ const { position, limit: limitOpt } = options;
157
+ if (typeof position !== 'number' || isNaN(position)) {
158
+ throw new relq_errors_1.RelqQueryError('pagination() offset mode requires "position" as a number', { hint: 'position must be >= 0' });
159
+ }
160
+ if (limitOpt === undefined || (typeof limitOpt !== 'number' && !Array.isArray(limitOpt))) {
161
+ throw new relq_errors_1.RelqQueryError('pagination() offset mode requires "limit" as a number or [min, max] array', { hint: 'Use limit: number or limit: [min, max]' });
162
+ }
163
+ const limit = Array.isArray(limitOpt) ? (0, pagination_types_1.randomLimit)(limitOpt) : limitOpt;
164
+ ctx.builder.limit(limit + 1);
165
+ ctx.builder.offset(position);
166
+ const sql = ctx.builder.toString();
167
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelect(sql, ctx.tableName);
168
+ const hasMore = result.data.length > limit;
169
+ const hasPrev = position > 0;
170
+ const data = hasMore ? result.data.slice(0, limit) : result.data;
171
+ const pagination = {
172
+ position,
173
+ limit,
174
+ ...(shouldCount && { total }),
175
+ };
176
+ if (hasMore) {
177
+ pagination.hasMore = true;
178
+ pagination.nextPos = position + limit;
179
+ Object.defineProperty(pagination, 'loadNext', {
180
+ value: () => recurse({ ...options, position: position + limit }),
181
+ enumerable: false,
182
+ configurable: false
183
+ });
184
+ }
185
+ else {
186
+ pagination.hasMore = false;
187
+ }
188
+ if (hasPrev) {
189
+ pagination.hasPrev = true;
190
+ pagination.prevPos = Math.max(0, position - limit);
191
+ Object.defineProperty(pagination, 'loadPrev', {
192
+ value: () => recurse({ ...options, position: Math.max(0, position - limit) }),
193
+ enumerable: false,
194
+ configurable: false
195
+ });
196
+ }
197
+ else {
198
+ pagination.hasPrev = false;
199
+ }
200
+ addInspectProperties(pagination, () => {
201
+ const visible = { position, limit };
202
+ if (shouldCount)
203
+ visible.total = total;
204
+ visible.hasMore = hasMore;
205
+ if (hasMore)
206
+ visible.nextPos = position + limit;
207
+ visible.hasPrev = hasPrev;
208
+ if (hasPrev)
209
+ visible.prevPos = Math.max(0, position - limit);
210
+ return visible;
211
+ });
212
+ return { data, pagination };
213
+ }
214
+ function closeCursor(cursor) {
215
+ return new Promise((resolve, reject) => {
216
+ cursor.close((err) => {
217
+ if (err)
218
+ reject(err);
219
+ else
220
+ resolve();
221
+ });
222
+ });
223
+ }
224
+ function addInspectProperties(obj, getVisibleProps) {
225
+ Object.defineProperty(obj, Symbol.for('nodejs.util.inspect.custom'), {
226
+ value: () => getVisibleProps(),
227
+ enumerable: false
228
+ });
229
+ Object.defineProperty(obj, 'toJSON', {
230
+ value: () => getVisibleProps(),
231
+ enumerable: false
232
+ });
233
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COCKROACHDB_CAPABILITIES = void 0;
4
+ exports.COCKROACHDB_CAPABILITIES = {
5
+ returning: true,
6
+ lateral: true,
7
+ distinctOn: true,
8
+ listenNotify: false,
9
+ pooling: true,
10
+ cursors: true,
11
+ jsonb: true,
12
+ arrays: true,
13
+ ranges: false,
14
+ fullTextSearch: false,
15
+ upsert: true,
16
+ forUpdateSkipLocked: true,
17
+ windowFunctions: true,
18
+ cte: true,
19
+ recursiveCte: true,
20
+ explainAnalyze: true,
21
+ savepoints: true,
22
+ createTableAs: true,
23
+ materializedViews: true,
24
+ storedProcedures: true,
25
+ triggers: true,
26
+ sequences: true,
27
+ copy: true,
28
+ vacuum: true,
29
+ identifierQuote: '"',
30
+ parameterStyle: 'dollar',
31
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COCKROACHDB_CAPABILITIES = exports.RelqCockroachDB = void 0;
4
+ var relq_cockroach_1 = require("./relq-cockroach.cjs");
5
+ Object.defineProperty(exports, "RelqCockroachDB", { enumerable: true, get: function () { return relq_cockroach_1.RelqCockroachDB; } });
6
+ var capabilities_1 = require("./capabilities.cjs");
7
+ Object.defineProperty(exports, "COCKROACHDB_CAPABILITIES", { enumerable: true, get: function () { return capabilities_1.COCKROACHDB_CAPABILITIES; } });
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelqCockroachDB = void 0;
4
+ const pg_base_1 = require("../shared/pg-base.cjs");
5
+ const capabilities_1 = require("./capabilities.cjs");
6
+ const env_resolver_1 = require("../../../utils/env-resolver.cjs");
7
+ class RelqCockroachDB extends pg_base_1.PgBase {
8
+ dialect = 'cockroachdb';
9
+ capabilities = capabilities_1.COCKROACHDB_CAPABILITIES;
10
+ constructor(schema, config = {}) {
11
+ (0, env_resolver_1.validateEnvConfig)('cockroachdb', config);
12
+ const resolvedConfig = (0, env_resolver_1.mergeWithPgEnv)({ ...config, dialect: 'cockroachdb' });
13
+ super(schema, resolvedConfig);
14
+ }
15
+ }
16
+ exports.RelqCockroachDB = RelqCockroachDB;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DSQL_CAPABILITIES = void 0;
4
+ exports.DSQL_CAPABILITIES = {
5
+ returning: true,
6
+ lateral: true,
7
+ distinctOn: true,
8
+ listenNotify: false,
9
+ pooling: true,
10
+ cursors: true,
11
+ jsonb: false,
12
+ arrays: false,
13
+ ranges: false,
14
+ fullTextSearch: false,
15
+ upsert: true,
16
+ forUpdateSkipLocked: true,
17
+ windowFunctions: true,
18
+ cte: true,
19
+ recursiveCte: true,
20
+ explainAnalyze: true,
21
+ savepoints: true,
22
+ createTableAs: true,
23
+ materializedViews: true,
24
+ storedProcedures: false,
25
+ triggers: false,
26
+ sequences: false,
27
+ copy: true,
28
+ vacuum: false,
29
+ identifierQuote: '"',
30
+ parameterStyle: 'dollar',
31
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DSQL_CAPABILITIES = exports.RelqDsql = void 0;
4
+ var relq_dsql_1 = require("./relq-dsql.cjs");
5
+ Object.defineProperty(exports, "RelqDsql", { enumerable: true, get: function () { return relq_dsql_1.RelqDsql; } });
6
+ var capabilities_1 = require("./capabilities.cjs");
7
+ Object.defineProperty(exports, "DSQL_CAPABILITIES", { enumerable: true, get: function () { return capabilities_1.DSQL_CAPABILITIES; } });
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelqDsql = void 0;
4
+ const pg_base_1 = require("../shared/pg-base.cjs");
5
+ const capabilities_1 = require("./capabilities.cjs");
6
+ const env_resolver_1 = require("../../../utils/env-resolver.cjs");
7
+ class RelqDsql extends pg_base_1.PgBase {
8
+ dialect = 'awsdsql';
9
+ capabilities = capabilities_1.DSQL_CAPABILITIES;
10
+ constructor(schema, config = {}) {
11
+ (0, env_resolver_1.validateEnvConfig)('awsdsql', config);
12
+ const resolvedConfig = (0, env_resolver_1.mergeWithAwsEnv)({ ...config, dialect: 'awsdsql' });
13
+ super(schema, resolvedConfig);
14
+ }
15
+ }
16
+ exports.RelqDsql = RelqDsql;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pgDialect = exports.PgBase = exports.COCKROACHDB_CAPABILITIES = exports.RelqCockroachDB = exports.DSQL_CAPABILITIES = exports.RelqDsql = exports.NILE_CAPABILITIES = exports.RelqNile = exports.PG_CAPABILITIES = exports.RelqPostgres = void 0;
4
+ var pg_client_1 = require("./pg-client/index.cjs");
5
+ Object.defineProperty(exports, "RelqPostgres", { enumerable: true, get: function () { return pg_client_1.RelqPostgres; } });
6
+ Object.defineProperty(exports, "PG_CAPABILITIES", { enumerable: true, get: function () { return pg_client_1.PG_CAPABILITIES; } });
7
+ var nile_client_1 = require("./nile-client/index.cjs");
8
+ Object.defineProperty(exports, "RelqNile", { enumerable: true, get: function () { return nile_client_1.RelqNile; } });
9
+ Object.defineProperty(exports, "NILE_CAPABILITIES", { enumerable: true, get: function () { return nile_client_1.NILE_CAPABILITIES; } });
10
+ var dsql_client_1 = require("./dsql-client/index.cjs");
11
+ Object.defineProperty(exports, "RelqDsql", { enumerable: true, get: function () { return dsql_client_1.RelqDsql; } });
12
+ Object.defineProperty(exports, "DSQL_CAPABILITIES", { enumerable: true, get: function () { return dsql_client_1.DSQL_CAPABILITIES; } });
13
+ var cockroachdb_client_1 = require("./cockroachdb-client/index.cjs");
14
+ Object.defineProperty(exports, "RelqCockroachDB", { enumerable: true, get: function () { return cockroachdb_client_1.RelqCockroachDB; } });
15
+ Object.defineProperty(exports, "COCKROACHDB_CAPABILITIES", { enumerable: true, get: function () { return cockroachdb_client_1.COCKROACHDB_CAPABILITIES; } });
16
+ var pg_base_1 = require("./shared/pg-base.cjs");
17
+ Object.defineProperty(exports, "PgBase", { enumerable: true, get: function () { return pg_base_1.PgBase; } });
18
+ var pg_dialect_1 = require("./shared/pg-dialect.cjs");
19
+ Object.defineProperty(exports, "pgDialect", { enumerable: true, get: function () { return pg_dialect_1.pgDialect; } });
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NILE_CAPABILITIES = void 0;
4
+ exports.NILE_CAPABILITIES = {
5
+ returning: true,
6
+ lateral: true,
7
+ distinctOn: true,
8
+ listenNotify: false,
9
+ pooling: true,
10
+ cursors: true,
11
+ jsonb: true,
12
+ arrays: true,
13
+ ranges: true,
14
+ fullTextSearch: true,
15
+ upsert: true,
16
+ forUpdateSkipLocked: true,
17
+ windowFunctions: true,
18
+ cte: true,
19
+ recursiveCte: true,
20
+ explainAnalyze: true,
21
+ savepoints: true,
22
+ createTableAs: true,
23
+ materializedViews: true,
24
+ storedProcedures: true,
25
+ triggers: true,
26
+ sequences: true,
27
+ copy: true,
28
+ vacuum: true,
29
+ identifierQuote: '"',
30
+ parameterStyle: 'dollar',
31
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NILE_CAPABILITIES = exports.RelqNile = void 0;
4
+ var relq_nile_1 = require("./relq-nile.cjs");
5
+ Object.defineProperty(exports, "RelqNile", { enumerable: true, get: function () { return relq_nile_1.RelqNile; } });
6
+ var capabilities_1 = require("./capabilities.cjs");
7
+ Object.defineProperty(exports, "NILE_CAPABILITIES", { enumerable: true, get: function () { return capabilities_1.NILE_CAPABILITIES; } });
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelqNile = void 0;
4
+ const pg_base_1 = require("../shared/pg-base.cjs");
5
+ const capabilities_1 = require("./capabilities.cjs");
6
+ const tenant_context_1 = require("./tenant-context.cjs");
7
+ const env_resolver_1 = require("../../../utils/env-resolver.cjs");
8
+ class RelqNile extends pg_base_1.PgBase {
9
+ dialect = 'nile';
10
+ capabilities = capabilities_1.NILE_CAPABILITIES;
11
+ tenantCtx = new tenant_context_1.TenantContext();
12
+ constructor(schema, config = {}) {
13
+ (0, env_resolver_1.validateEnvConfig)('nile', config);
14
+ const resolvedConfig = (0, env_resolver_1.mergeWithPgEnv)({ ...config, dialect: 'nile' });
15
+ super(schema, resolvedConfig);
16
+ }
17
+ get queryFn() {
18
+ return async (sql) => { await this._executeQuery(sql); };
19
+ }
20
+ async setTenant(tenantId) {
21
+ await this.ensureInitialized();
22
+ await this.tenantCtx.setTenant(tenantId, this.queryFn);
23
+ }
24
+ async clearTenant() {
25
+ await this.ensureInitialized();
26
+ await this.tenantCtx.clearTenant(this.queryFn);
27
+ }
28
+ getTenantContext() {
29
+ return this.tenantCtx.getTenantId();
30
+ }
31
+ async withTenant(tenantId, callback) {
32
+ await this.ensureInitialized();
33
+ return this.tenantCtx.withTenant(tenantId, this.queryFn, callback);
34
+ }
35
+ }
36
+ exports.RelqNile = RelqNile;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TenantContext = void 0;
4
+ const relq_errors_1 = require("../../../../shared/errors/relq-errors.cjs");
5
+ function escapeTenantId(value) {
6
+ if (value.includes('\0')) {
7
+ throw new relq_errors_1.RelqConfigError('Tenant ID cannot contain null bytes', {
8
+ field: 'tenantId',
9
+ value: '<contains null byte>'
10
+ });
11
+ }
12
+ return value.replace(/'/g, "''");
13
+ }
14
+ class TenantContext {
15
+ currentTenantId = null;
16
+ async setTenant(tenantId, queryFn) {
17
+ const escapedId = escapeTenantId(tenantId);
18
+ await queryFn(`SET nile.tenant_id = '${escapedId}'`);
19
+ this.currentTenantId = tenantId;
20
+ }
21
+ async clearTenant(queryFn) {
22
+ await queryFn('RESET nile.tenant_id');
23
+ this.currentTenantId = null;
24
+ }
25
+ getTenantId() {
26
+ return this.currentTenantId;
27
+ }
28
+ async withTenant(tenantId, queryFn, callback) {
29
+ const previousTenantId = this.currentTenantId;
30
+ try {
31
+ await this.setTenant(tenantId, queryFn);
32
+ return await callback();
33
+ }
34
+ finally {
35
+ if (previousTenantId) {
36
+ await this.setTenant(previousTenantId, queryFn);
37
+ }
38
+ else {
39
+ await this.clearTenant(queryFn);
40
+ }
41
+ }
42
+ }
43
+ }
44
+ exports.TenantContext = TenantContext;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PG_CAPABILITIES = void 0;
4
+ exports.PG_CAPABILITIES = {
5
+ returning: true,
6
+ lateral: true,
7
+ distinctOn: true,
8
+ listenNotify: true,
9
+ pooling: true,
10
+ cursors: true,
11
+ jsonb: true,
12
+ arrays: true,
13
+ ranges: true,
14
+ fullTextSearch: true,
15
+ upsert: true,
16
+ forUpdateSkipLocked: true,
17
+ windowFunctions: true,
18
+ cte: true,
19
+ recursiveCte: true,
20
+ explainAnalyze: true,
21
+ savepoints: true,
22
+ createTableAs: true,
23
+ materializedViews: true,
24
+ storedProcedures: true,
25
+ triggers: true,
26
+ sequences: true,
27
+ copy: true,
28
+ vacuum: true,
29
+ identifierQuote: '"',
30
+ parameterStyle: 'dollar',
31
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PG_CAPABILITIES = exports.RelqPostgres = void 0;
4
+ var relq_postgres_1 = require("./relq-postgres.cjs");
5
+ Object.defineProperty(exports, "RelqPostgres", { enumerable: true, get: function () { return relq_postgres_1.RelqPostgres; } });
6
+ var capabilities_1 = require("./capabilities.cjs");
7
+ Object.defineProperty(exports, "PG_CAPABILITIES", { enumerable: true, get: function () { return capabilities_1.PG_CAPABILITIES; } });
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelqPostgres = void 0;
4
+ const listener_connection_1 = require("../../../pubsub/listener-connection.cjs");
5
+ const env_resolver_1 = require("../../../utils/env-resolver.cjs");
6
+ const pg_base_1 = require("../shared/pg-base.cjs");
7
+ const capabilities_1 = require("./capabilities.cjs");
8
+ class RelqPostgres extends pg_base_1.PgBase {
9
+ dialect = 'postgres';
10
+ capabilities = capabilities_1.PG_CAPABILITIES;
11
+ listener = null;
12
+ constructor(schema, config = {}) {
13
+ (0, env_resolver_1.validateEnvConfig)('postgres', config);
14
+ const resolvedConfig = (0, env_resolver_1.mergeWithPgEnv)({ ...config, dialect: 'postgres' });
15
+ super(schema, resolvedConfig);
16
+ }
17
+ async subscribe(channel, callback) {
18
+ if (!this.listener) {
19
+ this.listener = new listener_connection_1.ListenerConnection({
20
+ host: this.config.host,
21
+ port: this.config.port,
22
+ user: this.config.user,
23
+ password: this.config.password,
24
+ database: this.config.database,
25
+ connectionString: this.config.connectionString,
26
+ ssl: this.config.ssl
27
+ });
28
+ this.listener.on('error', (err) => this.emitter.emit('listenerError', err));
29
+ this.listener.on('connect', () => this.emitter.emit('listenerConnect'));
30
+ }
31
+ const sub = await this.listener.subscribe(channel);
32
+ sub.on('notification', callback);
33
+ return () => sub.close();
34
+ }
35
+ async _close() {
36
+ if (this.listener) {
37
+ await this.listener.close();
38
+ this.listener = null;
39
+ }
40
+ await super._close();
41
+ }
42
+ }
43
+ exports.RelqPostgres = RelqPostgres;