@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,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReturningExecutor = void 0;
4
+ const insert_builder_1 = require("../../insert/insert-builder.cjs");
5
+ const update_builder_1 = require("../../update/update-builder.cjs");
6
+ const methods_1 = require("./methods.cjs");
7
+ class ReturningExecutor {
8
+ builder;
9
+ relq;
10
+ tableName;
11
+ schemaKey;
12
+ columnMapping;
13
+ constructor(builder, relq, tableName, schemaKey) {
14
+ this.builder = builder;
15
+ this.relq = relq;
16
+ this.tableName = tableName;
17
+ this.schemaKey = schemaKey;
18
+ this.setupColumnMapping();
19
+ }
20
+ setupColumnMapping() {
21
+ if (!this.tableName && !this.schemaKey) {
22
+ return;
23
+ }
24
+ const internal = this.relq[methods_1.INTERNAL];
25
+ const tableDef = internal.getTableDef(this.schemaKey || this.tableName);
26
+ if (!tableDef) {
27
+ return;
28
+ }
29
+ const tableColumns = tableDef.$columns || tableDef;
30
+ this.columnMapping = new Map();
31
+ for (const [propName, columnDef] of Object.entries(tableColumns)) {
32
+ if (columnDef && typeof columnDef === 'object') {
33
+ const sqlName = columnDef.$columnName || propName;
34
+ this.columnMapping.set(sqlName, propName);
35
+ }
36
+ }
37
+ }
38
+ transformRow(row) {
39
+ if (!this.columnMapping) {
40
+ return row;
41
+ }
42
+ const transformed = {};
43
+ for (const [sqlKey, value] of Object.entries(row)) {
44
+ const propName = this.columnMapping.get(sqlKey) || sqlKey;
45
+ transformed[propName] = value;
46
+ }
47
+ return transformed;
48
+ }
49
+ toString() {
50
+ return this.builder.toString();
51
+ }
52
+ async run(withMetadata) {
53
+ if (this.builder instanceof insert_builder_1.InsertBuilder) {
54
+ for (const row of this.builder.insertData) {
55
+ this.relq[methods_1.INTERNAL].validateData(this.builder.tableName, row, 'insert');
56
+ }
57
+ }
58
+ else if (this.builder instanceof update_builder_1.UpdateBuilder) {
59
+ this.relq[methods_1.INTERNAL].validateData(this.builder.tableName, this.builder.updateData, 'update');
60
+ }
61
+ const sql = this.builder.toString();
62
+ const result = await this.relq[methods_1.INTERNAL].executeSelect(sql);
63
+ const transformedData = result.data.map(row => this.transformRow(row));
64
+ if (withMetadata) {
65
+ return { ...result, data: transformedData };
66
+ }
67
+ return transformedData;
68
+ }
69
+ }
70
+ exports.ReturningExecutor = ReturningExecutor;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireCapability = requireCapability;
4
+ const errors_1 = require("../shared/errors.cjs");
5
+ function requireCapability(relq, capability, featureName, suggestion) {
6
+ const value = relq.capabilities[capability];
7
+ if (value === false) {
8
+ throw new errors_1.RelqDialectError(`${featureName} is not supported`, relq.dialect, suggestion);
9
+ }
10
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.debugLog = exports.INTERNAL = exports.ReturningExecutor = exports.PaginateBuilder = exports.ConnectedRawQueryBuilder = exports.ConnectedQueryBuilder = exports.executeTransaction = exports.TransactionClient = exports.ConnectedCountBuilder = exports.ConnectedInsertBuilder = exports.ConnectedDeleteBuilder = exports.ConnectedUpdateBuilder = exports.ConnectedSelectBuilder = exports.ConnectedCTEBuilder = exports.ConnectedAggregateBuilder = void 0;
4
+ var ConnectedAggregateBuilder_1 = require("./ConnectedAggregateBuilder.cjs");
5
+ Object.defineProperty(exports, "ConnectedAggregateBuilder", { enumerable: true, get: function () { return ConnectedAggregateBuilder_1.ConnectedAggregateBuilder; } });
6
+ var ConnectedCTEBuilder_1 = require("./ConnectedCTEBuilder.cjs");
7
+ Object.defineProperty(exports, "ConnectedCTEBuilder", { enumerable: true, get: function () { return ConnectedCTEBuilder_1.ConnectedCTEBuilder; } });
8
+ var ConnectedSelectBuilder_1 = require("./ConnectedSelectBuilder.cjs");
9
+ Object.defineProperty(exports, "ConnectedSelectBuilder", { enumerable: true, get: function () { return ConnectedSelectBuilder_1.ConnectedSelectBuilder; } });
10
+ var ConnectedUpdateBuilder_1 = require("./ConnectedUpdateBuilder.cjs");
11
+ Object.defineProperty(exports, "ConnectedUpdateBuilder", { enumerable: true, get: function () { return ConnectedUpdateBuilder_1.ConnectedUpdateBuilder; } });
12
+ var ConnectedDeleteBuilder_1 = require("./ConnectedDeleteBuilder.cjs");
13
+ Object.defineProperty(exports, "ConnectedDeleteBuilder", { enumerable: true, get: function () { return ConnectedDeleteBuilder_1.ConnectedDeleteBuilder; } });
14
+ var ConnectedInsertBuilder_1 = require("./ConnectedInsertBuilder.cjs");
15
+ Object.defineProperty(exports, "ConnectedInsertBuilder", { enumerable: true, get: function () { return ConnectedInsertBuilder_1.ConnectedInsertBuilder; } });
16
+ var ConnectedCountBuilder_1 = require("./ConnectedCountBuilder.cjs");
17
+ Object.defineProperty(exports, "ConnectedCountBuilder", { enumerable: true, get: function () { return ConnectedCountBuilder_1.ConnectedCountBuilder; } });
18
+ var ConnectedTransactionBuilder_1 = require("./ConnectedTransactionBuilder.cjs");
19
+ Object.defineProperty(exports, "TransactionClient", { enumerable: true, get: function () { return ConnectedTransactionBuilder_1.TransactionClient; } });
20
+ Object.defineProperty(exports, "executeTransaction", { enumerable: true, get: function () { return ConnectedTransactionBuilder_1.executeTransaction; } });
21
+ var ConnectedQueryBuilder_1 = require("./ConnectedQueryBuilder.cjs");
22
+ Object.defineProperty(exports, "ConnectedQueryBuilder", { enumerable: true, get: function () { return ConnectedQueryBuilder_1.ConnectedQueryBuilder; } });
23
+ var ConnectedRawQueryBuilder_1 = require("./ConnectedRawQueryBuilder.cjs");
24
+ Object.defineProperty(exports, "ConnectedRawQueryBuilder", { enumerable: true, get: function () { return ConnectedRawQueryBuilder_1.ConnectedRawQueryBuilder; } });
25
+ var PaginateBuilder_1 = require("./PaginateBuilder.cjs");
26
+ Object.defineProperty(exports, "PaginateBuilder", { enumerable: true, get: function () { return PaginateBuilder_1.PaginateBuilder; } });
27
+ var ReturningExecutor_1 = require("./ReturningExecutor.cjs");
28
+ Object.defineProperty(exports, "ReturningExecutor", { enumerable: true, get: function () { return ReturningExecutor_1.ReturningExecutor; } });
29
+ var methods_1 = require("./methods.cjs");
30
+ Object.defineProperty(exports, "INTERNAL", { enumerable: true, get: function () { return methods_1.INTERNAL; } });
31
+ Object.defineProperty(exports, "debugLog", { enumerable: true, get: function () { return methods_1.debugLog; } });
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INTERNAL = void 0;
4
+ exports.debugLog = debugLog;
5
+ exports.INTERNAL = Symbol('relq-internal');
6
+ function debugLog(config, ...args) {
7
+ if (config?.logLevel === 'debug') {
8
+ console.log('[Relq DEBUG]', ...args);
9
+ }
10
+ }
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.executeFindById = executeFindById;
37
+ exports.executeFindOne = executeFindOne;
38
+ exports.executeFindMany = executeFindMany;
39
+ exports.executeExists = executeExists;
40
+ exports.executeUpsert = executeUpsert;
41
+ exports.executeSoftDelete = executeSoftDelete;
42
+ exports.executeRestore = executeRestore;
43
+ exports.executeCreateWith = executeCreateWith;
44
+ exports.getPrimaryKeyColumn = getPrimaryKeyColumn;
45
+ const count_builder_1 = require("../../count/count-builder.cjs");
46
+ const insert_builder_1 = require("../../insert/insert-builder.cjs");
47
+ const select_builder_1 = require("../../select/select-builder.cjs");
48
+ const update_builder_1 = require("../../update/update-builder.cjs");
49
+ const methods_1 = require("./methods.cjs");
50
+ async function executeFindById(ctx, id, getPrimaryKeyColumn) {
51
+ const pkColumn = getPrimaryKeyColumn();
52
+ const dbColumn = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, { [pkColumn]: id });
53
+ const dbColName = Object.keys(dbColumn)[0];
54
+ const builder = new select_builder_1.SelectBuilder(ctx.tableName, ['*']);
55
+ builder.where(q => q.equal(dbColName, id));
56
+ builder.limit(1);
57
+ const sql = builder.toString();
58
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelectOne(sql, ctx.tableName);
59
+ return result.data;
60
+ }
61
+ async function executeFindOne(ctx, filter) {
62
+ const builder = new select_builder_1.SelectBuilder(ctx.tableName, ['*']);
63
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
64
+ builder.where(q => {
65
+ for (const [col, val] of Object.entries(dbFilter)) {
66
+ q.equal(col, val);
67
+ }
68
+ return q;
69
+ });
70
+ builder.limit(1);
71
+ const sql = builder.toString();
72
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelectOne(sql, ctx.tableName);
73
+ return result.data;
74
+ }
75
+ async function executeFindMany(ctx, filter) {
76
+ const builder = new select_builder_1.SelectBuilder(ctx.tableName, ['*']);
77
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
78
+ builder.where(q => {
79
+ for (const [col, val] of Object.entries(dbFilter)) {
80
+ q.equal(col, val);
81
+ }
82
+ return q;
83
+ });
84
+ const sql = builder.toString();
85
+ const result = await ctx.relq[methods_1.INTERNAL].executeSelect(sql, ctx.tableName);
86
+ return result.data;
87
+ }
88
+ async function executeExists(ctx, filter) {
89
+ const builder = new count_builder_1.CountBuilder(ctx.tableName);
90
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
91
+ builder.where(q => {
92
+ for (const [col, val] of Object.entries(dbFilter)) {
93
+ q.equal(col, val);
94
+ }
95
+ return q;
96
+ });
97
+ const sql = builder.toString();
98
+ const result = await ctx.relq[methods_1.INTERNAL].executeCount(sql);
99
+ return result.count > 0;
100
+ }
101
+ async function executeUpsert(ctx, options) {
102
+ const dbCreate = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, options.create);
103
+ const dbUpdate = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, options.update);
104
+ const dbWhere = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, options.where);
105
+ const conflictColumn = Object.keys(dbWhere)[0];
106
+ const builder = new insert_builder_1.InsertBuilder(ctx.tableName, dbCreate);
107
+ builder._onConflict(conflictColumn, cb => cb.doUpdate(dbUpdate));
108
+ builder.returning(['*']);
109
+ const sql = builder.toString();
110
+ const result = await ctx.relq[methods_1.INTERNAL].executeQuery(sql);
111
+ const transformed = ctx.relq[methods_1.INTERNAL].transformResultsFromDb(ctx.tableName, result.result.rows);
112
+ return transformed[0];
113
+ }
114
+ async function executeSoftDelete(ctx, filter) {
115
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
116
+ const builder = new update_builder_1.UpdateBuilder(ctx.tableName, { deleted_at: new Date() });
117
+ builder.where(q => {
118
+ for (const [col, val] of Object.entries(dbFilter)) {
119
+ q.equal(col, val);
120
+ }
121
+ return q;
122
+ });
123
+ builder.returning(['*']);
124
+ const sql = builder.toString();
125
+ const result = await ctx.relq[methods_1.INTERNAL].executeQuery(sql);
126
+ if (result.result.rows.length === 0)
127
+ return null;
128
+ const transformed = ctx.relq[methods_1.INTERNAL].transformResultsFromDb(ctx.tableName, result.result.rows);
129
+ return transformed[0];
130
+ }
131
+ async function executeRestore(ctx, filter) {
132
+ const dbFilter = ctx.relq[methods_1.INTERNAL].transformToDbColumns(ctx.tableName, filter);
133
+ const builder = new update_builder_1.UpdateBuilder(ctx.tableName, { deleted_at: null });
134
+ builder.where(q => {
135
+ for (const [col, val] of Object.entries(dbFilter)) {
136
+ q.equal(col, val);
137
+ }
138
+ return q;
139
+ });
140
+ builder.returning(['*']);
141
+ const sql = builder.toString();
142
+ const result = await ctx.relq[methods_1.INTERNAL].executeQuery(sql);
143
+ if (result.result.rows.length === 0)
144
+ return null;
145
+ const transformed = ctx.relq[methods_1.INTERNAL].transformResultsFromDb(ctx.tableName, result.result.rows);
146
+ return transformed[0];
147
+ }
148
+ async function executeCreateWith(ctx, parentData, related) {
149
+ const internal = ctx.relq[methods_1.INTERNAL];
150
+ const schema = internal.getSchema();
151
+ const relations = internal.getRelations();
152
+ if (!schema || !relations) {
153
+ throw new Error('Cannot use createWith() without schema and relations config. ' +
154
+ 'Use separate insert calls with a transaction instead.');
155
+ }
156
+ const parentSchemaKey = findSchemaKeyByTableName(schema, ctx.tableName) || ctx.tableName;
157
+ try {
158
+ await internal.executeRun('BEGIN');
159
+ const dbParent = internal.transformToDbColumns(ctx.tableName, parentData);
160
+ const parentBuilder = new insert_builder_1.InsertBuilder(ctx.tableName, dbParent);
161
+ parentBuilder.returning(['*']);
162
+ const parentSQL = parentBuilder.toString();
163
+ const parentResult = await internal.executeQuery(parentSQL);
164
+ if (!parentResult.result.rows || parentResult.result.rows.length === 0) {
165
+ throw new Error('Parent insert returned no rows');
166
+ }
167
+ const parentRow = parentResult.result.rows[0];
168
+ for (const [relationKey, childData] of Object.entries(related)) {
169
+ const childTableDef = schema[relationKey];
170
+ if (!childTableDef) {
171
+ throw new Error(`Unknown table "${relationKey}" in createWith(). Check your schema.`);
172
+ }
173
+ const childTableName = childTableDef.$name || relationKey;
174
+ const { resolveForeignKey } = await Promise.resolve().then(() => __importStar(require("../../utils/fk-resolver.cjs")));
175
+ const fk = resolveForeignKey(relations, schema, parentSchemaKey, relationKey);
176
+ if (!fk) {
177
+ throw new Error(`No FK relationship between "${parentSchemaKey}" and "${relationKey}". ` +
178
+ 'Define the relationship in your relations config.');
179
+ }
180
+ let fkColumn;
181
+ let fkValue;
182
+ if (fk.direction === 'reverse') {
183
+ fkColumn = fk.toColumn;
184
+ fkValue = parentRow[fk.fromColumn];
185
+ }
186
+ else {
187
+ fkColumn = fk.fromColumn;
188
+ fkValue = parentRow[fk.toColumn];
189
+ }
190
+ const rows = Array.isArray(childData) ? childData : [childData];
191
+ if (rows.length === 0)
192
+ continue;
193
+ const firstRow = { ...rows[0], [fkColumn]: fkValue };
194
+ const dbFirst = internal.transformToDbColumns(childTableName, firstRow);
195
+ const childBuilder = new insert_builder_1.InsertBuilder(childTableName, dbFirst);
196
+ for (let i = 1; i < rows.length; i++) {
197
+ const row = { ...rows[i], [fkColumn]: fkValue };
198
+ const dbRow = internal.transformToDbColumns(childTableName, row);
199
+ childBuilder.addRow(dbRow);
200
+ }
201
+ const childSQL = childBuilder.toString();
202
+ await internal.executeQuery(childSQL);
203
+ }
204
+ await internal.executeRun('COMMIT');
205
+ const transformed = internal.transformResultsFromDb(ctx.tableName, [parentRow]);
206
+ return transformed[0];
207
+ }
208
+ catch (error) {
209
+ try {
210
+ await internal.executeRun('ROLLBACK');
211
+ }
212
+ catch {
213
+ }
214
+ throw error;
215
+ }
216
+ }
217
+ function findSchemaKeyByTableName(schema, tableName) {
218
+ for (const [key, def] of Object.entries(schema)) {
219
+ if (def?.$name === tableName || key === tableName) {
220
+ return key;
221
+ }
222
+ }
223
+ return null;
224
+ }
225
+ function getPrimaryKeyColumn(relq, tableName) {
226
+ const schema = relq.schema;
227
+ if (schema && schema[tableName]) {
228
+ const tableSchema = schema[tableName];
229
+ for (const [colName, colDef] of Object.entries(tableSchema)) {
230
+ if (colDef && typeof colDef === 'object' &&
231
+ ('$primaryKey' in colDef ||
232
+ colDef.config?.$primaryKey === true)) {
233
+ return colName;
234
+ }
235
+ }
236
+ }
237
+ return 'id';
238
+ }
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeTypeSafeJoin = executeTypeSafeJoin;
4
+ exports.executeTypeSafeJoinMany = executeTypeSafeJoinMany;
5
+ exports.executeTypeSafeJoinManyThrough = executeTypeSafeJoinManyThrough;
6
+ const table_proxy_1 = require("../../select/table-proxy.cjs");
7
+ const join_condition_builder_1 = require("../../select/join-condition-builder.cjs");
8
+ const join_internals_1 = require("../../select/join-internals.cjs");
9
+ const join_many_condition_builder_1 = require("../../select/join-many-condition-builder.cjs");
10
+ const relq_errors_1 = require("../../../shared/errors/relq-errors.cjs");
11
+ const fk_resolver_1 = require("../../utils/fk-resolver.cjs");
12
+ const methods_1 = require("./methods.cjs");
13
+ function executeTypeSafeJoin(ctx, joinType, tableOrAlias, callback) {
14
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
15
+ ? tableOrAlias
16
+ : [tableOrAlias, tableOrAlias];
17
+ const internal = ctx.relq[methods_1.INTERNAL];
18
+ const schema = internal.getSchema();
19
+ const relations = internal.getRelations();
20
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
21
+ const rightTableDef = internal.getTableDef(rightTableKey);
22
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
23
+ const rightTableName = rightTableDef?.$name || rightTableKey;
24
+ const leftAlias = ctx.builder.getTableIdentifier();
25
+ const leftProxy = (0, table_proxy_1.createTableProxy)(leftTableName, leftAlias, leftTableDef);
26
+ const rightProxy = (0, table_proxy_1.createTableProxy)(rightTableName, rightAlias, rightTableDef);
27
+ const conditionBuilder = new join_condition_builder_1.JoinConditionBuilder();
28
+ if (callback) {
29
+ if (joinType === 'RIGHT JOIN') {
30
+ callback(conditionBuilder, leftProxy, rightProxy);
31
+ }
32
+ else {
33
+ callback(conditionBuilder, rightProxy, leftProxy);
34
+ }
35
+ }
36
+ const conditionInternals = conditionBuilder[join_internals_1.JOIN_INTERNAL];
37
+ if (!conditionInternals.hasConditions() && schema && relations) {
38
+ const fkResolution = (0, fk_resolver_1.resolveForeignKey)(relations, schema, ctx.schemaKey || ctx.tableName, rightTableKey);
39
+ if (fkResolution) {
40
+ const leftCol = leftProxy[fkResolution.fromColumn];
41
+ const rightCol = rightProxy[fkResolution.toColumn];
42
+ conditionBuilder.equal(leftCol, rightCol);
43
+ }
44
+ else {
45
+ throw new relq_errors_1.RelqQueryError(`Cannot auto-resolve FK relationship between "${ctx.schemaKey || ctx.tableName}" and "${rightTableKey}". ` +
46
+ `Either provide a callback with explicit join conditions, or define the relationship in your relations config.`, { hint: `Use .join('${rightTableKey}', (on, ${rightTableKey}, source) => on.equal(${rightTableKey}.id, source.columnName))` });
47
+ }
48
+ }
49
+ const selectedProps = conditionInternals.getSelectedColumns();
50
+ let selectColumns;
51
+ const toSnake = (s) => s.replace(/[A-Z]/g, l => `_${l.toLowerCase()}`);
52
+ if (selectedProps && selectedProps.length > 0) {
53
+ const rightColumns = rightTableDef?.$columns || rightTableDef;
54
+ selectColumns = selectedProps.map(prop => {
55
+ const columnDef = rightColumns?.[prop];
56
+ const sqlName = columnDef?.$columnName || toSnake(prop);
57
+ return { property: prop, sqlName };
58
+ });
59
+ }
60
+ else if (rightTableDef) {
61
+ const rightColumns = rightTableDef.$columns || rightTableDef;
62
+ selectColumns = Object.entries(rightColumns)
63
+ .filter(([_, colDef]) => colDef && typeof colDef === 'object' && '$type' in colDef)
64
+ .map(([propName, colDef]) => ({
65
+ property: propName,
66
+ sqlName: colDef.$columnName || toSnake(propName),
67
+ }));
68
+ }
69
+ const joinClause = {
70
+ type: joinType,
71
+ table: rightTableName,
72
+ alias: rightAlias,
73
+ schemaKey: rightTableKey,
74
+ onClause: conditionInternals.toSQL() || undefined,
75
+ usingColumns: conditionInternals.getUsingColumns() || undefined,
76
+ selectColumns
77
+ };
78
+ ctx.builder.addStructuredJoin(joinClause);
79
+ }
80
+ function executeTypeSafeJoinMany(ctx, joinType, tableOrAlias, callback) {
81
+ const [rightTableKey, rightAlias] = Array.isArray(tableOrAlias)
82
+ ? tableOrAlias
83
+ : [tableOrAlias, tableOrAlias];
84
+ const internal = ctx.relq[methods_1.INTERNAL];
85
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
86
+ const rightTableDef = internal.getTableDef(rightTableKey);
87
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
88
+ const rightTableName = rightTableDef?.$name || rightTableKey;
89
+ const leftAlias = ctx.builder.getTableIdentifier();
90
+ const leftProxy = (0, table_proxy_1.createTableProxy)(leftTableName, leftAlias, leftTableDef);
91
+ const rightProxy = (0, table_proxy_1.createTableProxy)(rightTableName, rightAlias, rightTableDef);
92
+ const conditionBuilder = new join_many_condition_builder_1.JoinManyConditionBuilder();
93
+ const proxyCreator = (tableKey, alias) => {
94
+ const tableDef = internal.getTableDef(tableKey);
95
+ const sqlTableName = tableDef?.$name || tableKey;
96
+ return {
97
+ proxy: (0, table_proxy_1.createTableProxy)(sqlTableName, alias, tableDef),
98
+ tableName: sqlTableName
99
+ };
100
+ };
101
+ conditionBuilder[join_internals_1.JOIN_SETUP](proxyCreator, rightProxy);
102
+ callback(conditionBuilder, rightProxy, leftProxy);
103
+ const lateralSQL = buildLateralSubquery(rightTableName, rightAlias, conditionBuilder, rightTableDef);
104
+ const lateralJoinType = joinType === 'LEFT JOIN' ? 'LEFT JOIN LATERAL' : 'JOIN LATERAL';
105
+ const joinClause = {
106
+ type: lateralJoinType,
107
+ table: rightTableName,
108
+ alias: rightAlias,
109
+ schemaKey: rightTableKey,
110
+ lateralSubquery: lateralSQL
111
+ };
112
+ ctx.builder.addStructuredJoin(joinClause);
113
+ }
114
+ function buildLateralSubquery(tableName, alias, builder, tableDef) {
115
+ const parts = [];
116
+ parts.push('(SELECT');
117
+ parts.push(`COALESCE(jsonb_agg(row_to_json(sub.*)), '[]'::jsonb) AS ${alias}`);
118
+ parts.push('FROM (');
119
+ const internals = builder[join_internals_1.JOIN_INTERNAL];
120
+ parts.push('SELECT');
121
+ const selectedProps = internals.getSelectedColumns();
122
+ const innerJoins = internals.getInnerJoins();
123
+ const hasInnerJoins = innerJoins.length > 0;
124
+ const toSnake = (s) => s.replace(/[A-Z]/g, l => `_${l.toLowerCase()}`);
125
+ if (selectedProps && selectedProps.length > 0) {
126
+ const tableColumns = tableDef?.$columns || tableDef;
127
+ const selectCols = selectedProps.map(prop => {
128
+ const columnDef = tableColumns?.[prop];
129
+ if (columnDef || !hasInnerJoins) {
130
+ const sqlName = columnDef?.$columnName || toSnake(prop);
131
+ return `"${alias}"."${sqlName}" AS "${prop}"`;
132
+ }
133
+ else {
134
+ const sqlName = toSnake(prop);
135
+ return `"${sqlName}" AS "${prop}"`;
136
+ }
137
+ }).join(', ');
138
+ parts.push(selectCols);
139
+ }
140
+ else {
141
+ parts.push(`"${alias}".*`);
142
+ }
143
+ parts.push(`FROM "${tableName}" AS "${alias}"`);
144
+ for (const join of innerJoins) {
145
+ parts.push(`${join.type} "${join.table}" AS "${join.alias}" ON ${join.onClause}`);
146
+ }
147
+ const whereSQL = internals.toWhereSQL();
148
+ if (whereSQL) {
149
+ parts.push(`WHERE ${whereSQL}`);
150
+ }
151
+ const orderBySQL = internals.toOrderBySQL();
152
+ if (orderBySQL) {
153
+ parts.push(`ORDER BY ${orderBySQL}`);
154
+ }
155
+ const limitSQL = internals.toLimitSQL();
156
+ if (limitSQL) {
157
+ parts.push(limitSQL);
158
+ }
159
+ const offsetSQL = internals.toOffsetSQL();
160
+ if (offsetSQL) {
161
+ parts.push(offsetSQL);
162
+ }
163
+ parts.push(') sub');
164
+ parts.push(`) AS "${alias}_lateral"`);
165
+ return parts.join(' ');
166
+ }
167
+ function executeTypeSafeJoinManyThrough(ctx, joinType, targetTableOrAlias, junctionTableKey, callback) {
168
+ const [targetKey, targetAlias] = Array.isArray(targetTableOrAlias)
169
+ ? targetTableOrAlias
170
+ : [targetTableOrAlias, targetTableOrAlias];
171
+ const internal = ctx.relq[methods_1.INTERNAL];
172
+ const schema = internal.getSchema();
173
+ const relations = internal.getRelations();
174
+ if (!schema || !relations) {
175
+ throw new relq_errors_1.RelqQueryError(`Cannot use { through } without schema and relations config.`, { hint: `Define relations in your schema to use the { through } pattern, or use the callback form of joinMany instead.` });
176
+ }
177
+ const leftTableDef = internal.getTableDef(ctx.schemaKey || ctx.tableName);
178
+ const junctionTableDef = internal.getTableDef(junctionTableKey);
179
+ const targetTableDef = internal.getTableDef(targetKey);
180
+ const leftTableName = leftTableDef?.$name || ctx.tableName;
181
+ const junctionTableName = junctionTableDef?.$name || junctionTableKey;
182
+ const targetTableName = targetTableDef?.$name || targetKey;
183
+ const leftAlias = ctx.builder.getTableIdentifier();
184
+ const leftToJunction = (0, fk_resolver_1.resolveForeignKey)(relations, schema, ctx.schemaKey || ctx.tableName, junctionTableKey);
185
+ if (!leftToJunction) {
186
+ throw new relq_errors_1.RelqQueryError(`Cannot resolve FK between "${ctx.schemaKey || ctx.tableName}" and junction table "${junctionTableKey}".`, { hint: `Define a foreign key relationship between these tables in your relations config, or use the callback form of joinMany instead.` });
187
+ }
188
+ const junctionToTarget = (0, fk_resolver_1.resolveForeignKey)(relations, schema, junctionTableKey, targetKey);
189
+ if (!junctionToTarget) {
190
+ throw new relq_errors_1.RelqQueryError(`Cannot resolve FK between junction table "${junctionTableKey}" and target table "${targetKey}".`, { hint: `Define a foreign key relationship between these tables in your relations config, or use the callback form of joinMany instead.` });
191
+ }
192
+ const conditionBuilder = new join_many_condition_builder_1.JoinManyConditionBuilder();
193
+ if (callback) {
194
+ callback(conditionBuilder);
195
+ }
196
+ const lateralSQL = buildThroughLateralSubquery(junctionTableName, junctionTableKey, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, conditionBuilder, targetTableDef);
197
+ const lateralJoinType = joinType === 'LEFT JOIN' ? 'LEFT JOIN LATERAL' : 'JOIN LATERAL';
198
+ const joinClause = {
199
+ type: lateralJoinType,
200
+ table: targetTableName,
201
+ alias: targetAlias,
202
+ schemaKey: targetKey,
203
+ lateralSubquery: lateralSQL
204
+ };
205
+ ctx.builder.addStructuredJoin(joinClause);
206
+ }
207
+ function buildThroughLateralSubquery(junctionTableName, junctionAlias, targetTableName, targetAlias, leftAlias, leftToJunction, junctionToTarget, builder, targetTableDef) {
208
+ const parts = [];
209
+ const internals = builder[join_internals_1.JOIN_INTERNAL];
210
+ const toSnake = (s) => s.replace(/[A-Z]/g, l => `_${l.toLowerCase()}`);
211
+ parts.push('(SELECT');
212
+ parts.push(`COALESCE(jsonb_agg(row_to_json(sub.*)), '[]'::jsonb) AS ${targetAlias}`);
213
+ parts.push('FROM (');
214
+ parts.push('SELECT');
215
+ const selectedProps = internals.getSelectedColumns();
216
+ if (selectedProps && selectedProps.length > 0) {
217
+ const tableColumns = targetTableDef?.$columns || targetTableDef;
218
+ const selectCols = selectedProps.map(prop => {
219
+ const columnDef = tableColumns?.[prop];
220
+ const sqlName = columnDef?.$columnName || toSnake(prop);
221
+ return `"${targetAlias}"."${sqlName}" AS "${prop}"`;
222
+ }).join(', ');
223
+ parts.push(selectCols);
224
+ }
225
+ else {
226
+ parts.push(`"${targetAlias}".*`);
227
+ }
228
+ parts.push(`FROM "${junctionTableName}" AS "${junctionAlias}"`);
229
+ parts.push(`JOIN "${targetTableName}" AS "${targetAlias}" ON "${junctionAlias}"."${junctionToTarget.fromColumn}" = "${targetAlias}"."${junctionToTarget.toColumn}"`);
230
+ let whereSQL = `"${junctionAlias}"."${leftToJunction.toColumn}" = "${leftAlias}"."${leftToJunction.fromColumn}"`;
231
+ const userWhereSQL = internals.toWhereSQL();
232
+ if (userWhereSQL) {
233
+ whereSQL += ` AND ${userWhereSQL}`;
234
+ }
235
+ parts.push(`WHERE ${whereSQL}`);
236
+ const orderBySQL = internals.toOrderBySQL();
237
+ if (orderBySQL) {
238
+ parts.push(`ORDER BY ${orderBySQL}`);
239
+ }
240
+ const limitSQL = internals.toLimitSQL();
241
+ if (limitSQL) {
242
+ parts.push(limitSQL);
243
+ }
244
+ const offsetSQL = internals.toOffsetSQL();
245
+ if (offsetSQL) {
246
+ parts.push(offsetSQL);
247
+ }
248
+ parts.push(') sub');
249
+ parts.push(`) AS "${targetAlias}_lateral"`);
250
+ return parts.join(' ');
251
+ }