@relq/orm 0.1.3 → 0.1.4

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 (412) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +33 -224
  3. package/dist/cjs/addon/cursor.cjs +4 -3
  4. package/dist/cjs/addon/mysql2.cjs +21144 -0
  5. package/dist/cjs/addon/pg.cjs +4 -3
  6. package/dist/cjs/cache/query-cache.cjs +1 -4
  7. package/dist/cjs/core/cte/cte-accessor.cjs +80 -0
  8. package/dist/cjs/core/cte/cte-types.cjs +24 -0
  9. package/dist/cjs/core/cte/native-cte-builder.cjs +254 -0
  10. package/dist/cjs/core/helpers/index.cjs +14 -14
  11. package/dist/cjs/core/relq-base.cjs +4 -88
  12. package/dist/cjs/core/relq-client.cjs +52 -25
  13. package/dist/cjs/core/shared/column-mapping.cjs +1 -1
  14. package/dist/cjs/core/shared/table-accessor.cjs +1 -1
  15. package/dist/cjs/core/shared/where.cjs +15 -0
  16. package/dist/cjs/index.cjs +40 -5
  17. package/dist/cjs/mysql/clients/index.cjs +17 -0
  18. package/dist/cjs/mysql/clients/mariadb-client/capabilities.cjs +31 -0
  19. package/dist/cjs/mysql/clients/mariadb-client/index.cjs +7 -0
  20. package/dist/cjs/mysql/clients/mariadb-client/relq-mariadb.cjs +14 -0
  21. package/dist/cjs/mysql/clients/mysql-client/capabilities.cjs +31 -0
  22. package/dist/cjs/mysql/clients/mysql-client/index.cjs +7 -0
  23. package/dist/cjs/mysql/clients/mysql-client/relq-mysql.cjs +14 -0
  24. package/dist/cjs/mysql/clients/planetscale-client/capabilities.cjs +31 -0
  25. package/dist/cjs/mysql/clients/planetscale-client/index.cjs +7 -0
  26. package/dist/cjs/mysql/clients/planetscale-client/relq-planetscale.cjs +32 -0
  27. package/dist/cjs/mysql/clients/shared/index.cjs +32 -0
  28. package/dist/cjs/mysql/clients/shared/mysql-base.cjs +362 -0
  29. package/dist/cjs/mysql/clients/shared/mysql-dialect.cjs +141 -0
  30. package/dist/cjs/mysql/clients/shared/mysql-error-parser.cjs +195 -0
  31. package/dist/cjs/mysql/clients/shared/mysql-format.cjs +95 -0
  32. package/dist/cjs/mysql/clients/shared/mysql-type-coercion.cjs +14 -0
  33. package/dist/cjs/mysql/condition/condition-collector.cjs +377 -0
  34. package/dist/cjs/mysql/condition/fulltext-condition-builder.cjs +63 -0
  35. package/dist/cjs/mysql/condition/index.cjs +16 -0
  36. package/dist/cjs/mysql/condition/json-condition-builder.cjs +144 -0
  37. package/dist/cjs/mysql/condition/json-path-proxy.cjs +520 -0
  38. package/dist/cjs/mysql/count/count-builder.cjs +109 -0
  39. package/dist/cjs/mysql/count/index.cjs +5 -0
  40. package/dist/cjs/mysql/delete/delete-builder.cjs +105 -0
  41. package/dist/cjs/mysql/delete/index.cjs +5 -0
  42. package/dist/cjs/mysql/explain/explain-builder.cjs +43 -0
  43. package/dist/cjs/mysql/explain/index.cjs +5 -0
  44. package/dist/cjs/mysql/helpers/MysqlConnectedAggregateBuilder.cjs +132 -0
  45. package/dist/cjs/mysql/helpers/MysqlConnectedCountBuilder.cjs +83 -0
  46. package/dist/cjs/mysql/helpers/MysqlConnectedDeleteBuilder.cjs +91 -0
  47. package/dist/cjs/mysql/helpers/MysqlConnectedInsertBuilder.cjs +75 -0
  48. package/dist/cjs/mysql/helpers/MysqlConnectedInsertFromSelectBuilder.cjs +57 -0
  49. package/dist/cjs/mysql/helpers/MysqlConnectedQueryBuilder.cjs +141 -0
  50. package/dist/cjs/mysql/helpers/MysqlConnectedRawQueryBuilder.cjs +60 -0
  51. package/dist/cjs/mysql/helpers/MysqlConnectedSelectBuilder.cjs +398 -0
  52. package/dist/cjs/mysql/helpers/MysqlConnectedTransactionBuilder.cjs +128 -0
  53. package/dist/cjs/mysql/helpers/MysqlConnectedUpdateBuilder.cjs +92 -0
  54. package/dist/cjs/mysql/helpers/MysqlPaginateBuilder.cjs +186 -0
  55. package/dist/cjs/mysql/helpers/MysqlReturningExecutor.cjs +69 -0
  56. package/dist/cjs/mysql/helpers/index.cjs +45 -0
  57. package/dist/cjs/mysql/helpers/query-convenience.cjs +210 -0
  58. package/dist/cjs/mysql/helpers/select-joins.cjs +465 -0
  59. package/dist/cjs/mysql/helpers/select-pagination.cjs +190 -0
  60. package/dist/cjs/mysql/index.cjs +154 -0
  61. package/dist/cjs/mysql/insert/duplicate-key-builder.cjs +185 -0
  62. package/dist/cjs/mysql/insert/index.cjs +13 -0
  63. package/dist/cjs/mysql/insert/insert-builder.cjs +169 -0
  64. package/dist/cjs/mysql/insert/insert-from-select-builder.cjs +74 -0
  65. package/dist/cjs/mysql/raw/index.cjs +8 -0
  66. package/dist/cjs/mysql/raw/raw-query-builder.cjs +27 -0
  67. package/dist/cjs/mysql/raw/sql-template.cjs +65 -0
  68. package/dist/cjs/mysql/select/aggregate-builder.cjs +211 -0
  69. package/dist/cjs/mysql/select/index.cjs +32 -0
  70. package/dist/cjs/mysql/select/join-builder.cjs +206 -0
  71. package/dist/cjs/mysql/select/join-condition-builder.cjs +205 -0
  72. package/dist/cjs/mysql/select/join-internals.cjs +5 -0
  73. package/dist/cjs/mysql/select/scalar-query-builder.cjs +164 -0
  74. package/dist/cjs/mysql/select/scalar-select-builder.cjs +78 -0
  75. package/dist/cjs/mysql/select/select-builder.cjs +414 -0
  76. package/dist/cjs/mysql/select/sql-expression.cjs +56 -0
  77. package/dist/cjs/mysql/select/table-proxy.cjs +99 -0
  78. package/dist/cjs/mysql/shared/mysql-table-accessor.cjs +22 -0
  79. package/dist/cjs/mysql/transaction/index.cjs +6 -0
  80. package/dist/cjs/mysql/transaction/transaction-builder.cjs +64 -0
  81. package/dist/cjs/mysql/update/column-expression-builder.cjs +49 -0
  82. package/dist/cjs/mysql/update/index.cjs +7 -0
  83. package/dist/cjs/mysql/update/mysql-json-update-builder.cjs +200 -0
  84. package/dist/cjs/mysql/update/update-builder.cjs +167 -0
  85. package/dist/cjs/mysql/utils/addon/mysql/mysql2.cjs +23 -0
  86. package/dist/cjs/mysql/utils/fk-resolver.cjs +187 -0
  87. package/dist/cjs/mysql/utils/index.cjs +16 -0
  88. package/dist/cjs/mysql/utils/type-coercion.cjs +158 -0
  89. package/dist/cjs/mysql/window/index.cjs +5 -0
  90. package/dist/cjs/mysql/window/window-builder.cjs +80 -0
  91. package/dist/cjs/pg/clients/alloydb-client/capabilities.cjs +31 -0
  92. package/dist/cjs/pg/clients/alloydb-client/index.cjs +7 -0
  93. package/dist/cjs/pg/clients/alloydb-client/relq-alloydb.cjs +43 -0
  94. package/dist/cjs/pg/clients/aurora-client/capabilities.cjs +31 -0
  95. package/dist/cjs/pg/clients/aurora-client/index.cjs +7 -0
  96. package/dist/cjs/pg/clients/aurora-client/relq-aurora.cjs +43 -0
  97. package/dist/cjs/pg/clients/citus-client/capabilities.cjs +31 -0
  98. package/dist/cjs/pg/clients/citus-client/index.cjs +7 -0
  99. package/dist/cjs/pg/clients/citus-client/relq-citus.cjs +43 -0
  100. package/dist/cjs/pg/clients/neon-client/capabilities.cjs +31 -0
  101. package/dist/cjs/pg/clients/neon-client/index.cjs +7 -0
  102. package/dist/cjs/pg/clients/neon-client/relq-neon.cjs +43 -0
  103. package/dist/cjs/pg/clients/pg-client/relq-postgres.cjs +56 -0
  104. package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-base.cjs +64 -7
  105. package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-type-coercion.cjs +1 -1
  106. package/dist/cjs/pg/clients/supabase-client/capabilities.cjs +31 -0
  107. package/dist/cjs/pg/clients/supabase-client/index.cjs +7 -0
  108. package/dist/cjs/{core/pg-family/pg-client/relq-postgres.cjs → pg/clients/supabase-client/relq-supabase.cjs} +9 -9
  109. package/dist/cjs/pg/clients/timescale-client/capabilities.cjs +31 -0
  110. package/dist/cjs/pg/clients/timescale-client/index.cjs +7 -0
  111. package/dist/cjs/pg/clients/timescale-client/relq-timescale.cjs +43 -0
  112. package/dist/cjs/pg/clients/yugabytedb-client/capabilities.cjs +31 -0
  113. package/dist/cjs/pg/clients/yugabytedb-client/index.cjs +7 -0
  114. package/dist/cjs/pg/clients/yugabytedb-client/relq-yugabytedb.cjs +16 -0
  115. package/dist/cjs/{condition → pg/condition}/array-condition-builder.cjs +1 -1
  116. package/dist/cjs/pg/condition/array-path-proxy.cjs +379 -0
  117. package/dist/cjs/{condition → pg/condition}/condition-collector.cjs +18 -9
  118. package/dist/cjs/{condition → pg/condition}/fulltext-condition-builder.cjs +1 -1
  119. package/dist/cjs/{condition → pg/condition}/geometric-condition-builder.cjs +1 -1
  120. package/dist/cjs/pg/condition/json-path-proxy.cjs +480 -0
  121. package/dist/cjs/{condition → pg/condition}/jsonb-condition-builder.cjs +1 -1
  122. package/dist/cjs/{condition → pg/condition}/network-condition-builder.cjs +1 -1
  123. package/dist/cjs/{condition → pg/condition}/postgis-condition-builder.cjs +1 -1
  124. package/dist/cjs/{condition → pg/condition}/range-condition-builder.cjs +1 -1
  125. package/dist/cjs/{count → pg/count}/count-builder.cjs +10 -5
  126. package/dist/cjs/{delete → pg/delete}/delete-builder.cjs +10 -5
  127. package/dist/cjs/{core → pg}/helpers/ConnectedAggregateBuilder.cjs +16 -3
  128. package/dist/cjs/{core → pg}/helpers/ConnectedCountBuilder.cjs +16 -3
  129. package/dist/cjs/{core → pg}/helpers/ConnectedDeleteBuilder.cjs +27 -7
  130. package/dist/cjs/{core → pg}/helpers/ConnectedInsertBuilder.cjs +16 -8
  131. package/dist/cjs/{core → pg}/helpers/ConnectedInsertFromSelectBuilder.cjs +9 -5
  132. package/dist/cjs/{core → pg}/helpers/ConnectedQueryBuilder.cjs +14 -19
  133. package/dist/cjs/pg/helpers/ConnectedRawQueryBuilder.cjs +67 -0
  134. package/dist/cjs/{core → pg}/helpers/ConnectedSelectBuilder.cjs +121 -25
  135. package/dist/cjs/{core → pg}/helpers/ConnectedTransactionBuilder.cjs +34 -4
  136. package/dist/cjs/{core → pg}/helpers/ConnectedUpdateBuilder.cjs +27 -7
  137. package/dist/cjs/{core → pg}/helpers/PaginateBuilder.cjs +3 -3
  138. package/dist/cjs/{core → pg}/helpers/ReturningExecutor.cjs +3 -3
  139. package/dist/cjs/{core → pg}/helpers/query-convenience.cjs +11 -12
  140. package/dist/cjs/{core → pg}/helpers/select-joins.cjs +17 -14
  141. package/dist/cjs/{core → pg}/helpers/select-pagination.cjs +1 -1
  142. package/dist/cjs/{insert → pg/insert}/conflict-builder.cjs +2 -2
  143. package/dist/cjs/{insert → pg/insert}/insert-builder.cjs +8 -5
  144. package/dist/cjs/{insert → pg/insert}/insert-from-select-builder.cjs +1 -1
  145. package/dist/cjs/{pubsub → pg/pubsub}/listen-notify-builder.cjs +1 -1
  146. package/dist/cjs/{pubsub → pg/pubsub}/listener-connection.cjs +2 -2
  147. package/dist/cjs/{raw → pg/raw}/raw-query-builder.cjs +2 -2
  148. package/dist/cjs/{raw → pg/raw}/sql-template.cjs +1 -6
  149. package/dist/cjs/{select → pg/select}/aggregate-builder.cjs +10 -5
  150. package/dist/cjs/{select → pg/select}/join-builder.cjs +2 -2
  151. package/dist/cjs/{select → pg/select}/join-condition-builder.cjs +11 -1
  152. package/dist/cjs/{select → pg/select}/join-many-condition-builder.cjs +3 -4
  153. package/dist/cjs/{select → pg/select}/scalar-query-builder.cjs +31 -1
  154. package/dist/cjs/{select → pg/select}/scalar-select-builder.cjs +1 -1
  155. package/dist/cjs/{select → pg/select}/select-builder.cjs +40 -7
  156. package/dist/cjs/pg/select/sql-expression.cjs +56 -0
  157. package/dist/cjs/{transaction → pg/transaction}/transaction-builder.cjs +1 -1
  158. package/dist/cjs/{update → pg/update}/array-update-builder.cjs +2 -5
  159. package/dist/cjs/pg/update/column-expression-builder.cjs +49 -0
  160. package/dist/cjs/{update → pg/update}/jsonb-update-builder.cjs +1 -1
  161. package/dist/cjs/{update → pg/update}/update-builder.cjs +14 -7
  162. package/dist/cjs/{utils → pg/utils}/addon/pg/cursor.cjs +1 -1
  163. package/dist/cjs/{utils → pg/utils}/addon/pg/pg.cjs +2 -2
  164. package/dist/cjs/{utils → pg/utils}/fk-resolver.cjs +47 -30
  165. package/dist/cjs/{window → pg/window}/window-builder.cjs +1 -1
  166. package/dist/cjs/shared/errors/relq-errors.cjs +496 -35
  167. package/dist/cjs/shared/types/config-types.cjs +2 -2
  168. package/dist/cjs/utils/env-resolver.cjs +76 -13
  169. package/dist/cjs/utils/index.cjs +1 -1
  170. package/dist/esm/addon/cursor.js +4 -3
  171. package/dist/esm/addon/mysql2.js +21132 -0
  172. package/dist/esm/addon/pg.js +4 -3
  173. package/dist/esm/cache/query-cache.js +1 -4
  174. package/dist/esm/core/cte/cte-accessor.js +75 -0
  175. package/dist/esm/core/cte/cte-types.js +20 -0
  176. package/dist/esm/core/cte/native-cte-builder.js +250 -0
  177. package/dist/esm/core/helpers/index.js +12 -12
  178. package/dist/esm/core/relq-base.js +5 -56
  179. package/dist/esm/core/relq-client.js +44 -24
  180. package/dist/esm/core/shared/column-mapping.js +1 -1
  181. package/dist/esm/core/shared/table-accessor.js +1 -1
  182. package/dist/esm/core/shared/where.js +12 -0
  183. package/dist/esm/index.js +17 -5
  184. package/dist/esm/mysql/clients/index.js +5 -0
  185. package/dist/esm/mysql/clients/mariadb-client/capabilities.js +28 -0
  186. package/dist/esm/mysql/clients/mariadb-client/index.js +2 -0
  187. package/dist/esm/mysql/clients/mariadb-client/relq-mariadb.js +10 -0
  188. package/dist/esm/mysql/clients/mysql-client/capabilities.js +28 -0
  189. package/dist/esm/mysql/clients/mysql-client/index.js +2 -0
  190. package/dist/esm/mysql/clients/mysql-client/relq-mysql.js +10 -0
  191. package/dist/esm/mysql/clients/planetscale-client/capabilities.js +28 -0
  192. package/dist/esm/mysql/clients/planetscale-client/index.js +2 -0
  193. package/dist/esm/mysql/clients/planetscale-client/relq-planetscale.js +28 -0
  194. package/dist/esm/mysql/clients/shared/index.js +7 -0
  195. package/dist/esm/mysql/clients/shared/mysql-base.js +321 -0
  196. package/dist/esm/mysql/clients/shared/mysql-dialect.js +136 -0
  197. package/dist/esm/mysql/clients/shared/mysql-error-parser.js +188 -0
  198. package/dist/esm/mysql/clients/shared/mysql-format.js +92 -0
  199. package/dist/esm/mysql/clients/shared/mysql-type-coercion.js +6 -0
  200. package/dist/esm/mysql/condition/condition-collector.js +368 -0
  201. package/dist/esm/mysql/condition/fulltext-condition-builder.js +55 -0
  202. package/dist/esm/mysql/condition/index.js +4 -0
  203. package/dist/esm/mysql/condition/json-condition-builder.js +136 -0
  204. package/dist/esm/mysql/condition/json-path-proxy.js +513 -0
  205. package/dist/esm/mysql/count/count-builder.js +102 -0
  206. package/dist/esm/mysql/count/index.js +1 -0
  207. package/dist/esm/mysql/delete/delete-builder.js +98 -0
  208. package/dist/esm/mysql/delete/index.js +1 -0
  209. package/dist/esm/mysql/explain/explain-builder.js +39 -0
  210. package/dist/esm/mysql/explain/index.js +1 -0
  211. package/dist/esm/mysql/helpers/MysqlConnectedAggregateBuilder.js +128 -0
  212. package/dist/esm/{core/helpers/ConnectedCountBuilder.js → mysql/helpers/MysqlConnectedCountBuilder.js} +15 -5
  213. package/dist/esm/mysql/helpers/MysqlConnectedDeleteBuilder.js +87 -0
  214. package/dist/esm/mysql/helpers/MysqlConnectedInsertBuilder.js +71 -0
  215. package/dist/esm/mysql/helpers/MysqlConnectedInsertFromSelectBuilder.js +53 -0
  216. package/dist/esm/mysql/helpers/MysqlConnectedQueryBuilder.js +137 -0
  217. package/dist/esm/mysql/helpers/MysqlConnectedRawQueryBuilder.js +56 -0
  218. package/dist/esm/mysql/helpers/MysqlConnectedSelectBuilder.js +391 -0
  219. package/dist/esm/mysql/helpers/MysqlConnectedTransactionBuilder.js +123 -0
  220. package/dist/esm/mysql/helpers/MysqlConnectedUpdateBuilder.js +88 -0
  221. package/dist/esm/mysql/helpers/MysqlPaginateBuilder.js +182 -0
  222. package/dist/esm/mysql/helpers/MysqlReturningExecutor.js +65 -0
  223. package/dist/esm/mysql/helpers/index.js +15 -0
  224. package/dist/esm/mysql/helpers/query-convenience.js +199 -0
  225. package/dist/esm/mysql/helpers/select-joins.js +455 -0
  226. package/dist/esm/mysql/helpers/select-pagination.js +186 -0
  227. package/dist/esm/mysql/index.js +47 -0
  228. package/dist/esm/mysql/insert/duplicate-key-builder.js +174 -0
  229. package/dist/esm/mysql/insert/index.js +3 -0
  230. package/dist/esm/mysql/insert/insert-builder.js +162 -0
  231. package/dist/esm/mysql/insert/insert-from-select-builder.js +67 -0
  232. package/dist/esm/mysql/raw/index.js +2 -0
  233. package/dist/esm/mysql/raw/raw-query-builder.js +20 -0
  234. package/dist/esm/mysql/raw/sql-template.js +58 -0
  235. package/dist/esm/mysql/select/aggregate-builder.js +204 -0
  236. package/dist/esm/mysql/select/index.js +9 -0
  237. package/dist/esm/mysql/select/join-builder.js +198 -0
  238. package/dist/esm/mysql/select/join-condition-builder.js +197 -0
  239. package/dist/esm/mysql/select/join-internals.js +2 -0
  240. package/dist/esm/mysql/select/scalar-query-builder.js +156 -0
  241. package/dist/esm/mysql/select/scalar-select-builder.js +70 -0
  242. package/dist/esm/mysql/select/select-builder.js +407 -0
  243. package/dist/esm/mysql/select/sql-expression.js +51 -0
  244. package/dist/esm/mysql/select/table-proxy.js +91 -0
  245. package/dist/esm/mysql/shared/mysql-table-accessor.js +19 -0
  246. package/dist/esm/mysql/transaction/index.js +1 -0
  247. package/dist/esm/mysql/transaction/transaction-builder.js +56 -0
  248. package/dist/esm/mysql/update/column-expression-builder.js +42 -0
  249. package/dist/esm/mysql/update/index.js +2 -0
  250. package/dist/esm/mysql/update/mysql-json-update-builder.js +193 -0
  251. package/dist/esm/mysql/update/update-builder.js +160 -0
  252. package/dist/esm/mysql/utils/addon/mysql/mysql2.js +2 -0
  253. package/dist/esm/mysql/utils/fk-resolver.js +179 -0
  254. package/dist/esm/mysql/utils/index.js +2 -0
  255. package/dist/esm/mysql/utils/type-coercion.js +150 -0
  256. package/dist/esm/mysql/window/index.js +1 -0
  257. package/dist/esm/mysql/window/window-builder.js +73 -0
  258. package/dist/esm/pg/clients/alloydb-client/capabilities.js +28 -0
  259. package/dist/esm/pg/clients/alloydb-client/index.js +2 -0
  260. package/dist/esm/{core/pg-family/pg-client/relq-postgres.js → pg/clients/alloydb-client/relq-alloydb.js} +8 -8
  261. package/dist/esm/pg/clients/aurora-client/capabilities.js +28 -0
  262. package/dist/esm/pg/clients/aurora-client/index.js +2 -0
  263. package/dist/esm/pg/clients/aurora-client/relq-aurora.js +39 -0
  264. package/dist/esm/pg/clients/citus-client/capabilities.js +28 -0
  265. package/dist/esm/pg/clients/citus-client/index.js +2 -0
  266. package/dist/esm/pg/clients/citus-client/relq-citus.js +39 -0
  267. package/dist/esm/pg/clients/neon-client/capabilities.js +28 -0
  268. package/dist/esm/pg/clients/neon-client/index.js +2 -0
  269. package/dist/esm/pg/clients/neon-client/relq-neon.js +39 -0
  270. package/dist/esm/pg/clients/pg-client/relq-postgres.js +52 -0
  271. package/dist/esm/{core/pg-family → pg/clients}/shared/pg-base.js +64 -7
  272. package/dist/esm/{core/pg-family → pg/clients}/shared/pg-type-coercion.js +1 -1
  273. package/dist/esm/pg/clients/supabase-client/capabilities.js +28 -0
  274. package/dist/esm/pg/clients/supabase-client/index.js +2 -0
  275. package/dist/esm/pg/clients/supabase-client/relq-supabase.js +39 -0
  276. package/dist/esm/pg/clients/timescale-client/capabilities.js +28 -0
  277. package/dist/esm/pg/clients/timescale-client/index.js +2 -0
  278. package/dist/esm/pg/clients/timescale-client/relq-timescale.js +39 -0
  279. package/dist/esm/pg/clients/yugabytedb-client/capabilities.js +28 -0
  280. package/dist/esm/pg/clients/yugabytedb-client/index.js +2 -0
  281. package/dist/esm/pg/clients/yugabytedb-client/relq-yugabytedb.js +12 -0
  282. package/dist/esm/{condition → pg/condition}/array-condition-builder.js +1 -1
  283. package/dist/esm/pg/condition/array-path-proxy.js +372 -0
  284. package/dist/esm/{condition → pg/condition}/condition-collector.js +20 -11
  285. package/dist/esm/{condition → pg/condition}/fulltext-condition-builder.js +1 -1
  286. package/dist/esm/{condition → pg/condition}/geometric-condition-builder.js +1 -1
  287. package/dist/esm/pg/condition/json-path-proxy.js +473 -0
  288. package/dist/esm/{condition → pg/condition}/jsonb-condition-builder.js +1 -1
  289. package/dist/esm/{condition → pg/condition}/network-condition-builder.js +1 -1
  290. package/dist/esm/{condition → pg/condition}/postgis-condition-builder.js +1 -1
  291. package/dist/esm/{condition → pg/condition}/range-condition-builder.js +1 -1
  292. package/dist/esm/{count → pg/count}/count-builder.js +10 -5
  293. package/dist/esm/{delete → pg/delete}/delete-builder.js +10 -5
  294. package/dist/esm/{core → pg}/helpers/ConnectedAggregateBuilder.js +16 -3
  295. package/dist/esm/pg/helpers/ConnectedCountBuilder.js +82 -0
  296. package/dist/esm/{core → pg}/helpers/ConnectedDeleteBuilder.js +27 -7
  297. package/dist/esm/{core → pg}/helpers/ConnectedInsertBuilder.js +16 -8
  298. package/dist/esm/{core → pg}/helpers/ConnectedInsertFromSelectBuilder.js +9 -5
  299. package/dist/esm/{core → pg}/helpers/ConnectedQueryBuilder.js +15 -20
  300. package/dist/esm/pg/helpers/ConnectedRawQueryBuilder.js +63 -0
  301. package/dist/esm/{core → pg}/helpers/ConnectedSelectBuilder.js +118 -25
  302. package/dist/esm/{core → pg}/helpers/ConnectedTransactionBuilder.js +34 -4
  303. package/dist/esm/{core → pg}/helpers/ConnectedUpdateBuilder.js +27 -7
  304. package/dist/esm/{core → pg}/helpers/PaginateBuilder.js +3 -3
  305. package/dist/esm/{core → pg}/helpers/ReturningExecutor.js +3 -3
  306. package/dist/esm/{core → pg}/helpers/query-convenience.js +11 -12
  307. package/dist/esm/{core → pg}/helpers/select-joins.js +18 -15
  308. package/dist/esm/{core → pg}/helpers/select-pagination.js +1 -1
  309. package/dist/esm/{insert → pg/insert}/conflict-builder.js +2 -2
  310. package/dist/esm/{insert → pg/insert}/insert-builder.js +8 -5
  311. package/dist/esm/{insert → pg/insert}/insert-from-select-builder.js +1 -1
  312. package/dist/esm/{pubsub → pg/pubsub}/listen-notify-builder.js +1 -1
  313. package/dist/esm/{pubsub → pg/pubsub}/listener-connection.js +2 -2
  314. package/dist/esm/{raw → pg/raw}/raw-query-builder.js +2 -2
  315. package/dist/esm/{raw → pg/raw}/sql-template.js +1 -6
  316. package/dist/esm/{select → pg/select}/aggregate-builder.js +10 -5
  317. package/dist/esm/{select → pg/select}/join-builder.js +2 -2
  318. package/dist/esm/{select → pg/select}/join-condition-builder.js +11 -1
  319. package/dist/esm/{select → pg/select}/join-many-condition-builder.js +3 -4
  320. package/dist/esm/{select → pg/select}/scalar-query-builder.js +31 -1
  321. package/dist/esm/{select → pg/select}/scalar-select-builder.js +1 -1
  322. package/dist/esm/{select → pg/select}/select-builder.js +40 -7
  323. package/dist/esm/pg/select/sql-expression.js +51 -0
  324. package/dist/esm/{transaction → pg/transaction}/transaction-builder.js +1 -1
  325. package/dist/esm/{update → pg/update}/array-update-builder.js +2 -5
  326. package/dist/esm/pg/update/column-expression-builder.js +42 -0
  327. package/dist/esm/{update → pg/update}/jsonb-update-builder.js +1 -1
  328. package/dist/esm/{update → pg/update}/update-builder.js +14 -7
  329. package/dist/esm/pg/utils/addon/pg/cursor.js +1 -0
  330. package/dist/esm/pg/utils/addon/pg/pg.js +2 -0
  331. package/dist/esm/{utils → pg/utils}/fk-resolver.js +47 -30
  332. package/dist/esm/{window → pg/window}/window-builder.js +1 -1
  333. package/dist/esm/shared/errors/relq-errors.js +486 -34
  334. package/dist/esm/shared/types/config-types.js +2 -2
  335. package/dist/esm/utils/env-resolver.js +74 -13
  336. package/dist/esm/utils/index.js +1 -1
  337. package/dist/index.d.ts +9629 -3974
  338. package/package.json +5 -3
  339. package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +0 -53
  340. package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +0 -46
  341. package/dist/cjs/select/sql-expression.cjs +0 -38
  342. package/dist/esm/core/helpers/ConnectedCTEBuilder.js +0 -49
  343. package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +0 -42
  344. package/dist/esm/select/sql-expression.js +0 -33
  345. package/dist/esm/utils/addon/pg/cursor.js +0 -1
  346. package/dist/esm/utils/addon/pg/pg.js +0 -2
  347. /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/capabilities.cjs +0 -0
  348. /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/index.cjs +0 -0
  349. /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/relq-cockroach.cjs +0 -0
  350. /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/capabilities.cjs +0 -0
  351. /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/index.cjs +0 -0
  352. /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/relq-dsql.cjs +0 -0
  353. /package/dist/cjs/{core/pg-family → pg/clients}/index.cjs +0 -0
  354. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/capabilities.cjs +0 -0
  355. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/index.cjs +0 -0
  356. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/relq-nile.cjs +0 -0
  357. /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/tenant-context.cjs +0 -0
  358. /package/dist/cjs/{core/pg-family → pg/clients}/pg-client/capabilities.cjs +0 -0
  359. /package/dist/cjs/{core/pg-family → pg/clients}/pg-client/index.cjs +0 -0
  360. /package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-dialect.cjs +0 -0
  361. /package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-error-parser.cjs +0 -0
  362. /package/dist/cjs/{condition → pg/condition}/array-numeric-condition-builder.cjs +0 -0
  363. /package/dist/cjs/{condition → pg/condition}/array-specialized-condition-builder.cjs +0 -0
  364. /package/dist/cjs/{condition → pg/condition}/array-string-condition-builder.cjs +0 -0
  365. /package/dist/cjs/{condition → pg/condition}/index.cjs +0 -0
  366. /package/dist/cjs/{count → pg/count}/index.cjs +0 -0
  367. /package/dist/cjs/{delete → pg/delete}/index.cjs +0 -0
  368. /package/dist/cjs/{explain → pg/explain}/explain-builder.cjs +0 -0
  369. /package/dist/cjs/{explain → pg/explain}/index.cjs +0 -0
  370. /package/dist/cjs/{insert → pg/insert}/index.cjs +0 -0
  371. /package/dist/cjs/{pubsub → pg/pubsub}/index.cjs +0 -0
  372. /package/dist/cjs/{raw → pg/raw}/index.cjs +0 -0
  373. /package/dist/cjs/{select → pg/select}/index.cjs +0 -0
  374. /package/dist/cjs/{select → pg/select}/join-internals.cjs +0 -0
  375. /package/dist/cjs/{select → pg/select}/table-proxy.cjs +0 -0
  376. /package/dist/cjs/{transaction → pg/transaction}/index.cjs +0 -0
  377. /package/dist/cjs/{update → pg/update}/index.cjs +0 -0
  378. /package/dist/cjs/{utils → pg/utils}/type-coercion.cjs +0 -0
  379. /package/dist/cjs/{window → pg/window}/index.cjs +0 -0
  380. /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/capabilities.js +0 -0
  381. /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/index.js +0 -0
  382. /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/relq-cockroach.js +0 -0
  383. /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/capabilities.js +0 -0
  384. /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/index.js +0 -0
  385. /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/relq-dsql.js +0 -0
  386. /package/dist/esm/{core/pg-family → pg/clients}/index.js +0 -0
  387. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/capabilities.js +0 -0
  388. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/index.js +0 -0
  389. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/relq-nile.js +0 -0
  390. /package/dist/esm/{core/pg-family → pg/clients}/nile-client/tenant-context.js +0 -0
  391. /package/dist/esm/{core/pg-family → pg/clients}/pg-client/capabilities.js +0 -0
  392. /package/dist/esm/{core/pg-family → pg/clients}/pg-client/index.js +0 -0
  393. /package/dist/esm/{core/pg-family → pg/clients}/shared/pg-dialect.js +0 -0
  394. /package/dist/esm/{core/pg-family → pg/clients}/shared/pg-error-parser.js +0 -0
  395. /package/dist/esm/{condition → pg/condition}/array-numeric-condition-builder.js +0 -0
  396. /package/dist/esm/{condition → pg/condition}/array-specialized-condition-builder.js +0 -0
  397. /package/dist/esm/{condition → pg/condition}/array-string-condition-builder.js +0 -0
  398. /package/dist/esm/{condition → pg/condition}/index.js +0 -0
  399. /package/dist/esm/{count → pg/count}/index.js +0 -0
  400. /package/dist/esm/{delete → pg/delete}/index.js +0 -0
  401. /package/dist/esm/{explain → pg/explain}/explain-builder.js +0 -0
  402. /package/dist/esm/{explain → pg/explain}/index.js +0 -0
  403. /package/dist/esm/{insert → pg/insert}/index.js +0 -0
  404. /package/dist/esm/{pubsub → pg/pubsub}/index.js +0 -0
  405. /package/dist/esm/{raw → pg/raw}/index.js +0 -0
  406. /package/dist/esm/{select → pg/select}/index.js +0 -0
  407. /package/dist/esm/{select → pg/select}/join-internals.js +0 -0
  408. /package/dist/esm/{select → pg/select}/table-proxy.js +0 -0
  409. /package/dist/esm/{transaction → pg/transaction}/index.js +0 -0
  410. /package/dist/esm/{update → pg/update}/index.js +0 -0
  411. /package/dist/esm/{utils → pg/utils}/type-coercion.js +0 -0
  412. /package/dist/esm/{window → pg/window}/index.js +0 -0
@@ -1,7 +1,9 @@
1
- import { INTERNAL } from "./methods.js";
1
+ import { ConditionCollector } from "../condition/condition-collector.js";
2
+ import { INTERNAL } from "../../core/helpers/methods.js";
2
3
  import { ReturningExecutor } from "./ReturningExecutor.js";
3
- import { requireCapability } from "./capability-guard.js";
4
- import { createTableAccessor } from "../shared/table-accessor.js";
4
+ import { requireCapability } from "../../core/helpers/capability-guard.js";
5
+ import { createTableAccessor } from "../../core/shared/table-accessor.js";
6
+ import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
5
7
  export class ConnectedDeleteBuilder {
6
8
  builder;
7
9
  relq;
@@ -32,7 +34,21 @@ export class ConnectedDeleteBuilder {
32
34
  return column;
33
35
  });
34
36
  }
35
- where(callback) {
37
+ where(callbackOrCondition) {
38
+ if (callbackOrCondition instanceof ConditionCollector) {
39
+ const conditionTable = callbackOrCondition._tableName;
40
+ if (conditionTable) {
41
+ const matches = conditionTable === this.schemaKey || conditionTable === this.tableName;
42
+ if (!matches) {
43
+ const queryTable = this.schemaKey || this.tableName;
44
+ throw new RelqBuilderError(`Condition was created for table '${conditionTable}' but is being used on '${queryTable}'. ` +
45
+ `Create the condition with db.where('${queryTable}') instead.`);
46
+ }
47
+ }
48
+ this.builder.where(callbackOrCondition);
49
+ return this;
50
+ }
51
+ const callback = callbackOrCondition;
36
52
  this.builder.where((q) => {
37
53
  q._tables = createTableAccessor(this.relq, this.relq.schema);
38
54
  return callback(q);
@@ -50,9 +66,13 @@ export class ConnectedDeleteBuilder {
50
66
  }
51
67
  return result.metadata.rowCount ?? 0;
52
68
  }
53
- returning(columns) {
54
- if (columns === null) {
55
- return this;
69
+ returning(...args) {
70
+ let columns;
71
+ if (args.length === 1) {
72
+ columns = args[0];
73
+ }
74
+ else {
75
+ columns = args;
56
76
  }
57
77
  requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the DELETE to retrieve deleted data');
58
78
  this.builder.returning(columns);
@@ -1,7 +1,7 @@
1
- import { ConditionCollector, buildConditionsSQL } from "../../condition/condition-collector.js";
2
- import { debugLog, INTERNAL } from "./methods.js";
1
+ import { ConditionCollector, buildConditionsSQL } from "../condition/condition-collector.js";
2
+ import { debugLog, INTERNAL } from "../../core/helpers/methods.js";
3
3
  import { ReturningExecutor } from "./ReturningExecutor.js";
4
- import { requireCapability } from "./capability-guard.js";
4
+ import { requireCapability } from "../../core/helpers/capability-guard.js";
5
5
  export class ConnectedInsertBuilder {
6
6
  builder;
7
7
  relq;
@@ -87,8 +87,12 @@ export class ConnectedInsertBuilder {
87
87
  async run(withMetadata) {
88
88
  debugLog(this.relq[INTERNAL]?.config, `ConnectedInsertBuilder.run called for table: ${this.builder.tableName}`);
89
89
  const internalRelq = this.relq[INTERNAL];
90
- for (const row of this.builder.insertData) {
91
- internalRelq.validateData(this.builder.tableName, row, 'insert');
90
+ const rows = this.builder.insertData;
91
+ if (rows.length > 0) {
92
+ internalRelq.validateData(this.builder.tableName, rows[0], 'insert');
93
+ if (rows.length > 1) {
94
+ internalRelq.validateData(this.builder.tableName, rows[rows.length - 1], 'insert');
95
+ }
92
96
  }
93
97
  const sql = this.builder.toString();
94
98
  const result = await internalRelq.executeRun(sql);
@@ -97,9 +101,13 @@ export class ConnectedInsertBuilder {
97
101
  }
98
102
  return result.metadata.rowCount ?? 0;
99
103
  }
100
- returning(columns) {
101
- if (columns === null) {
102
- return this;
104
+ returning(...args) {
105
+ let columns;
106
+ if (args.length === 1) {
107
+ columns = args[0];
108
+ }
109
+ else {
110
+ columns = args;
103
111
  }
104
112
  requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the INSERT to retrieve inserted data');
105
113
  this.builder.returning(columns);
@@ -1,6 +1,6 @@
1
- import { debugLog, INTERNAL } from "./methods.js";
1
+ import { debugLog, INTERNAL } from "../../core/helpers/methods.js";
2
2
  import { ReturningExecutor } from "./ReturningExecutor.js";
3
- import { requireCapability } from "./capability-guard.js";
3
+ import { requireCapability } from "../../core/helpers/capability-guard.js";
4
4
  export class ConnectedInsertFromSelectBuilder {
5
5
  builder;
6
6
  relq;
@@ -51,9 +51,13 @@ export class ConnectedInsertFromSelectBuilder {
51
51
  }
52
52
  return result.metadata.rowCount ?? 0;
53
53
  }
54
- returning(columns) {
55
- if (columns === null) {
56
- return this;
54
+ returning(...args) {
55
+ let columns;
56
+ if (args.length === 1) {
57
+ columns = args[0];
58
+ }
59
+ else {
60
+ columns = args;
57
61
  }
58
62
  requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the INSERT to retrieve inserted data');
59
63
  this.builder.returning(columns);
@@ -1,10 +1,10 @@
1
- import { CountBuilder } from "../../count/count-builder.js";
2
- import { DeleteBuilder } from "../../delete/delete-builder.js";
3
- import { InsertBuilder } from "../../insert/insert-builder.js";
4
- import { InsertFromSelectBuilder } from "../../insert/insert-from-select-builder.js";
5
- import { AggregateQueryBuilder } from "../../select/aggregate-builder.js";
6
- import { SelectBuilder } from "../../select/select-builder.js";
7
- import { UpdateBuilder } from "../../update/update-builder.js";
1
+ import { CountBuilder } from "../count/count-builder.js";
2
+ import { DeleteBuilder } from "../delete/delete-builder.js";
3
+ import { InsertBuilder } from "../insert/insert-builder.js";
4
+ import { InsertFromSelectBuilder } from "../insert/insert-from-select-builder.js";
5
+ import { AggregateQueryBuilder } from "../select/aggregate-builder.js";
6
+ import { SelectBuilder } from "../select/select-builder.js";
7
+ import { UpdateBuilder } from "../update/update-builder.js";
8
8
  import { ConnectedAggregateBuilder } from "./ConnectedAggregateBuilder.js";
9
9
  import { ConnectedCountBuilder } from "./ConnectedCountBuilder.js";
10
10
  import { ConnectedDeleteBuilder } from "./ConnectedDeleteBuilder.js";
@@ -12,10 +12,11 @@ import { ConnectedInsertBuilder } from "./ConnectedInsertBuilder.js";
12
12
  import { ConnectedInsertFromSelectBuilder } from "./ConnectedInsertFromSelectBuilder.js";
13
13
  import { ConnectedSelectBuilder } from "./ConnectedSelectBuilder.js";
14
14
  import { ConnectedUpdateBuilder } from "./ConnectedUpdateBuilder.js";
15
- import { INTERNAL } from "./methods.js";
15
+ import { INTERNAL } from "../../core/helpers/methods.js";
16
16
  import { PaginateBuilder } from "./PaginateBuilder.js";
17
- import { createTableAccessor } from "../shared/table-accessor.js";
18
- import { executeFindById, executeFindOne, executeFindMany, executeExists, executeUpsert, executeCreateWith, executeSoftDelete, executeRestore, getPrimaryKeyColumn } from "./query-convenience.js";
17
+ import { createTableAccessor } from "../../core/shared/table-accessor.js";
18
+ import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
19
+ import { executeFindById, executeFindOne, executeFindMany, executeExists, executeUpsert, executeCreateWith, getPrimaryKeyColumn } from "./query-convenience.js";
19
20
  export class ConnectedQueryBuilder {
20
21
  tableName;
21
22
  relq;
@@ -42,12 +43,12 @@ export class ConnectedQueryBuilder {
42
43
  if (columns !== undefined) {
43
44
  if (Array.isArray(columns)) {
44
45
  if (columns.length === 0) {
45
- throw new Error('select() requires at least one column. Use .select() without arguments for SELECT *');
46
+ throw new RelqBuilderError('select() requires at least one column', { builder: 'select', hint: 'Use .select() without arguments for SELECT *' });
46
47
  }
47
48
  }
48
49
  else if (typeof columns === 'string') {
49
50
  if (columns === '' || columns === '*') {
50
- throw new Error(`Invalid column name: "${columns}". Use .select() without arguments for SELECT *, or specify column names`);
51
+ throw new RelqBuilderError(`Invalid column name: "${columns}"`, { builder: 'select', hint: 'Use .select() without arguments for SELECT *, or pass valid column names' });
51
52
  }
52
53
  }
53
54
  }
@@ -81,8 +82,8 @@ export class ConnectedQueryBuilder {
81
82
  return new ConnectedInsertBuilder(builder, this.relq, this.tableName, this.schemaKey);
82
83
  }
83
84
  const builder = new InsertBuilder(this.tableName, rows[0]);
84
- for (let i = 1; i < rows.length; i++) {
85
- builder.addRow(rows[i]);
85
+ if (rows.length > 1) {
86
+ builder.addRows(rows.slice(1));
86
87
  }
87
88
  return new ConnectedInsertBuilder(builder, this.relq, this.tableName, this.schemaKey);
88
89
  }
@@ -133,10 +134,4 @@ export class ConnectedQueryBuilder {
133
134
  async createWith(options) {
134
135
  return executeCreateWith(this.ctx, options.data, options.with);
135
136
  }
136
- async softDelete(filter) {
137
- return executeSoftDelete(this.ctx, filter);
138
- }
139
- async restore(filter) {
140
- return executeRestore(this.ctx, filter);
141
- }
142
137
  }
@@ -0,0 +1,63 @@
1
+ import { RawQueryBuilder } from "../raw/index.js";
2
+ import { INTERNAL } from "../../core/helpers/methods.js";
3
+ export class ConnectedRawQueryBuilder {
4
+ params;
5
+ relq;
6
+ builder;
7
+ constructor(query, params, relq) {
8
+ this.params = params;
9
+ this.relq = relq;
10
+ const convertedQuery = this.convertPlaceholders(query);
11
+ this.builder = new RawQueryBuilder(convertedQuery, this.params);
12
+ }
13
+ convertPlaceholders(query) {
14
+ let index = 0;
15
+ return query.replace(/\?/g, () => `$${++index}`);
16
+ }
17
+ async all() {
18
+ const sql = this.builder.toString();
19
+ const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
20
+ return {
21
+ data: result.rows,
22
+ metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
23
+ };
24
+ }
25
+ async get() {
26
+ const sql = this.builder.toString();
27
+ const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
28
+ const row = result.rows[0] || null;
29
+ return {
30
+ data: row,
31
+ metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
32
+ };
33
+ }
34
+ async getMany(count) {
35
+ const sql = this.builder.toString();
36
+ const limitedSql = sql.toUpperCase().includes('LIMIT')
37
+ ? sql
38
+ : `${sql} LIMIT ${count}`;
39
+ const { result, duration } = await this.relq[INTERNAL].executeRawQuery(limitedSql);
40
+ return {
41
+ data: result.rows,
42
+ metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
43
+ };
44
+ }
45
+ async run() {
46
+ const sql = this.builder.toString();
47
+ const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
48
+ return {
49
+ success: true,
50
+ metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
51
+ };
52
+ }
53
+ async count() {
54
+ const sql = this.builder.toString();
55
+ const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
56
+ const row = result.rows[0];
57
+ const count = row ? Number(Object.values(row)[0]) || 0 : 0;
58
+ return {
59
+ count,
60
+ metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
61
+ };
62
+ }
63
+ }
@@ -1,25 +1,29 @@
1
- import { INTERNAL } from "./methods.js";
1
+ import { ConditionCollector } from "../condition/condition-collector.js";
2
+ import { INTERNAL } from "../../core/helpers/methods.js";
2
3
  import { executeTypeSafeJoin, executeTypeSafeJoinMany, executeTypeSafeJoinManyThrough } from "./select-joins.js";
3
4
  import { executeCursorEach, executePagination } from "./select-pagination.js";
4
- import { requireCapability } from "./capability-guard.js";
5
- import { createTableAccessor } from "../shared/table-accessor.js";
6
- import { AggregateFunctions } from "../../select/sql-expression.js";
7
- import { createTableProxy } from "../../select/table-proxy.js";
8
- import { resolveForeignKey } from "../../utils/fk-resolver.js";
5
+ import { requireCapability } from "../../core/helpers/capability-guard.js";
6
+ import { createTableAccessor } from "../../core/shared/table-accessor.js";
7
+ import { AggregateFunctions } from "../select/sql-expression.js";
8
+ import { createTableProxy } from "../select/table-proxy.js";
9
+ import { resolveForeignKey } from "../utils/fk-resolver.js";
10
+ import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
11
+ import format from "../../shared/pg-format.js";
9
12
  export class ConnectedSelectBuilder {
10
13
  builder;
11
14
  relq;
12
15
  tableName;
13
- columns;
14
16
  schemaKey;
15
- constructor(builder, relq, tableName, columns, schemaKey) {
17
+ constructor(builder, relq, tableName, _columns, schemaKey) {
16
18
  this.builder = builder;
17
19
  this.relq = relq;
18
20
  this.tableName = tableName;
19
- this.columns = columns;
20
21
  this.schemaKey = schemaKey;
21
22
  this.setupColumnResolver();
22
23
  }
24
+ get _sourceTableKey() {
25
+ return this.schemaKey || this.tableName;
26
+ }
23
27
  get joinCtx() {
24
28
  return { relq: this.relq, builder: this.builder, tableName: this.tableName, schemaKey: this.schemaKey };
25
29
  }
@@ -54,6 +58,24 @@ export class ConnectedSelectBuilder {
54
58
  const transformed = { ...row };
55
59
  for (const join of joins) {
56
60
  const alias = join.alias;
61
+ if (join.flat && join.selectColumns) {
62
+ const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
63
+ const prefix = join.flat.prefix || alias;
64
+ const joinedTableDef = internal.getTableDef(join.schemaKey || alias) || internal.getTableDef(join.table);
65
+ const tableColumns = joinedTableDef ? (joinedTableDef.$columns || joinedTableDef) : null;
66
+ for (const col of join.selectColumns) {
67
+ const flatKey = `${prefix}${capitalize(col.property)}`;
68
+ if (transformed[flatKey] != null && tableColumns) {
69
+ const colDef = tableColumns[col.property];
70
+ const sqlType = colDef?.$sqlType || (typeof colDef?.$type === 'string' ? colDef.$type : undefined);
71
+ if (sqlType) {
72
+ transformed[flatKey] = this.coerceValue(transformed[flatKey], sqlType.toLowerCase());
73
+ }
74
+ }
75
+ }
76
+ delete transformed[alias];
77
+ continue;
78
+ }
57
79
  const nestedData = transformed[alias];
58
80
  if (nestedData === null || nestedData === undefined) {
59
81
  continue;
@@ -113,7 +135,21 @@ export class ConnectedSelectBuilder {
113
135
  return value;
114
136
  }
115
137
  }
116
- where(callback) {
138
+ where(callbackOrCondition) {
139
+ if (callbackOrCondition instanceof ConditionCollector) {
140
+ const conditionTable = callbackOrCondition._tableName;
141
+ if (conditionTable) {
142
+ const matches = conditionTable === this.schemaKey || conditionTable === this.tableName;
143
+ if (!matches) {
144
+ const queryTable = this.schemaKey || this.tableName;
145
+ throw new RelqBuilderError(`Condition was created for table '${conditionTable}' but is being used on '${queryTable}'. ` +
146
+ `Create the condition with db.where('${queryTable}') instead.`);
147
+ }
148
+ }
149
+ this.builder.where(callbackOrCondition);
150
+ return this;
151
+ }
152
+ const callback = callbackOrCondition;
117
153
  this.builder.where((q) => {
118
154
  q._tables = createTableAccessor(this.relq, this.relq.schema);
119
155
  return callback(q);
@@ -157,21 +193,73 @@ export class ConnectedSelectBuilder {
157
193
  const agg = new AggregateFunctions();
158
194
  const internal = this.relq[INTERNAL];
159
195
  const schema = internal.getSchema() || {};
196
+ const relations = internal.getRelations();
160
197
  const sourceSchemaKey = this.schemaKey || this.tableName;
161
198
  const sourceAlias = this.builder.getTableIdentifier();
199
+ const accessedTables = new Set();
162
200
  const tableProxies = new Proxy({}, {
163
201
  get(_, tableKey) {
164
202
  if (typeof tableKey === 'symbol')
165
203
  return undefined;
166
- const tableDef = schema[tableKey];
167
- const tableName = tableDef?.$name || tableKey;
168
- const alias = tableKey === sourceSchemaKey ? sourceAlias : tableKey;
169
- return createTableProxy(tableName, alias, tableDef);
204
+ const key = tableKey;
205
+ const tableDef = schema[key];
206
+ const tableName = tableDef?.$name || key;
207
+ if (key === sourceSchemaKey) {
208
+ return createTableProxy(tableName, sourceAlias, tableDef);
209
+ }
210
+ accessedTables.add(key);
211
+ return createTableProxy(tableName, key, tableDef);
170
212
  }
171
213
  });
172
214
  const expressions = callback(agg, tableProxies);
215
+ const sourceExprs = [];
216
+ const externalExprs = new Map();
173
217
  for (const [alias, expr] of Object.entries(expressions)) {
174
- this.builder.addIncludeExpression(alias, expr.sql);
218
+ let targetTable = null;
219
+ for (const tableKey of accessedTables) {
220
+ if (expr.sql.includes(`"${tableKey}".`)) {
221
+ targetTable = tableKey;
222
+ break;
223
+ }
224
+ }
225
+ if (targetTable) {
226
+ if (!externalExprs.has(targetTable)) {
227
+ externalExprs.set(targetTable, []);
228
+ }
229
+ externalExprs.get(targetTable).push({ alias, sql: expr.sql });
230
+ }
231
+ else {
232
+ sourceExprs.push({ alias, sql: expr.sql });
233
+ }
234
+ }
235
+ for (const e of sourceExprs) {
236
+ this.builder.addIncludeExpression(e.alias, e.sql);
237
+ }
238
+ for (const [tableKey, exprs] of externalExprs) {
239
+ const tableDef = schema[tableKey];
240
+ const sqlTableName = tableDef?.$name || tableKey;
241
+ const existingJoins = this.builder.getStructuredJoins();
242
+ const alreadyJoined = existingJoins.some(j => j.table === sqlTableName || j.schemaKey === tableKey || j.alias === tableKey);
243
+ if (alreadyJoined) {
244
+ for (const e of exprs) {
245
+ this.builder.addIncludeExpression(e.alias, e.sql);
246
+ }
247
+ continue;
248
+ }
249
+ const fk = resolveForeignKey(relations, schema, sourceSchemaKey, tableKey);
250
+ if (!fk) {
251
+ throw new RelqBuilderError(`include() references table "${tableKey}" but no foreign key relationship exists between "${sourceSchemaKey}" and "${tableKey}". Define the relationship in your relations config.`, { builder: 'include', hint: `Add a relation from "${sourceSchemaKey}" to "${tableKey}" in pgRelations().` });
252
+ }
253
+ const lateralAlias = `${tableKey}_agg`;
254
+ const innerSelects = exprs.map(e => {
255
+ const unqualifiedSql = e.sql.replace(new RegExp(`"${tableKey}"\\.`, 'g'), '');
256
+ return `${unqualifiedSql} AS ${format.ident(e.alias)}`;
257
+ }).join(', ');
258
+ const lateralSql = `LEFT JOIN LATERAL (SELECT ${innerSelects} FROM ${format.ident(sqlTableName)} WHERE ${format.ident(fk.toColumn)} = ${format.ident(sourceAlias)}.${format.ident(fk.fromColumn)}) AS ${format.ident(lateralAlias)} ON true`;
259
+ this.builder.addRawJoin(lateralSql);
260
+ for (const e of exprs) {
261
+ this.builder.addIncludeExpression(e.alias, `(ARRAY_AGG(${format.ident(lateralAlias)}.${format.ident(e.alias)}))[1]`);
262
+ }
175
263
  }
176
264
  return this;
177
265
  }
@@ -191,6 +279,15 @@ export class ConnectedSelectBuilder {
191
279
  executeTypeSafeJoin(this.joinCtx, 'INNER JOIN', tableOrAlias, callback);
192
280
  return this;
193
281
  }
282
+ crossJoin(tableOrAlias) {
283
+ const [tableKey, alias] = Array.isArray(tableOrAlias) ? tableOrAlias : [tableOrAlias, tableOrAlias];
284
+ const internal = this.relq[INTERNAL];
285
+ const tableDef = internal.getTableDef(tableKey);
286
+ const tableSqlName = tableDef?.$name || tableKey;
287
+ this.builder.crossJoin(tableSqlName);
288
+ this.builder.addStructuredJoin({ table: tableSqlName, alias, type: 'CROSS JOIN', schemaKey: tableKey });
289
+ return this;
290
+ }
194
291
  joinSubquery(alias, subquery, onClause) {
195
292
  const subquerySQL = typeof subquery === 'string' ? subquery : subquery.toString();
196
293
  this.builder.addRawJoin(`JOIN (${subquerySQL}) AS "${alias}" ON ${onClause}`);
@@ -235,14 +332,12 @@ export class ConnectedSelectBuilder {
235
332
  const schema = internal.getSchema();
236
333
  const relations = internal.getRelations();
237
334
  if (!schema || !relations) {
238
- throw new Error(`Cannot use .withMany('${table}') without schema and relations config. ` +
239
- `Use .leftJoinMany() with an explicit callback instead.`);
335
+ throw new RelqBuilderError(`Cannot use .withMany('${table}') without schema and relations config. Pass relations when creating Relq: new Relq(schema, dialect, { relations }).`, { builder: 'withMany', hint: `Use .leftJoinMany() with an explicit callback instead.` });
240
336
  }
241
337
  const sourceKey = this.schemaKey || this.tableName;
242
338
  const fk = resolveForeignKey(relations, schema, sourceKey, table);
243
339
  if (!fk) {
244
- throw new Error(`No FK relationship found between "${sourceKey}" and "${table}". ` +
245
- `Use .leftJoinMany() with explicit join conditions instead.`);
340
+ throw new RelqBuilderError(`No foreign key relationship found between "${sourceKey}" and "${table}". Define the relationship in your relations config.`, { builder: 'withMany', hint: `Use .leftJoinMany() with explicit join conditions instead.` });
246
341
  }
247
342
  executeTypeSafeJoinMany(this.joinCtx, 'LEFT JOIN', table, (on, right, left) => {
248
343
  const rightCol = right[fk.toColumn];
@@ -285,6 +380,10 @@ export class ConnectedSelectBuilder {
285
380
  this.builder.forUpdateSkipLocked();
286
381
  return this;
287
382
  }
383
+ forUpdateNoWait() {
384
+ this.builder.forUpdateNoWait();
385
+ return this;
386
+ }
288
387
  forShare() {
289
388
  this.builder.forShare();
290
389
  return this;
@@ -311,12 +410,6 @@ export class ConnectedSelectBuilder {
311
410
  }
312
411
  return transformedData;
313
412
  }
314
- async value(column) {
315
- this.builder.limit(1);
316
- const sql = this.builder.toString();
317
- const result = await this.relq[INTERNAL].executeSelectOne(sql, this.tableName);
318
- return result.data?.[column] ?? null;
319
- }
320
413
  async each(callback, options = {}) {
321
414
  requireCapability(this.relq, 'cursors', 'Cursor-based iteration (each)', 'Use pagination() instead of each() for row-by-row processing');
322
415
  return executeCursorEach(this.paginationCtx, callback, options);
@@ -1,6 +1,6 @@
1
1
  import { ConnectedRawQueryBuilder } from "./ConnectedRawQueryBuilder.js";
2
- import { createTableAccessor } from "../shared/table-accessor.js";
3
- import { INTERNAL } from "./methods.js";
2
+ import { createTableAccessor } from "../../core/shared/table-accessor.js";
3
+ import { INTERNAL } from "../../core/helpers/methods.js";
4
4
  export class TransactionClient {
5
5
  client;
6
6
  relq;
@@ -19,6 +19,15 @@ export class TransactionClient {
19
19
  raw(query, ...params) {
20
20
  return new ConnectedRawQueryBuilder(query, params, this);
21
21
  }
22
+ async savepoint(name) {
23
+ await this.client.query(`SAVEPOINT "${name}"`);
24
+ }
25
+ async rollbackTo(name) {
26
+ await this.client.query(`ROLLBACK TO SAVEPOINT "${name}"`);
27
+ }
28
+ async releaseSavepoint(name) {
29
+ await this.client.query(`RELEASE SAVEPOINT "${name}"`);
30
+ }
22
31
  get [INTERNAL]() {
23
32
  const parentInternal = this.relq[INTERNAL];
24
33
  const queryViaClient = async (sql) => {
@@ -66,6 +75,7 @@ export class TransactionClient {
66
75
  return { success: true, metadata: buildMetadata(result, duration) };
67
76
  },
68
77
  transformToDbColumns: parentInternal.transformToDbColumns,
78
+ executeRawQuery: queryViaClient,
69
79
  transformFromDbColumns: parentInternal.transformFromDbColumns,
70
80
  transformResultsFromDb: parentInternal.transformResultsFromDb,
71
81
  hasColumnMapping: parentInternal.hasColumnMapping,
@@ -77,11 +87,31 @@ export class TransactionClient {
77
87
  };
78
88
  }
79
89
  }
80
- export async function executeTransaction(relq, callback) {
90
+ export async function executeTransaction(relq, callback, options) {
81
91
  await relq.ensureInitialized();
82
92
  const { client, release } = await relq[INTERNAL].getClientForCursor();
83
93
  try {
84
- await client.query('BEGIN');
94
+ let beginSql = 'BEGIN';
95
+ const parts = [];
96
+ if (options?.isolation) {
97
+ parts.push(`ISOLATION LEVEL ${options.isolation}`);
98
+ }
99
+ if (options?.readOnly === true) {
100
+ parts.push('READ ONLY');
101
+ }
102
+ else if (options?.readOnly === false) {
103
+ parts.push('READ WRITE');
104
+ }
105
+ if (options?.deferrable === true) {
106
+ parts.push('DEFERRABLE');
107
+ }
108
+ else if (options?.deferrable === false) {
109
+ parts.push('NOT DEFERRABLE');
110
+ }
111
+ if (parts.length > 0) {
112
+ beginSql += ' ' + parts.join(' ');
113
+ }
114
+ await client.query(beginSql);
85
115
  const tx = new TransactionClient(client, relq);
86
116
  const result = await callback(tx);
87
117
  await client.query('COMMIT');
@@ -1,7 +1,9 @@
1
- import { INTERNAL } from "./methods.js";
1
+ import { ConditionCollector } from "../condition/condition-collector.js";
2
+ import { INTERNAL } from "../../core/helpers/methods.js";
2
3
  import { ReturningExecutor } from "./ReturningExecutor.js";
3
- import { requireCapability } from "./capability-guard.js";
4
- import { createTableAccessor } from "../shared/table-accessor.js";
4
+ import { requireCapability } from "../../core/helpers/capability-guard.js";
5
+ import { createTableAccessor } from "../../core/shared/table-accessor.js";
6
+ import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
5
7
  export class ConnectedUpdateBuilder {
6
8
  builder;
7
9
  relq;
@@ -45,7 +47,21 @@ export class ConnectedUpdateBuilder {
45
47
  return { type: baseType, isArray };
46
48
  });
47
49
  }
48
- where(callback) {
50
+ where(callbackOrCondition) {
51
+ if (callbackOrCondition instanceof ConditionCollector) {
52
+ const conditionTable = callbackOrCondition._tableName;
53
+ if (conditionTable) {
54
+ const matches = conditionTable === this.schemaKey || conditionTable === this.tableName;
55
+ if (!matches) {
56
+ const queryTable = this.schemaKey || this.tableName;
57
+ throw new RelqBuilderError(`Condition was created for table '${conditionTable}' but is being used on '${queryTable}'. ` +
58
+ `Create the condition with db.where('${queryTable}') instead.`);
59
+ }
60
+ }
61
+ this.builder.where(callbackOrCondition);
62
+ return this;
63
+ }
64
+ const callback = callbackOrCondition;
49
65
  this.builder.where((q) => {
50
66
  q._tables = createTableAccessor(this.relq, this.relq.schema);
51
67
  return callback(q);
@@ -64,9 +80,13 @@ export class ConnectedUpdateBuilder {
64
80
  }
65
81
  return result.metadata.rowCount ?? 0;
66
82
  }
67
- returning(columns) {
68
- if (columns === null) {
69
- return this;
83
+ returning(...args) {
84
+ let columns;
85
+ if (args.length === 1) {
86
+ columns = args[0];
87
+ }
88
+ else {
89
+ columns = args;
70
90
  }
71
91
  requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the UPDATE to retrieve modified data');
72
92
  this.builder.returning(columns);
@@ -1,7 +1,7 @@
1
- import { CountBuilder } from "../../count/count-builder.js";
1
+ import { CountBuilder } from "../count/count-builder.js";
2
2
  import { RelqQueryError } from "../../shared/errors/relq-errors.js";
3
- import { SelectBuilder } from "../../select/select-builder.js";
4
- import { INTERNAL } from "./methods.js";
3
+ import { SelectBuilder } from "../select/select-builder.js";
4
+ import { INTERNAL } from "../../core/helpers/methods.js";
5
5
  export class PaginateBuilder {
6
6
  relq;
7
7
  tableName;
@@ -1,6 +1,6 @@
1
- import { InsertBuilder } from "../../insert/insert-builder.js";
2
- import { UpdateBuilder } from "../../update/update-builder.js";
3
- import { INTERNAL } from "./methods.js";
1
+ import { InsertBuilder } from "../insert/insert-builder.js";
2
+ import { UpdateBuilder } from "../update/update-builder.js";
3
+ import { INTERNAL } from "../../core/helpers/methods.js";
4
4
  export class ReturningExecutor {
5
5
  builder;
6
6
  relq;