@warlock.js/cascade 4.0.174 → 4.1.1

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 (1050) hide show
  1. package/README.md +6 -5
  2. package/bin/cascadejs +3 -0
  3. package/esm/cli/commands/migrate-export-sql.mjs +48 -0
  4. package/esm/cli/commands/migrate-export-sql.mjs.map +1 -0
  5. package/esm/cli/commands/migrate-list.mjs +26 -0
  6. package/esm/cli/commands/migrate-list.mjs.map +1 -0
  7. package/esm/cli/commands/migrate-rollback.mjs +50 -0
  8. package/esm/cli/commands/migrate-rollback.mjs.map +1 -0
  9. package/esm/cli/commands/migrate.mjs +65 -0
  10. package/esm/cli/commands/migrate.mjs.map +1 -0
  11. package/esm/cli/connection-from-env.mjs +181 -0
  12. package/esm/cli/connection-from-env.mjs.map +1 -0
  13. package/esm/cli/index.mjs +31 -0
  14. package/esm/cli/index.mjs.map +1 -0
  15. package/esm/cli/load-migrations.mjs +78 -0
  16. package/esm/cli/load-migrations.mjs.map +1 -0
  17. package/esm/cli/printers.mjs +57 -0
  18. package/esm/cli/printers.mjs.map +1 -0
  19. package/esm/cli/setup-logger.mjs +30 -0
  20. package/esm/cli/setup-logger.mjs.map +1 -0
  21. package/esm/cli/with-cli-connection.mjs +39 -0
  22. package/esm/cli/with-cli-connection.mjs.map +1 -0
  23. package/esm/cli.d.mts +1 -0
  24. package/esm/cli.mjs +26 -0
  25. package/esm/cli.mjs.map +1 -0
  26. package/esm/context/database-data-source-context.d.mts +32 -0
  27. package/esm/context/database-data-source-context.d.mts.map +1 -0
  28. package/esm/context/database-data-source-context.mjs +35 -0
  29. package/esm/context/database-data-source-context.mjs.map +1 -0
  30. package/esm/context/database-transaction-context.d.mts +38 -0
  31. package/esm/context/database-transaction-context.d.mts.map +1 -0
  32. package/esm/context/database-transaction-context.mjs +47 -0
  33. package/esm/context/database-transaction-context.mjs.map +1 -0
  34. package/esm/contracts/database-driver.contract.d.mts +443 -0
  35. package/esm/contracts/database-driver.contract.d.mts.map +1 -0
  36. package/esm/contracts/database-id-generator.contract.d.mts +109 -0
  37. package/esm/contracts/database-id-generator.contract.d.mts.map +1 -0
  38. package/esm/contracts/database-remover.contract.d.mts +108 -0
  39. package/esm/contracts/database-remover.contract.d.mts.map +1 -0
  40. package/esm/contracts/database-restorer.contract.d.mts +145 -0
  41. package/esm/contracts/database-restorer.contract.d.mts.map +1 -0
  42. package/esm/contracts/database-writer.contract.d.mts +123 -0
  43. package/esm/contracts/database-writer.contract.d.mts.map +1 -0
  44. package/esm/contracts/driver-blueprint.contract.d.mts +52 -0
  45. package/esm/contracts/driver-blueprint.contract.d.mts.map +1 -0
  46. package/esm/contracts/index.d.mts +9 -0
  47. package/esm/contracts/migration-driver.contract.d.mts +476 -0
  48. package/esm/contracts/migration-driver.contract.d.mts.map +1 -0
  49. package/esm/contracts/query-builder.contract.d.mts +1663 -0
  50. package/esm/contracts/query-builder.contract.d.mts.map +1 -0
  51. package/esm/contracts/sync-adapter.contract.d.mts +49 -0
  52. package/esm/contracts/sync-adapter.contract.d.mts.map +1 -0
  53. package/esm/data-source/data-source-registry.d.mts +111 -0
  54. package/esm/data-source/data-source-registry.d.mts.map +1 -0
  55. package/esm/data-source/data-source-registry.mjs +142 -0
  56. package/esm/data-source/data-source-registry.mjs.map +1 -0
  57. package/esm/data-source/data-source.d.mts +160 -0
  58. package/esm/data-source/data-source.d.mts.map +1 -0
  59. package/esm/data-source/data-source.mjs +87 -0
  60. package/esm/data-source/data-source.mjs.map +1 -0
  61. package/esm/database-dirty-tracker.d.mts +254 -0
  62. package/esm/database-dirty-tracker.d.mts.map +1 -0
  63. package/esm/database-dirty-tracker.mjs +356 -0
  64. package/esm/database-dirty-tracker.mjs.map +1 -0
  65. package/esm/drivers/mongodb/mongodb-blueprint.mjs +54 -0
  66. package/esm/drivers/mongodb/mongodb-blueprint.mjs.map +1 -0
  67. package/esm/drivers/mongodb/mongodb-driver.d.mts +334 -0
  68. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -0
  69. package/esm/drivers/mongodb/mongodb-driver.mjs +716 -0
  70. package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -0
  71. package/esm/drivers/mongodb/mongodb-id-generator.d.mts +120 -0
  72. package/esm/drivers/mongodb/mongodb-id-generator.d.mts.map +1 -0
  73. package/esm/drivers/mongodb/mongodb-id-generator.mjs +141 -0
  74. package/esm/drivers/mongodb/mongodb-id-generator.mjs.map +1 -0
  75. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts +322 -0
  76. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -0
  77. package/esm/drivers/mongodb/mongodb-migration-driver.mjs +531 -0
  78. package/esm/drivers/mongodb/mongodb-migration-driver.mjs.map +1 -0
  79. package/esm/drivers/mongodb/mongodb-query-builder.d.mts +1117 -0
  80. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -0
  81. package/esm/drivers/mongodb/mongodb-query-builder.mjs +1828 -0
  82. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -0
  83. package/esm/drivers/mongodb/mongodb-query-operations.d.mts +230 -0
  84. package/esm/drivers/mongodb/mongodb-query-operations.d.mts.map +1 -0
  85. package/esm/drivers/mongodb/mongodb-query-operations.mjs +275 -0
  86. package/esm/drivers/mongodb/mongodb-query-operations.mjs.map +1 -0
  87. package/esm/drivers/mongodb/mongodb-query-parser.d.mts +263 -0
  88. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -0
  89. package/esm/drivers/mongodb/mongodb-query-parser.mjs +965 -0
  90. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -0
  91. package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts +78 -0
  92. package/esm/drivers/mongodb/mongodb-sync-adapter.d.mts.map +1 -0
  93. package/esm/drivers/mongodb/mongodb-sync-adapter.mjs +118 -0
  94. package/esm/drivers/mongodb/mongodb-sync-adapter.mjs.map +1 -0
  95. package/esm/drivers/mongodb/types.d.mts +43 -0
  96. package/esm/drivers/mongodb/types.d.mts.map +1 -0
  97. package/esm/drivers/postgres/index.d.mts +8 -0
  98. package/esm/drivers/postgres/index.mjs +9 -0
  99. package/esm/drivers/postgres/postgres-blueprint.d.mts +60 -0
  100. package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -0
  101. package/esm/drivers/postgres/postgres-blueprint.mjs +105 -0
  102. package/esm/drivers/postgres/postgres-blueprint.mjs.map +1 -0
  103. package/esm/drivers/postgres/postgres-dialect.d.mts +144 -0
  104. package/esm/drivers/postgres/postgres-dialect.d.mts.map +1 -0
  105. package/esm/drivers/postgres/postgres-dialect.mjs +227 -0
  106. package/esm/drivers/postgres/postgres-dialect.mjs.map +1 -0
  107. package/esm/drivers/postgres/postgres-driver.d.mts +424 -0
  108. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -0
  109. package/esm/drivers/postgres/postgres-driver.mjs +845 -0
  110. package/esm/drivers/postgres/postgres-driver.mjs.map +1 -0
  111. package/esm/drivers/postgres/postgres-migration-driver.d.mts +393 -0
  112. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -0
  113. package/esm/drivers/postgres/postgres-migration-driver.mjs +760 -0
  114. package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -0
  115. package/esm/drivers/postgres/postgres-query-builder.d.mts +399 -0
  116. package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -0
  117. package/esm/drivers/postgres/postgres-query-builder.mjs +1105 -0
  118. package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -0
  119. package/esm/drivers/postgres/postgres-query-parser.d.mts +351 -0
  120. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -0
  121. package/esm/drivers/postgres/postgres-query-parser.mjs +796 -0
  122. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -0
  123. package/esm/drivers/postgres/postgres-sql-serializer.mjs +260 -0
  124. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -0
  125. package/esm/drivers/postgres/postgres-sync-adapter.d.mts +79 -0
  126. package/esm/drivers/postgres/postgres-sync-adapter.d.mts.map +1 -0
  127. package/esm/drivers/postgres/postgres-sync-adapter.mjs +162 -0
  128. package/esm/drivers/postgres/postgres-sync-adapter.mjs.map +1 -0
  129. package/esm/drivers/postgres/types.d.mts +105 -0
  130. package/esm/drivers/postgres/types.d.mts.map +1 -0
  131. package/esm/drivers/sql/sql-dialect.contract.d.mts +221 -0
  132. package/esm/drivers/sql/sql-dialect.contract.d.mts.map +1 -0
  133. package/esm/drivers/sql/sql-types.d.mts +150 -0
  134. package/esm/drivers/sql/sql-types.d.mts.map +1 -0
  135. package/esm/errors/missing-data-source.error.d.mts +25 -0
  136. package/esm/errors/missing-data-source.error.d.mts.map +1 -0
  137. package/esm/errors/missing-data-source.error.mjs +31 -0
  138. package/esm/errors/missing-data-source.error.mjs.map +1 -0
  139. package/esm/errors/transaction-rollback.error.d.mts +23 -0
  140. package/esm/errors/transaction-rollback.error.d.mts.map +1 -0
  141. package/esm/errors/transaction-rollback.error.mjs +29 -0
  142. package/esm/errors/transaction-rollback.error.mjs.map +1 -0
  143. package/esm/events/model-events.d.mts +234 -0
  144. package/esm/events/model-events.d.mts.map +1 -0
  145. package/esm/events/model-events.mjs +254 -0
  146. package/esm/events/model-events.mjs.map +1 -0
  147. package/esm/expressions/aggregate-expressions.d.mts +224 -0
  148. package/esm/expressions/aggregate-expressions.d.mts.map +1 -0
  149. package/esm/expressions/aggregate-expressions.mjs +232 -0
  150. package/esm/expressions/aggregate-expressions.mjs.map +1 -0
  151. package/esm/index.d.mts +67 -0
  152. package/esm/index.mjs +53 -0
  153. package/esm/migration/column-builder.d.mts +420 -0
  154. package/esm/migration/column-builder.d.mts.map +1 -0
  155. package/esm/migration/column-builder.mjs +532 -0
  156. package/esm/migration/column-builder.mjs.map +1 -0
  157. package/esm/migration/column-helpers.d.mts +280 -0
  158. package/esm/migration/column-helpers.d.mts.map +1 -0
  159. package/esm/migration/column-helpers.mjs +376 -0
  160. package/esm/migration/column-helpers.mjs.map +1 -0
  161. package/esm/migration/foreign-key-builder.d.mts +106 -0
  162. package/esm/migration/foreign-key-builder.d.mts.map +1 -0
  163. package/esm/migration/foreign-key-builder.mjs +126 -0
  164. package/esm/migration/foreign-key-builder.mjs.map +1 -0
  165. package/esm/migration/index.d.mts +6 -0
  166. package/esm/migration/index.mjs +7 -0
  167. package/esm/migration/migration-runner.d.mts +279 -0
  168. package/esm/migration/migration-runner.d.mts.map +1 -0
  169. package/esm/migration/migration-runner.mjs +662 -0
  170. package/esm/migration/migration-runner.mjs.map +1 -0
  171. package/esm/migration/migration.d.mts +2035 -0
  172. package/esm/migration/migration.d.mts.map +1 -0
  173. package/esm/migration/migration.mjs +2083 -0
  174. package/esm/migration/migration.mjs.map +1 -0
  175. package/esm/migration/sql-grammar.mjs +115 -0
  176. package/esm/migration/sql-grammar.mjs.map +1 -0
  177. package/esm/migration/sql-serializer.d.mts +26 -0
  178. package/esm/migration/sql-serializer.d.mts.map +1 -0
  179. package/esm/migration/sql-serializer.mjs +26 -0
  180. package/esm/migration/sql-serializer.mjs.map +1 -0
  181. package/esm/migration/types.d.mts +136 -0
  182. package/esm/migration/types.d.mts.map +1 -0
  183. package/esm/model/methods/accessor-methods.mjs +54 -0
  184. package/esm/model/methods/accessor-methods.mjs.map +1 -0
  185. package/esm/model/methods/delete-methods.mjs +16 -0
  186. package/esm/model/methods/delete-methods.mjs.map +1 -0
  187. package/esm/model/methods/dirty-methods.mjs +20 -0
  188. package/esm/model/methods/dirty-methods.mjs.map +1 -0
  189. package/esm/model/methods/hydration-methods.mjs +51 -0
  190. package/esm/model/methods/hydration-methods.mjs.map +1 -0
  191. package/esm/model/methods/instance-event-methods.mjs +22 -0
  192. package/esm/model/methods/instance-event-methods.mjs.map +1 -0
  193. package/esm/model/methods/meta-methods.mjs +36 -0
  194. package/esm/model/methods/meta-methods.mjs.map +1 -0
  195. package/esm/model/methods/pivot-methods.mjs +48 -0
  196. package/esm/model/methods/pivot-methods.mjs.map +1 -0
  197. package/esm/model/methods/query-methods.mjs +121 -0
  198. package/esm/model/methods/query-methods.mjs.map +1 -0
  199. package/esm/model/methods/restore-methods.mjs +16 -0
  200. package/esm/model/methods/restore-methods.mjs.map +1 -0
  201. package/esm/model/methods/scope-methods.mjs +20 -0
  202. package/esm/model/methods/scope-methods.mjs.map +1 -0
  203. package/esm/model/methods/serialization-methods.mjs +20 -0
  204. package/esm/model/methods/serialization-methods.mjs.map +1 -0
  205. package/esm/model/methods/static-event-methods.mjs +37 -0
  206. package/esm/model/methods/static-event-methods.mjs.map +1 -0
  207. package/esm/model/methods/write-methods.mjs +69 -0
  208. package/esm/model/methods/write-methods.mjs.map +1 -0
  209. package/esm/model/model.d.mts +1778 -0
  210. package/esm/model/model.d.mts.map +1 -0
  211. package/esm/model/model.mjs +1762 -0
  212. package/esm/model/model.mjs.map +1 -0
  213. package/esm/model/model.types.d.mts +47 -0
  214. package/esm/model/model.types.d.mts.map +1 -0
  215. package/esm/model/register-model.d.mts +140 -0
  216. package/esm/model/register-model.d.mts.map +1 -0
  217. package/esm/model/register-model.mjs +175 -0
  218. package/esm/model/register-model.mjs.map +1 -0
  219. package/esm/model/relation-decorators.d.mts +88 -0
  220. package/esm/model/relation-decorators.d.mts.map +1 -0
  221. package/esm/model/relation-decorators.mjs +191 -0
  222. package/esm/model/relation-decorators.mjs.map +1 -0
  223. package/esm/operations/database.d.mts +46 -0
  224. package/esm/operations/database.d.mts.map +1 -0
  225. package/esm/operations/database.mjs +40 -0
  226. package/esm/operations/database.mjs.map +1 -0
  227. package/esm/operations/index.d.mts +2 -0
  228. package/esm/operations/index.mjs +4 -0
  229. package/esm/operations/migrations.d.mts +71 -0
  230. package/esm/operations/migrations.d.mts.map +1 -0
  231. package/esm/operations/migrations.mjs +70 -0
  232. package/esm/operations/migrations.mjs.map +1 -0
  233. package/esm/query-builder/query-builder.d.mts +564 -0
  234. package/esm/query-builder/query-builder.d.mts.map +1 -0
  235. package/esm/query-builder/query-builder.mjs +1097 -0
  236. package/esm/query-builder/query-builder.mjs.map +1 -0
  237. package/esm/relations/index.d.mts +4 -0
  238. package/esm/relations/index.mjs +5 -0
  239. package/esm/relations/key-conventions.mjs +119 -0
  240. package/esm/relations/key-conventions.mjs.map +1 -0
  241. package/esm/relations/pivot-operations.d.mts +155 -0
  242. package/esm/relations/pivot-operations.d.mts.map +1 -0
  243. package/esm/relations/pivot-operations.mjs +232 -0
  244. package/esm/relations/pivot-operations.mjs.map +1 -0
  245. package/esm/relations/relation-hydrator.d.mts +55 -0
  246. package/esm/relations/relation-hydrator.d.mts.map +1 -0
  247. package/esm/relations/relation-hydrator.mjs +52 -0
  248. package/esm/relations/relation-hydrator.mjs.map +1 -0
  249. package/esm/relations/relation-loader.d.mts +190 -0
  250. package/esm/relations/relation-loader.d.mts.map +1 -0
  251. package/esm/relations/relation-loader.mjs +416 -0
  252. package/esm/relations/relation-loader.mjs.map +1 -0
  253. package/esm/relations/types.d.mts +317 -0
  254. package/esm/relations/types.d.mts.map +1 -0
  255. package/esm/remover/database-remover.d.mts +104 -0
  256. package/esm/remover/database-remover.d.mts.map +1 -0
  257. package/esm/remover/database-remover.mjs +174 -0
  258. package/esm/remover/database-remover.mjs.map +1 -0
  259. package/esm/restorer/database-restorer.d.mts +135 -0
  260. package/esm/restorer/database-restorer.d.mts.map +1 -0
  261. package/esm/restorer/database-restorer.mjs +316 -0
  262. package/esm/restorer/database-restorer.mjs.map +1 -0
  263. package/esm/sql-database-dirty-tracker.d.mts +17 -0
  264. package/esm/sql-database-dirty-tracker.d.mts.map +1 -0
  265. package/esm/sql-database-dirty-tracker.mjs +20 -0
  266. package/esm/sql-database-dirty-tracker.mjs.map +1 -0
  267. package/esm/sync/model-events.mjs +46 -0
  268. package/esm/sync/model-events.mjs.map +1 -0
  269. package/esm/sync/model-sync-operation.d.mts +159 -0
  270. package/esm/sync/model-sync-operation.d.mts.map +1 -0
  271. package/esm/sync/model-sync-operation.mjs +257 -0
  272. package/esm/sync/model-sync-operation.mjs.map +1 -0
  273. package/esm/sync/model-sync.d.mts +126 -0
  274. package/esm/sync/model-sync.d.mts.map +1 -0
  275. package/esm/sync/model-sync.mjs +157 -0
  276. package/esm/sync/model-sync.mjs.map +1 -0
  277. package/esm/sync/sync-context.d.mts +69 -0
  278. package/esm/sync/sync-context.d.mts.map +1 -0
  279. package/esm/sync/sync-context.mjs +95 -0
  280. package/esm/sync/sync-context.mjs.map +1 -0
  281. package/esm/sync/sync-manager.d.mts +213 -0
  282. package/esm/sync/sync-manager.d.mts.map +1 -0
  283. package/esm/sync/sync-manager.mjs +597 -0
  284. package/esm/sync/sync-manager.mjs.map +1 -0
  285. package/esm/sync/types.d.mts +215 -0
  286. package/esm/sync/types.d.mts.map +1 -0
  287. package/esm/types.d.mts +423 -0
  288. package/esm/types.d.mts.map +1 -0
  289. package/esm/utils/connect-to-database.d.mts +328 -0
  290. package/esm/utils/connect-to-database.d.mts.map +1 -0
  291. package/esm/utils/connect-to-database.mjs +130 -0
  292. package/esm/utils/connect-to-database.mjs.map +1 -0
  293. package/esm/utils/database-writer.utils.d.mts +18 -0
  294. package/esm/utils/database-writer.utils.d.mts.map +1 -0
  295. package/esm/utils/database-writer.utils.mjs +25 -0
  296. package/esm/utils/database-writer.utils.mjs.map +1 -0
  297. package/esm/utils/define-model.d.mts +185 -0
  298. package/esm/utils/define-model.d.mts.map +1 -0
  299. package/esm/utils/define-model.mjs +105 -0
  300. package/esm/utils/define-model.mjs.map +1 -0
  301. package/esm/utils/is-valid-date-value.mjs +22 -0
  302. package/esm/utils/is-valid-date-value.mjs.map +1 -0
  303. package/esm/utils/once-connected.d.mts +150 -0
  304. package/esm/utils/once-connected.d.mts.map +1 -0
  305. package/esm/utils/once-connected.mjs +203 -0
  306. package/esm/utils/once-connected.mjs.map +1 -0
  307. package/esm/validation/database-seal-plugins.d.mts +1 -0
  308. package/esm/validation/database-seal-plugins.mjs +11 -0
  309. package/esm/validation/database-seal-plugins.mjs.map +1 -0
  310. package/esm/validation/database-writer-validation-error.d.mts +101 -0
  311. package/esm/validation/database-writer-validation-error.d.mts.map +1 -0
  312. package/esm/validation/database-writer-validation-error.mjs +153 -0
  313. package/esm/validation/database-writer-validation-error.mjs.map +1 -0
  314. package/esm/validation/index.d.mts +2 -0
  315. package/esm/validation/index.mjs +4 -0
  316. package/esm/validation/mutators/embed-mutator.mjs +26 -0
  317. package/esm/validation/mutators/embed-mutator.mjs.map +1 -0
  318. package/esm/validation/plugins/database-rules-plugin.d.mts +28 -0
  319. package/esm/validation/plugins/database-rules-plugin.d.mts.map +1 -0
  320. package/esm/validation/plugins/database-rules-plugin.mjs +43 -0
  321. package/esm/validation/plugins/database-rules-plugin.mjs.map +1 -0
  322. package/esm/validation/plugins/embed-validator-plugin.d.mts +17 -0
  323. package/esm/validation/plugins/embed-validator-plugin.d.mts.map +1 -0
  324. package/esm/validation/plugins/embed-validator-plugin.mjs +20 -0
  325. package/esm/validation/plugins/embed-validator-plugin.mjs.map +1 -0
  326. package/esm/validation/rules/database-model-rule.mjs +32 -0
  327. package/esm/validation/rules/database-model-rule.mjs.map +1 -0
  328. package/esm/validation/rules/exists-rule.mjs +29 -0
  329. package/esm/validation/rules/exists-rule.mjs.map +1 -0
  330. package/esm/validation/rules/unique-rule.mjs +43 -0
  331. package/esm/validation/rules/unique-rule.mjs.map +1 -0
  332. package/esm/validation/transformers/embed-model-transformer.mjs +17 -0
  333. package/esm/validation/transformers/embed-model-transformer.mjs.map +1 -0
  334. package/esm/validation/types.d.mts +43 -0
  335. package/esm/validation/types.d.mts.map +1 -0
  336. package/esm/validation/validators/embed-validator.d.mts +25 -0
  337. package/esm/validation/validators/embed-validator.d.mts.map +1 -0
  338. package/esm/validation/validators/embed-validator.mjs +42 -0
  339. package/esm/validation/validators/embed-validator.mjs.map +1 -0
  340. package/esm/writer/database-writer.d.mts +178 -0
  341. package/esm/writer/database-writer.d.mts.map +1 -0
  342. package/esm/writer/database-writer.mjs +317 -0
  343. package/esm/writer/database-writer.mjs.map +1 -0
  344. package/llms-full.txt +2027 -0
  345. package/llms.txt +23 -0
  346. package/package.json +60 -51
  347. package/skills/README.md +65 -0
  348. package/skills/aggregate-data/SKILL.md +102 -0
  349. package/skills/cascade-basics/SKILL.md +93 -0
  350. package/skills/configure-delete-strategy/SKILL.md +126 -0
  351. package/skills/define-model/SKILL.md +170 -0
  352. package/skills/define-relations/SKILL.md +171 -0
  353. package/skills/manage-data-sources/SKILL.md +140 -0
  354. package/skills/manage-transactions/SKILL.md +118 -0
  355. package/skills/paginate-results/SKILL.md +122 -0
  356. package/skills/perform-atomic-ops/SKILL.md +98 -0
  357. package/skills/query-data/SKILL.md +168 -0
  358. package/skills/run-cascade-cli/SKILL.md +125 -0
  359. package/skills/search-by-vector/SKILL.md +127 -0
  360. package/skills/subscribe-to-model-events/SKILL.md +148 -0
  361. package/skills/track-changes/SKILL.md +109 -0
  362. package/skills/write-migration/SKILL.md +144 -0
  363. package/cjs/context/database-data-source-context.d.ts +0 -29
  364. package/cjs/context/database-data-source-context.d.ts.map +0 -1
  365. package/cjs/context/database-data-source-context.js +0 -28
  366. package/cjs/context/database-data-source-context.js.map +0 -1
  367. package/cjs/context/database-transaction-context.d.ts +0 -35
  368. package/cjs/context/database-transaction-context.d.ts.map +0 -1
  369. package/cjs/context/database-transaction-context.js +0 -40
  370. package/cjs/context/database-transaction-context.js.map +0 -1
  371. package/cjs/contracts/database-driver.contract.d.ts +0 -450
  372. package/cjs/contracts/database-driver.contract.d.ts.map +0 -1
  373. package/cjs/contracts/database-id-generator.contract.d.ts +0 -109
  374. package/cjs/contracts/database-id-generator.contract.d.ts.map +0 -1
  375. package/cjs/contracts/database-remover.contract.d.ts +0 -104
  376. package/cjs/contracts/database-remover.contract.d.ts.map +0 -1
  377. package/cjs/contracts/database-restorer.contract.d.ts +0 -143
  378. package/cjs/contracts/database-restorer.contract.d.ts.map +0 -1
  379. package/cjs/contracts/database-writer.contract.d.ts +0 -119
  380. package/cjs/contracts/database-writer.contract.d.ts.map +0 -1
  381. package/cjs/contracts/driver-blueprint.contract.d.ts +0 -49
  382. package/cjs/contracts/driver-blueprint.contract.d.ts.map +0 -1
  383. package/cjs/contracts/index.d.ts +0 -10
  384. package/cjs/contracts/index.d.ts.map +0 -1
  385. package/cjs/contracts/migration-driver.contract.d.ts +0 -522
  386. package/cjs/contracts/migration-driver.contract.d.ts.map +0 -1
  387. package/cjs/contracts/query-builder.contract.d.ts +0 -1609
  388. package/cjs/contracts/query-builder.contract.d.ts.map +0 -1
  389. package/cjs/contracts/sync-adapter.contract.d.ts +0 -58
  390. package/cjs/contracts/sync-adapter.contract.d.ts.map +0 -1
  391. package/cjs/data-source/data-source-registry.d.ts +0 -108
  392. package/cjs/data-source/data-source-registry.d.ts.map +0 -1
  393. package/cjs/data-source/data-source-registry.js +0 -145
  394. package/cjs/data-source/data-source-registry.js.map +0 -1
  395. package/cjs/data-source/data-source.d.ts +0 -147
  396. package/cjs/data-source/data-source.d.ts.map +0 -1
  397. package/cjs/data-source/data-source.js +0 -83
  398. package/cjs/data-source/data-source.js.map +0 -1
  399. package/cjs/database-dirty-tracker.d.ts +0 -252
  400. package/cjs/database-dirty-tracker.d.ts.map +0 -1
  401. package/cjs/database-dirty-tracker.js +0 -386
  402. package/cjs/database-dirty-tracker.js.map +0 -1
  403. package/cjs/drivers/mongodb/mongodb-blueprint.d.ts +0 -30
  404. package/cjs/drivers/mongodb/mongodb-blueprint.d.ts.map +0 -1
  405. package/cjs/drivers/mongodb/mongodb-blueprint.js +0 -51
  406. package/cjs/drivers/mongodb/mongodb-blueprint.js.map +0 -1
  407. package/cjs/drivers/mongodb/mongodb-driver.d.ts +0 -325
  408. package/cjs/drivers/mongodb/mongodb-driver.d.ts.map +0 -1
  409. package/cjs/drivers/mongodb/mongodb-driver.js +0 -845
  410. package/cjs/drivers/mongodb/mongodb-driver.js.map +0 -1
  411. package/cjs/drivers/mongodb/mongodb-id-generator.d.ts +0 -116
  412. package/cjs/drivers/mongodb/mongodb-id-generator.d.ts.map +0 -1
  413. package/cjs/drivers/mongodb/mongodb-id-generator.js +0 -149
  414. package/cjs/drivers/mongodb/mongodb-id-generator.js.map +0 -1
  415. package/cjs/drivers/mongodb/mongodb-migration-driver.d.ts +0 -317
  416. package/cjs/drivers/mongodb/mongodb-migration-driver.d.ts.map +0 -1
  417. package/cjs/drivers/mongodb/mongodb-migration-driver.js +0 -666
  418. package/cjs/drivers/mongodb/mongodb-migration-driver.js.map +0 -1
  419. package/cjs/drivers/mongodb/mongodb-query-builder.d.ts +0 -1122
  420. package/cjs/drivers/mongodb/mongodb-query-builder.d.ts.map +0 -1
  421. package/cjs/drivers/mongodb/mongodb-query-builder.js +0 -1988
  422. package/cjs/drivers/mongodb/mongodb-query-builder.js.map +0 -1
  423. package/cjs/drivers/mongodb/mongodb-query-operations.d.ts +0 -226
  424. package/cjs/drivers/mongodb/mongodb-query-operations.d.ts.map +0 -1
  425. package/cjs/drivers/mongodb/mongodb-query-operations.js +0 -270
  426. package/cjs/drivers/mongodb/mongodb-query-operations.js.map +0 -1
  427. package/cjs/drivers/mongodb/mongodb-query-parser.d.ts +0 -262
  428. package/cjs/drivers/mongodb/mongodb-query-parser.d.ts.map +0 -1
  429. package/cjs/drivers/mongodb/mongodb-query-parser.js +0 -1351
  430. package/cjs/drivers/mongodb/mongodb-query-parser.js.map +0 -1
  431. package/cjs/drivers/mongodb/mongodb-sync-adapter.d.ts +0 -79
  432. package/cjs/drivers/mongodb/mongodb-sync-adapter.d.ts.map +0 -1
  433. package/cjs/drivers/mongodb/mongodb-sync-adapter.js +0 -146
  434. package/cjs/drivers/mongodb/mongodb-sync-adapter.js.map +0 -1
  435. package/cjs/drivers/mongodb/types.d.ts +0 -43
  436. package/cjs/drivers/mongodb/types.d.ts.map +0 -1
  437. package/cjs/drivers/postgres/index.d.ts +0 -16
  438. package/cjs/drivers/postgres/index.d.ts.map +0 -1
  439. package/cjs/drivers/postgres/postgres-blueprint.d.ts +0 -64
  440. package/cjs/drivers/postgres/postgres-blueprint.d.ts.map +0 -1
  441. package/cjs/drivers/postgres/postgres-blueprint.js +0 -121
  442. package/cjs/drivers/postgres/postgres-blueprint.js.map +0 -1
  443. package/cjs/drivers/postgres/postgres-dialect.d.ts +0 -136
  444. package/cjs/drivers/postgres/postgres-dialect.d.ts.map +0 -1
  445. package/cjs/drivers/postgres/postgres-dialect.js +0 -268
  446. package/cjs/drivers/postgres/postgres-dialect.js.map +0 -1
  447. package/cjs/drivers/postgres/postgres-driver.d.ts +0 -432
  448. package/cjs/drivers/postgres/postgres-driver.d.ts.map +0 -1
  449. package/cjs/drivers/postgres/postgres-driver.js +0 -1008
  450. package/cjs/drivers/postgres/postgres-driver.js.map +0 -1
  451. package/cjs/drivers/postgres/postgres-migration-driver.d.ts +0 -397
  452. package/cjs/drivers/postgres/postgres-migration-driver.d.ts.map +0 -1
  453. package/cjs/drivers/postgres/postgres-migration-driver.js +0 -900
  454. package/cjs/drivers/postgres/postgres-migration-driver.js.map +0 -1
  455. package/cjs/drivers/postgres/postgres-query-builder.d.ts +0 -254
  456. package/cjs/drivers/postgres/postgres-query-builder.d.ts.map +0 -1
  457. package/cjs/drivers/postgres/postgres-query-builder.js +0 -933
  458. package/cjs/drivers/postgres/postgres-query-builder.js.map +0 -1
  459. package/cjs/drivers/postgres/postgres-query-parser.d.ts +0 -328
  460. package/cjs/drivers/postgres/postgres-query-parser.d.ts.map +0 -1
  461. package/cjs/drivers/postgres/postgres-query-parser.js +0 -868
  462. package/cjs/drivers/postgres/postgres-query-parser.js.map +0 -1
  463. package/cjs/drivers/postgres/postgres-sql-serializer.d.ts +0 -37
  464. package/cjs/drivers/postgres/postgres-sql-serializer.d.ts.map +0 -1
  465. package/cjs/drivers/postgres/postgres-sql-serializer.js +0 -400
  466. package/cjs/drivers/postgres/postgres-sql-serializer.js.map +0 -1
  467. package/cjs/drivers/postgres/postgres-sync-adapter.d.ts +0 -83
  468. package/cjs/drivers/postgres/postgres-sync-adapter.d.ts.map +0 -1
  469. package/cjs/drivers/postgres/postgres-sync-adapter.js +0 -204
  470. package/cjs/drivers/postgres/postgres-sync-adapter.js.map +0 -1
  471. package/cjs/drivers/postgres/types.d.ts +0 -144
  472. package/cjs/drivers/postgres/types.d.ts.map +0 -1
  473. package/cjs/drivers/sql/index.d.ts +0 -10
  474. package/cjs/drivers/sql/index.d.ts.map +0 -1
  475. package/cjs/drivers/sql/sql-dialect.contract.d.ts +0 -204
  476. package/cjs/drivers/sql/sql-dialect.contract.d.ts.map +0 -1
  477. package/cjs/drivers/sql/sql-types.d.ts +0 -202
  478. package/cjs/drivers/sql/sql-types.d.ts.map +0 -1
  479. package/cjs/errors/missing-data-source.error.d.ts +0 -22
  480. package/cjs/errors/missing-data-source.error.d.ts.map +0 -1
  481. package/cjs/errors/missing-data-source.error.js +0 -29
  482. package/cjs/errors/missing-data-source.error.js.map +0 -1
  483. package/cjs/errors/transaction-rollback.error.d.ts +0 -20
  484. package/cjs/errors/transaction-rollback.error.d.ts.map +0 -1
  485. package/cjs/errors/transaction-rollback.error.js +0 -27
  486. package/cjs/errors/transaction-rollback.error.js.map +0 -1
  487. package/cjs/events/model-events.d.ts +0 -231
  488. package/cjs/events/model-events.d.ts.map +0 -1
  489. package/cjs/events/model-events.js +0 -259
  490. package/cjs/events/model-events.js.map +0 -1
  491. package/cjs/expressions/aggregate-expressions.d.ts +0 -215
  492. package/cjs/expressions/aggregate-expressions.d.ts.map +0 -1
  493. package/cjs/expressions/aggregate-expressions.js +0 -221
  494. package/cjs/expressions/aggregate-expressions.js.map +0 -1
  495. package/cjs/expressions/index.d.ts +0 -2
  496. package/cjs/expressions/index.d.ts.map +0 -1
  497. package/cjs/index.d.ts +0 -45
  498. package/cjs/index.d.ts.map +0 -1
  499. package/cjs/index.js +0 -1
  500. package/cjs/index.js.map +0 -1
  501. package/cjs/migration/column-builder.d.ts +0 -417
  502. package/cjs/migration/column-builder.d.ts.map +0 -1
  503. package/cjs/migration/column-builder.js +0 -586
  504. package/cjs/migration/column-builder.js.map +0 -1
  505. package/cjs/migration/column-helpers.d.ts +0 -275
  506. package/cjs/migration/column-helpers.d.ts.map +0 -1
  507. package/cjs/migration/column-helpers.js +0 -389
  508. package/cjs/migration/column-helpers.js.map +0 -1
  509. package/cjs/migration/foreign-key-builder.d.ts +0 -103
  510. package/cjs/migration/foreign-key-builder.d.ts.map +0 -1
  511. package/cjs/migration/foreign-key-builder.js +0 -121
  512. package/cjs/migration/foreign-key-builder.js.map +0 -1
  513. package/cjs/migration/index.d.ts +0 -7
  514. package/cjs/migration/index.d.ts.map +0 -1
  515. package/cjs/migration/migration-runner.d.ts +0 -278
  516. package/cjs/migration/migration-runner.d.ts.map +0 -1
  517. package/cjs/migration/migration-runner.js +0 -815
  518. package/cjs/migration/migration-runner.js.map +0 -1
  519. package/cjs/migration/migration.d.ts +0 -1988
  520. package/cjs/migration/migration.d.ts.map +0 -1
  521. package/cjs/migration/migration.js +0 -2162
  522. package/cjs/migration/migration.js.map +0 -1
  523. package/cjs/migration/sql-grammar.d.ts +0 -61
  524. package/cjs/migration/sql-grammar.d.ts.map +0 -1
  525. package/cjs/migration/sql-grammar.js +0 -164
  526. package/cjs/migration/sql-grammar.js.map +0 -1
  527. package/cjs/migration/sql-serializer.d.ts +0 -22
  528. package/cjs/migration/sql-serializer.d.ts.map +0 -1
  529. package/cjs/migration/sql-serializer.js +0 -26
  530. package/cjs/migration/sql-serializer.js.map +0 -1
  531. package/cjs/migration/types.d.ts +0 -155
  532. package/cjs/migration/types.d.ts.map +0 -1
  533. package/cjs/model/methods/accessor-methods.d.ts +0 -13
  534. package/cjs/model/methods/accessor-methods.d.ts.map +0 -1
  535. package/cjs/model/methods/accessor-methods.js +0 -51
  536. package/cjs/model/methods/accessor-methods.js.map +0 -1
  537. package/cjs/model/methods/delete-methods.d.ts +0 -10
  538. package/cjs/model/methods/delete-methods.d.ts.map +0 -1
  539. package/cjs/model/methods/delete-methods.js +0 -10
  540. package/cjs/model/methods/delete-methods.js.map +0 -1
  541. package/cjs/model/methods/dirty-methods.d.ts +0 -10
  542. package/cjs/model/methods/dirty-methods.d.ts.map +0 -1
  543. package/cjs/model/methods/dirty-methods.js +0 -15
  544. package/cjs/model/methods/dirty-methods.js.map +0 -1
  545. package/cjs/model/methods/hydration-methods.d.ts +0 -10
  546. package/cjs/model/methods/hydration-methods.d.ts.map +0 -1
  547. package/cjs/model/methods/hydration-methods.js +0 -57
  548. package/cjs/model/methods/hydration-methods.js.map +0 -1
  549. package/cjs/model/methods/instance-event-methods.d.ts +0 -7
  550. package/cjs/model/methods/instance-event-methods.d.ts.map +0 -1
  551. package/cjs/model/methods/instance-event-methods.js +0 -15
  552. package/cjs/model/methods/instance-event-methods.js.map +0 -1
  553. package/cjs/model/methods/meta-methods.d.ts +0 -7
  554. package/cjs/model/methods/meta-methods.d.ts.map +0 -1
  555. package/cjs/model/methods/meta-methods.js +0 -78
  556. package/cjs/model/methods/meta-methods.js.map +0 -1
  557. package/cjs/model/methods/query-methods.d.ts +0 -24
  558. package/cjs/model/methods/query-methods.d.ts.map +0 -1
  559. package/cjs/model/methods/query-methods.js +0 -164
  560. package/cjs/model/methods/query-methods.js.map +0 -1
  561. package/cjs/model/methods/restore-methods.d.ts +0 -10
  562. package/cjs/model/methods/restore-methods.d.ts.map +0 -1
  563. package/cjs/model/methods/restore-methods.js +0 -13
  564. package/cjs/model/methods/restore-methods.js.map +0 -1
  565. package/cjs/model/methods/scope-methods.d.ts +0 -7
  566. package/cjs/model/methods/scope-methods.d.ts.map +0 -1
  567. package/cjs/model/methods/scope-methods.js +0 -15
  568. package/cjs/model/methods/scope-methods.js.map +0 -1
  569. package/cjs/model/methods/serialization-methods.d.ts +0 -3
  570. package/cjs/model/methods/serialization-methods.d.ts.map +0 -1
  571. package/cjs/model/methods/serialization-methods.js +0 -27
  572. package/cjs/model/methods/serialization-methods.js.map +0 -1
  573. package/cjs/model/methods/static-event-methods.d.ts +0 -9
  574. package/cjs/model/methods/static-event-methods.d.ts.map +0 -1
  575. package/cjs/model/methods/static-event-methods.js +0 -29
  576. package/cjs/model/methods/static-event-methods.js.map +0 -1
  577. package/cjs/model/methods/write-methods.d.ts +0 -10
  578. package/cjs/model/methods/write-methods.d.ts.map +0 -1
  579. package/cjs/model/methods/write-methods.js +0 -52
  580. package/cjs/model/methods/write-methods.js.map +0 -1
  581. package/cjs/model/model.d.ts +0 -1647
  582. package/cjs/model/model.d.ts.map +0 -1
  583. package/cjs/model/model.js +0 -1657
  584. package/cjs/model/model.js.map +0 -1
  585. package/cjs/model/model.types.d.ts +0 -44
  586. package/cjs/model/model.types.d.ts.map +0 -1
  587. package/cjs/model/register-model.d.ts +0 -81
  588. package/cjs/model/register-model.d.ts.map +0 -1
  589. package/cjs/model/register-model.js +0 -94
  590. package/cjs/model/register-model.js.map +0 -1
  591. package/cjs/query-builder/query-builder.d.ts +0 -556
  592. package/cjs/query-builder/query-builder.d.ts.map +0 -1
  593. package/cjs/query-builder/query-builder.js +0 -1070
  594. package/cjs/query-builder/query-builder.js.map +0 -1
  595. package/cjs/relations/helpers.d.ts +0 -156
  596. package/cjs/relations/helpers.d.ts.map +0 -1
  597. package/cjs/relations/helpers.js +0 -202
  598. package/cjs/relations/helpers.js.map +0 -1
  599. package/cjs/relations/index.d.ts +0 -35
  600. package/cjs/relations/index.d.ts.map +0 -1
  601. package/cjs/relations/pivot-operations.d.ts +0 -160
  602. package/cjs/relations/pivot-operations.d.ts.map +0 -1
  603. package/cjs/relations/pivot-operations.js +0 -293
  604. package/cjs/relations/pivot-operations.js.map +0 -1
  605. package/cjs/relations/relation-hydrator.d.ts +0 -68
  606. package/cjs/relations/relation-hydrator.d.ts.map +0 -1
  607. package/cjs/relations/relation-hydrator.js +0 -81
  608. package/cjs/relations/relation-hydrator.js.map +0 -1
  609. package/cjs/relations/relation-loader.d.ts +0 -194
  610. package/cjs/relations/relation-loader.d.ts.map +0 -1
  611. package/cjs/relations/relation-loader.js +0 -466
  612. package/cjs/relations/relation-loader.js.map +0 -1
  613. package/cjs/relations/types.d.ts +0 -306
  614. package/cjs/relations/types.d.ts.map +0 -1
  615. package/cjs/remover/database-remover.d.ts +0 -100
  616. package/cjs/remover/database-remover.d.ts.map +0 -1
  617. package/cjs/remover/database-remover.js +0 -214
  618. package/cjs/remover/database-remover.js.map +0 -1
  619. package/cjs/restorer/database-restorer.d.ts +0 -131
  620. package/cjs/restorer/database-restorer.d.ts.map +0 -1
  621. package/cjs/restorer/database-restorer.js +0 -434
  622. package/cjs/restorer/database-restorer.js.map +0 -1
  623. package/cjs/sql-database-dirty-tracker.d.ts +0 -13
  624. package/cjs/sql-database-dirty-tracker.d.ts.map +0 -1
  625. package/cjs/sql-database-dirty-tracker.js +0 -14
  626. package/cjs/sql-database-dirty-tracker.js.map +0 -1
  627. package/cjs/sync/index.d.ts +0 -12
  628. package/cjs/sync/index.d.ts.map +0 -1
  629. package/cjs/sync/model-events.d.ts +0 -62
  630. package/cjs/sync/model-events.d.ts.map +0 -1
  631. package/cjs/sync/model-events.js +0 -49
  632. package/cjs/sync/model-events.js.map +0 -1
  633. package/cjs/sync/model-sync-operation.d.ts +0 -163
  634. package/cjs/sync/model-sync-operation.d.ts.map +0 -1
  635. package/cjs/sync/model-sync-operation.js +0 -292
  636. package/cjs/sync/model-sync-operation.js.map +0 -1
  637. package/cjs/sync/model-sync.d.ts +0 -130
  638. package/cjs/sync/model-sync.d.ts.map +0 -1
  639. package/cjs/sync/model-sync.js +0 -178
  640. package/cjs/sync/model-sync.js.map +0 -1
  641. package/cjs/sync/sync-context.d.ts +0 -70
  642. package/cjs/sync/sync-context.d.ts.map +0 -1
  643. package/cjs/sync/sync-context.js +0 -101
  644. package/cjs/sync/sync-context.js.map +0 -1
  645. package/cjs/sync/sync-manager.d.ts +0 -213
  646. package/cjs/sync/sync-manager.d.ts.map +0 -1
  647. package/cjs/sync/sync-manager.js +0 -689
  648. package/cjs/sync/sync-manager.js.map +0 -1
  649. package/cjs/sync/types.d.ts +0 -289
  650. package/cjs/sync/types.d.ts.map +0 -1
  651. package/cjs/test-migrations/test-enhanced-features.migration.d.ts +0 -15
  652. package/cjs/test-migrations/test-enhanced-features.migration.d.ts.map +0 -1
  653. package/cjs/types.d.ts +0 -371
  654. package/cjs/types.d.ts.map +0 -1
  655. package/cjs/utils/connect-to-database.d.ts +0 -307
  656. package/cjs/utils/connect-to-database.d.ts.map +0 -1
  657. package/cjs/utils/connect-to-database.js +0 -130
  658. package/cjs/utils/connect-to-database.js.map +0 -1
  659. package/cjs/utils/database-writer.utils.d.ts +0 -15
  660. package/cjs/utils/database-writer.utils.d.ts.map +0 -1
  661. package/cjs/utils/database-writer.utils.js +0 -14
  662. package/cjs/utils/database-writer.utils.js.map +0 -1
  663. package/cjs/utils/define-model.js +0 -100
  664. package/cjs/utils/define-model.js.map +0 -1
  665. package/cjs/utils/is-valid-date-value.d.ts +0 -5
  666. package/cjs/utils/is-valid-date-value.d.ts.map +0 -1
  667. package/cjs/utils/is-valid-date-value.js +0 -25
  668. package/cjs/utils/is-valid-date-value.js.map +0 -1
  669. package/cjs/utils/once-connected.d.ts +0 -146
  670. package/cjs/utils/once-connected.d.ts.map +0 -1
  671. package/cjs/utils/once-connected.js +0 -251
  672. package/cjs/utils/once-connected.js.map +0 -1
  673. package/cjs/validation/database-seal-plugins.d.ts +0 -12
  674. package/cjs/validation/database-seal-plugins.d.ts.map +0 -1
  675. package/cjs/validation/database-seal-plugins.js +0 -1
  676. package/cjs/validation/database-seal-plugins.js.map +0 -1
  677. package/cjs/validation/database-writer-validation-error.d.ts +0 -97
  678. package/cjs/validation/database-writer-validation-error.d.ts.map +0 -1
  679. package/cjs/validation/database-writer-validation-error.js +0 -160
  680. package/cjs/validation/database-writer-validation-error.js.map +0 -1
  681. package/cjs/validation/index.d.ts +0 -3
  682. package/cjs/validation/index.d.ts.map +0 -1
  683. package/cjs/validation/mutators/embed-mutator.d.ts +0 -9
  684. package/cjs/validation/mutators/embed-mutator.d.ts.map +0 -1
  685. package/cjs/validation/mutators/embed-mutator.js +0 -33
  686. package/cjs/validation/mutators/embed-mutator.js.map +0 -1
  687. package/cjs/validation/plugins/embed-validator-plugin.d.ts +0 -24
  688. package/cjs/validation/plugins/embed-validator-plugin.d.ts.map +0 -1
  689. package/cjs/validation/plugins/embed-validator-plugin.js +0 -18
  690. package/cjs/validation/plugins/embed-validator-plugin.js.map +0 -1
  691. package/cjs/validation/rules/database-model-rule.d.ts +0 -7
  692. package/cjs/validation/rules/database-model-rule.d.ts.map +0 -1
  693. package/cjs/validation/rules/database-model-rule.js +0 -27
  694. package/cjs/validation/rules/database-model-rule.js.map +0 -1
  695. package/cjs/validation/transformers/embed-model-transformer.d.ts +0 -3
  696. package/cjs/validation/transformers/embed-model-transformer.d.ts.map +0 -1
  697. package/cjs/validation/transformers/embed-model-transformer.js +0 -18
  698. package/cjs/validation/transformers/embed-model-transformer.js.map +0 -1
  699. package/cjs/validation/validators/embed-validator.d.ts +0 -21
  700. package/cjs/validation/validators/embed-validator.d.ts.map +0 -1
  701. package/cjs/validation/validators/embed-validator.js +0 -43
  702. package/cjs/validation/validators/embed-validator.js.map +0 -1
  703. package/cjs/writer/database-writer.d.ts +0 -174
  704. package/cjs/writer/database-writer.d.ts.map +0 -1
  705. package/cjs/writer/database-writer.js +0 -400
  706. package/cjs/writer/database-writer.js.map +0 -1
  707. package/esm/context/database-data-source-context.d.ts +0 -29
  708. package/esm/context/database-data-source-context.d.ts.map +0 -1
  709. package/esm/context/database-data-source-context.js +0 -28
  710. package/esm/context/database-data-source-context.js.map +0 -1
  711. package/esm/context/database-transaction-context.d.ts +0 -35
  712. package/esm/context/database-transaction-context.d.ts.map +0 -1
  713. package/esm/context/database-transaction-context.js +0 -40
  714. package/esm/context/database-transaction-context.js.map +0 -1
  715. package/esm/contracts/database-driver.contract.d.ts +0 -450
  716. package/esm/contracts/database-driver.contract.d.ts.map +0 -1
  717. package/esm/contracts/database-id-generator.contract.d.ts +0 -109
  718. package/esm/contracts/database-id-generator.contract.d.ts.map +0 -1
  719. package/esm/contracts/database-remover.contract.d.ts +0 -104
  720. package/esm/contracts/database-remover.contract.d.ts.map +0 -1
  721. package/esm/contracts/database-restorer.contract.d.ts +0 -143
  722. package/esm/contracts/database-restorer.contract.d.ts.map +0 -1
  723. package/esm/contracts/database-writer.contract.d.ts +0 -119
  724. package/esm/contracts/database-writer.contract.d.ts.map +0 -1
  725. package/esm/contracts/driver-blueprint.contract.d.ts +0 -49
  726. package/esm/contracts/driver-blueprint.contract.d.ts.map +0 -1
  727. package/esm/contracts/index.d.ts +0 -10
  728. package/esm/contracts/index.d.ts.map +0 -1
  729. package/esm/contracts/migration-driver.contract.d.ts +0 -522
  730. package/esm/contracts/migration-driver.contract.d.ts.map +0 -1
  731. package/esm/contracts/query-builder.contract.d.ts +0 -1609
  732. package/esm/contracts/query-builder.contract.d.ts.map +0 -1
  733. package/esm/contracts/sync-adapter.contract.d.ts +0 -58
  734. package/esm/contracts/sync-adapter.contract.d.ts.map +0 -1
  735. package/esm/data-source/data-source-registry.d.ts +0 -108
  736. package/esm/data-source/data-source-registry.d.ts.map +0 -1
  737. package/esm/data-source/data-source-registry.js +0 -145
  738. package/esm/data-source/data-source-registry.js.map +0 -1
  739. package/esm/data-source/data-source.d.ts +0 -147
  740. package/esm/data-source/data-source.d.ts.map +0 -1
  741. package/esm/data-source/data-source.js +0 -83
  742. package/esm/data-source/data-source.js.map +0 -1
  743. package/esm/database-dirty-tracker.d.ts +0 -252
  744. package/esm/database-dirty-tracker.d.ts.map +0 -1
  745. package/esm/database-dirty-tracker.js +0 -386
  746. package/esm/database-dirty-tracker.js.map +0 -1
  747. package/esm/drivers/mongodb/mongodb-blueprint.d.ts +0 -30
  748. package/esm/drivers/mongodb/mongodb-blueprint.d.ts.map +0 -1
  749. package/esm/drivers/mongodb/mongodb-blueprint.js +0 -51
  750. package/esm/drivers/mongodb/mongodb-blueprint.js.map +0 -1
  751. package/esm/drivers/mongodb/mongodb-driver.d.ts +0 -325
  752. package/esm/drivers/mongodb/mongodb-driver.d.ts.map +0 -1
  753. package/esm/drivers/mongodb/mongodb-driver.js +0 -845
  754. package/esm/drivers/mongodb/mongodb-driver.js.map +0 -1
  755. package/esm/drivers/mongodb/mongodb-id-generator.d.ts +0 -116
  756. package/esm/drivers/mongodb/mongodb-id-generator.d.ts.map +0 -1
  757. package/esm/drivers/mongodb/mongodb-id-generator.js +0 -149
  758. package/esm/drivers/mongodb/mongodb-id-generator.js.map +0 -1
  759. package/esm/drivers/mongodb/mongodb-migration-driver.d.ts +0 -317
  760. package/esm/drivers/mongodb/mongodb-migration-driver.d.ts.map +0 -1
  761. package/esm/drivers/mongodb/mongodb-migration-driver.js +0 -666
  762. package/esm/drivers/mongodb/mongodb-migration-driver.js.map +0 -1
  763. package/esm/drivers/mongodb/mongodb-query-builder.d.ts +0 -1122
  764. package/esm/drivers/mongodb/mongodb-query-builder.d.ts.map +0 -1
  765. package/esm/drivers/mongodb/mongodb-query-builder.js +0 -1988
  766. package/esm/drivers/mongodb/mongodb-query-builder.js.map +0 -1
  767. package/esm/drivers/mongodb/mongodb-query-operations.d.ts +0 -226
  768. package/esm/drivers/mongodb/mongodb-query-operations.d.ts.map +0 -1
  769. package/esm/drivers/mongodb/mongodb-query-operations.js +0 -270
  770. package/esm/drivers/mongodb/mongodb-query-operations.js.map +0 -1
  771. package/esm/drivers/mongodb/mongodb-query-parser.d.ts +0 -262
  772. package/esm/drivers/mongodb/mongodb-query-parser.d.ts.map +0 -1
  773. package/esm/drivers/mongodb/mongodb-query-parser.js +0 -1351
  774. package/esm/drivers/mongodb/mongodb-query-parser.js.map +0 -1
  775. package/esm/drivers/mongodb/mongodb-sync-adapter.d.ts +0 -79
  776. package/esm/drivers/mongodb/mongodb-sync-adapter.d.ts.map +0 -1
  777. package/esm/drivers/mongodb/mongodb-sync-adapter.js +0 -146
  778. package/esm/drivers/mongodb/mongodb-sync-adapter.js.map +0 -1
  779. package/esm/drivers/mongodb/types.d.ts +0 -43
  780. package/esm/drivers/mongodb/types.d.ts.map +0 -1
  781. package/esm/drivers/postgres/index.d.ts +0 -16
  782. package/esm/drivers/postgres/index.d.ts.map +0 -1
  783. package/esm/drivers/postgres/postgres-blueprint.d.ts +0 -64
  784. package/esm/drivers/postgres/postgres-blueprint.d.ts.map +0 -1
  785. package/esm/drivers/postgres/postgres-blueprint.js +0 -121
  786. package/esm/drivers/postgres/postgres-blueprint.js.map +0 -1
  787. package/esm/drivers/postgres/postgres-dialect.d.ts +0 -136
  788. package/esm/drivers/postgres/postgres-dialect.d.ts.map +0 -1
  789. package/esm/drivers/postgres/postgres-dialect.js +0 -268
  790. package/esm/drivers/postgres/postgres-dialect.js.map +0 -1
  791. package/esm/drivers/postgres/postgres-driver.d.ts +0 -432
  792. package/esm/drivers/postgres/postgres-driver.d.ts.map +0 -1
  793. package/esm/drivers/postgres/postgres-driver.js +0 -1008
  794. package/esm/drivers/postgres/postgres-driver.js.map +0 -1
  795. package/esm/drivers/postgres/postgres-migration-driver.d.ts +0 -397
  796. package/esm/drivers/postgres/postgres-migration-driver.d.ts.map +0 -1
  797. package/esm/drivers/postgres/postgres-migration-driver.js +0 -900
  798. package/esm/drivers/postgres/postgres-migration-driver.js.map +0 -1
  799. package/esm/drivers/postgres/postgres-query-builder.d.ts +0 -254
  800. package/esm/drivers/postgres/postgres-query-builder.d.ts.map +0 -1
  801. package/esm/drivers/postgres/postgres-query-builder.js +0 -933
  802. package/esm/drivers/postgres/postgres-query-builder.js.map +0 -1
  803. package/esm/drivers/postgres/postgres-query-parser.d.ts +0 -328
  804. package/esm/drivers/postgres/postgres-query-parser.d.ts.map +0 -1
  805. package/esm/drivers/postgres/postgres-query-parser.js +0 -868
  806. package/esm/drivers/postgres/postgres-query-parser.js.map +0 -1
  807. package/esm/drivers/postgres/postgres-sql-serializer.d.ts +0 -37
  808. package/esm/drivers/postgres/postgres-sql-serializer.d.ts.map +0 -1
  809. package/esm/drivers/postgres/postgres-sql-serializer.js +0 -400
  810. package/esm/drivers/postgres/postgres-sql-serializer.js.map +0 -1
  811. package/esm/drivers/postgres/postgres-sync-adapter.d.ts +0 -83
  812. package/esm/drivers/postgres/postgres-sync-adapter.d.ts.map +0 -1
  813. package/esm/drivers/postgres/postgres-sync-adapter.js +0 -204
  814. package/esm/drivers/postgres/postgres-sync-adapter.js.map +0 -1
  815. package/esm/drivers/postgres/types.d.ts +0 -144
  816. package/esm/drivers/postgres/types.d.ts.map +0 -1
  817. package/esm/drivers/sql/index.d.ts +0 -10
  818. package/esm/drivers/sql/index.d.ts.map +0 -1
  819. package/esm/drivers/sql/sql-dialect.contract.d.ts +0 -204
  820. package/esm/drivers/sql/sql-dialect.contract.d.ts.map +0 -1
  821. package/esm/drivers/sql/sql-types.d.ts +0 -202
  822. package/esm/drivers/sql/sql-types.d.ts.map +0 -1
  823. package/esm/errors/missing-data-source.error.d.ts +0 -22
  824. package/esm/errors/missing-data-source.error.d.ts.map +0 -1
  825. package/esm/errors/missing-data-source.error.js +0 -29
  826. package/esm/errors/missing-data-source.error.js.map +0 -1
  827. package/esm/errors/transaction-rollback.error.d.ts +0 -20
  828. package/esm/errors/transaction-rollback.error.d.ts.map +0 -1
  829. package/esm/errors/transaction-rollback.error.js +0 -27
  830. package/esm/errors/transaction-rollback.error.js.map +0 -1
  831. package/esm/events/model-events.d.ts +0 -231
  832. package/esm/events/model-events.d.ts.map +0 -1
  833. package/esm/events/model-events.js +0 -259
  834. package/esm/events/model-events.js.map +0 -1
  835. package/esm/expressions/aggregate-expressions.d.ts +0 -215
  836. package/esm/expressions/aggregate-expressions.d.ts.map +0 -1
  837. package/esm/expressions/aggregate-expressions.js +0 -221
  838. package/esm/expressions/aggregate-expressions.js.map +0 -1
  839. package/esm/expressions/index.d.ts +0 -2
  840. package/esm/expressions/index.d.ts.map +0 -1
  841. package/esm/index.d.ts +0 -45
  842. package/esm/index.d.ts.map +0 -1
  843. package/esm/index.js +0 -1
  844. package/esm/index.js.map +0 -1
  845. package/esm/migration/column-builder.d.ts +0 -417
  846. package/esm/migration/column-builder.d.ts.map +0 -1
  847. package/esm/migration/column-builder.js +0 -586
  848. package/esm/migration/column-builder.js.map +0 -1
  849. package/esm/migration/column-helpers.d.ts +0 -275
  850. package/esm/migration/column-helpers.d.ts.map +0 -1
  851. package/esm/migration/column-helpers.js +0 -389
  852. package/esm/migration/column-helpers.js.map +0 -1
  853. package/esm/migration/foreign-key-builder.d.ts +0 -103
  854. package/esm/migration/foreign-key-builder.d.ts.map +0 -1
  855. package/esm/migration/foreign-key-builder.js +0 -121
  856. package/esm/migration/foreign-key-builder.js.map +0 -1
  857. package/esm/migration/index.d.ts +0 -7
  858. package/esm/migration/index.d.ts.map +0 -1
  859. package/esm/migration/migration-runner.d.ts +0 -278
  860. package/esm/migration/migration-runner.d.ts.map +0 -1
  861. package/esm/migration/migration-runner.js +0 -815
  862. package/esm/migration/migration-runner.js.map +0 -1
  863. package/esm/migration/migration.d.ts +0 -1988
  864. package/esm/migration/migration.d.ts.map +0 -1
  865. package/esm/migration/migration.js +0 -2162
  866. package/esm/migration/migration.js.map +0 -1
  867. package/esm/migration/sql-grammar.d.ts +0 -61
  868. package/esm/migration/sql-grammar.d.ts.map +0 -1
  869. package/esm/migration/sql-grammar.js +0 -164
  870. package/esm/migration/sql-grammar.js.map +0 -1
  871. package/esm/migration/sql-serializer.d.ts +0 -22
  872. package/esm/migration/sql-serializer.d.ts.map +0 -1
  873. package/esm/migration/sql-serializer.js +0 -26
  874. package/esm/migration/sql-serializer.js.map +0 -1
  875. package/esm/migration/types.d.ts +0 -155
  876. package/esm/migration/types.d.ts.map +0 -1
  877. package/esm/model/methods/accessor-methods.d.ts +0 -13
  878. package/esm/model/methods/accessor-methods.d.ts.map +0 -1
  879. package/esm/model/methods/accessor-methods.js +0 -51
  880. package/esm/model/methods/accessor-methods.js.map +0 -1
  881. package/esm/model/methods/delete-methods.d.ts +0 -10
  882. package/esm/model/methods/delete-methods.d.ts.map +0 -1
  883. package/esm/model/methods/delete-methods.js +0 -10
  884. package/esm/model/methods/delete-methods.js.map +0 -1
  885. package/esm/model/methods/dirty-methods.d.ts +0 -10
  886. package/esm/model/methods/dirty-methods.d.ts.map +0 -1
  887. package/esm/model/methods/dirty-methods.js +0 -15
  888. package/esm/model/methods/dirty-methods.js.map +0 -1
  889. package/esm/model/methods/hydration-methods.d.ts +0 -10
  890. package/esm/model/methods/hydration-methods.d.ts.map +0 -1
  891. package/esm/model/methods/hydration-methods.js +0 -57
  892. package/esm/model/methods/hydration-methods.js.map +0 -1
  893. package/esm/model/methods/instance-event-methods.d.ts +0 -7
  894. package/esm/model/methods/instance-event-methods.d.ts.map +0 -1
  895. package/esm/model/methods/instance-event-methods.js +0 -15
  896. package/esm/model/methods/instance-event-methods.js.map +0 -1
  897. package/esm/model/methods/meta-methods.d.ts +0 -7
  898. package/esm/model/methods/meta-methods.d.ts.map +0 -1
  899. package/esm/model/methods/meta-methods.js +0 -78
  900. package/esm/model/methods/meta-methods.js.map +0 -1
  901. package/esm/model/methods/query-methods.d.ts +0 -24
  902. package/esm/model/methods/query-methods.d.ts.map +0 -1
  903. package/esm/model/methods/query-methods.js +0 -164
  904. package/esm/model/methods/query-methods.js.map +0 -1
  905. package/esm/model/methods/restore-methods.d.ts +0 -10
  906. package/esm/model/methods/restore-methods.d.ts.map +0 -1
  907. package/esm/model/methods/restore-methods.js +0 -13
  908. package/esm/model/methods/restore-methods.js.map +0 -1
  909. package/esm/model/methods/scope-methods.d.ts +0 -7
  910. package/esm/model/methods/scope-methods.d.ts.map +0 -1
  911. package/esm/model/methods/scope-methods.js +0 -15
  912. package/esm/model/methods/scope-methods.js.map +0 -1
  913. package/esm/model/methods/serialization-methods.d.ts +0 -3
  914. package/esm/model/methods/serialization-methods.d.ts.map +0 -1
  915. package/esm/model/methods/serialization-methods.js +0 -27
  916. package/esm/model/methods/serialization-methods.js.map +0 -1
  917. package/esm/model/methods/static-event-methods.d.ts +0 -9
  918. package/esm/model/methods/static-event-methods.d.ts.map +0 -1
  919. package/esm/model/methods/static-event-methods.js +0 -29
  920. package/esm/model/methods/static-event-methods.js.map +0 -1
  921. package/esm/model/methods/write-methods.d.ts +0 -10
  922. package/esm/model/methods/write-methods.d.ts.map +0 -1
  923. package/esm/model/methods/write-methods.js +0 -52
  924. package/esm/model/methods/write-methods.js.map +0 -1
  925. package/esm/model/model.d.ts +0 -1647
  926. package/esm/model/model.d.ts.map +0 -1
  927. package/esm/model/model.js +0 -1657
  928. package/esm/model/model.js.map +0 -1
  929. package/esm/model/model.types.d.ts +0 -44
  930. package/esm/model/model.types.d.ts.map +0 -1
  931. package/esm/model/register-model.d.ts +0 -81
  932. package/esm/model/register-model.d.ts.map +0 -1
  933. package/esm/model/register-model.js +0 -94
  934. package/esm/model/register-model.js.map +0 -1
  935. package/esm/query-builder/query-builder.d.ts +0 -556
  936. package/esm/query-builder/query-builder.d.ts.map +0 -1
  937. package/esm/query-builder/query-builder.js +0 -1070
  938. package/esm/query-builder/query-builder.js.map +0 -1
  939. package/esm/relations/helpers.d.ts +0 -156
  940. package/esm/relations/helpers.d.ts.map +0 -1
  941. package/esm/relations/helpers.js +0 -202
  942. package/esm/relations/helpers.js.map +0 -1
  943. package/esm/relations/index.d.ts +0 -35
  944. package/esm/relations/index.d.ts.map +0 -1
  945. package/esm/relations/pivot-operations.d.ts +0 -160
  946. package/esm/relations/pivot-operations.d.ts.map +0 -1
  947. package/esm/relations/pivot-operations.js +0 -293
  948. package/esm/relations/pivot-operations.js.map +0 -1
  949. package/esm/relations/relation-hydrator.d.ts +0 -68
  950. package/esm/relations/relation-hydrator.d.ts.map +0 -1
  951. package/esm/relations/relation-hydrator.js +0 -81
  952. package/esm/relations/relation-hydrator.js.map +0 -1
  953. package/esm/relations/relation-loader.d.ts +0 -194
  954. package/esm/relations/relation-loader.d.ts.map +0 -1
  955. package/esm/relations/relation-loader.js +0 -466
  956. package/esm/relations/relation-loader.js.map +0 -1
  957. package/esm/relations/types.d.ts +0 -306
  958. package/esm/relations/types.d.ts.map +0 -1
  959. package/esm/remover/database-remover.d.ts +0 -100
  960. package/esm/remover/database-remover.d.ts.map +0 -1
  961. package/esm/remover/database-remover.js +0 -214
  962. package/esm/remover/database-remover.js.map +0 -1
  963. package/esm/restorer/database-restorer.d.ts +0 -131
  964. package/esm/restorer/database-restorer.d.ts.map +0 -1
  965. package/esm/restorer/database-restorer.js +0 -434
  966. package/esm/restorer/database-restorer.js.map +0 -1
  967. package/esm/sql-database-dirty-tracker.d.ts +0 -13
  968. package/esm/sql-database-dirty-tracker.d.ts.map +0 -1
  969. package/esm/sql-database-dirty-tracker.js +0 -14
  970. package/esm/sql-database-dirty-tracker.js.map +0 -1
  971. package/esm/sync/index.d.ts +0 -12
  972. package/esm/sync/index.d.ts.map +0 -1
  973. package/esm/sync/model-events.d.ts +0 -62
  974. package/esm/sync/model-events.d.ts.map +0 -1
  975. package/esm/sync/model-events.js +0 -49
  976. package/esm/sync/model-events.js.map +0 -1
  977. package/esm/sync/model-sync-operation.d.ts +0 -163
  978. package/esm/sync/model-sync-operation.d.ts.map +0 -1
  979. package/esm/sync/model-sync-operation.js +0 -292
  980. package/esm/sync/model-sync-operation.js.map +0 -1
  981. package/esm/sync/model-sync.d.ts +0 -130
  982. package/esm/sync/model-sync.d.ts.map +0 -1
  983. package/esm/sync/model-sync.js +0 -178
  984. package/esm/sync/model-sync.js.map +0 -1
  985. package/esm/sync/sync-context.d.ts +0 -70
  986. package/esm/sync/sync-context.d.ts.map +0 -1
  987. package/esm/sync/sync-context.js +0 -101
  988. package/esm/sync/sync-context.js.map +0 -1
  989. package/esm/sync/sync-manager.d.ts +0 -213
  990. package/esm/sync/sync-manager.d.ts.map +0 -1
  991. package/esm/sync/sync-manager.js +0 -689
  992. package/esm/sync/sync-manager.js.map +0 -1
  993. package/esm/sync/types.d.ts +0 -289
  994. package/esm/sync/types.d.ts.map +0 -1
  995. package/esm/test-migrations/test-enhanced-features.migration.d.ts +0 -15
  996. package/esm/test-migrations/test-enhanced-features.migration.d.ts.map +0 -1
  997. package/esm/types.d.ts +0 -371
  998. package/esm/types.d.ts.map +0 -1
  999. package/esm/utils/connect-to-database.d.ts +0 -307
  1000. package/esm/utils/connect-to-database.d.ts.map +0 -1
  1001. package/esm/utils/connect-to-database.js +0 -130
  1002. package/esm/utils/connect-to-database.js.map +0 -1
  1003. package/esm/utils/database-writer.utils.d.ts +0 -15
  1004. package/esm/utils/database-writer.utils.d.ts.map +0 -1
  1005. package/esm/utils/database-writer.utils.js +0 -14
  1006. package/esm/utils/database-writer.utils.js.map +0 -1
  1007. package/esm/utils/define-model.js +0 -100
  1008. package/esm/utils/define-model.js.map +0 -1
  1009. package/esm/utils/is-valid-date-value.d.ts +0 -5
  1010. package/esm/utils/is-valid-date-value.d.ts.map +0 -1
  1011. package/esm/utils/is-valid-date-value.js +0 -25
  1012. package/esm/utils/is-valid-date-value.js.map +0 -1
  1013. package/esm/utils/once-connected.d.ts +0 -146
  1014. package/esm/utils/once-connected.d.ts.map +0 -1
  1015. package/esm/utils/once-connected.js +0 -251
  1016. package/esm/utils/once-connected.js.map +0 -1
  1017. package/esm/validation/database-seal-plugins.d.ts +0 -12
  1018. package/esm/validation/database-seal-plugins.d.ts.map +0 -1
  1019. package/esm/validation/database-seal-plugins.js +0 -1
  1020. package/esm/validation/database-seal-plugins.js.map +0 -1
  1021. package/esm/validation/database-writer-validation-error.d.ts +0 -97
  1022. package/esm/validation/database-writer-validation-error.d.ts.map +0 -1
  1023. package/esm/validation/database-writer-validation-error.js +0 -160
  1024. package/esm/validation/database-writer-validation-error.js.map +0 -1
  1025. package/esm/validation/index.d.ts +0 -3
  1026. package/esm/validation/index.d.ts.map +0 -1
  1027. package/esm/validation/mutators/embed-mutator.d.ts +0 -9
  1028. package/esm/validation/mutators/embed-mutator.d.ts.map +0 -1
  1029. package/esm/validation/mutators/embed-mutator.js +0 -33
  1030. package/esm/validation/mutators/embed-mutator.js.map +0 -1
  1031. package/esm/validation/plugins/embed-validator-plugin.d.ts +0 -24
  1032. package/esm/validation/plugins/embed-validator-plugin.d.ts.map +0 -1
  1033. package/esm/validation/plugins/embed-validator-plugin.js +0 -18
  1034. package/esm/validation/plugins/embed-validator-plugin.js.map +0 -1
  1035. package/esm/validation/rules/database-model-rule.d.ts +0 -7
  1036. package/esm/validation/rules/database-model-rule.d.ts.map +0 -1
  1037. package/esm/validation/rules/database-model-rule.js +0 -27
  1038. package/esm/validation/rules/database-model-rule.js.map +0 -1
  1039. package/esm/validation/transformers/embed-model-transformer.d.ts +0 -3
  1040. package/esm/validation/transformers/embed-model-transformer.d.ts.map +0 -1
  1041. package/esm/validation/transformers/embed-model-transformer.js +0 -18
  1042. package/esm/validation/transformers/embed-model-transformer.js.map +0 -1
  1043. package/esm/validation/validators/embed-validator.d.ts +0 -21
  1044. package/esm/validation/validators/embed-validator.d.ts.map +0 -1
  1045. package/esm/validation/validators/embed-validator.js +0 -43
  1046. package/esm/validation/validators/embed-validator.js.map +0 -1
  1047. package/esm/writer/database-writer.d.ts +0 -174
  1048. package/esm/writer/database-writer.d.ts.map +0 -1
  1049. package/esm/writer/database-writer.js +0 -400
  1050. package/esm/writer/database-writer.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-query-builder.mjs","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/drivers/postgres/postgres-query-builder.ts"],"sourcesContent":["/**\n * PostgreSQL Query Builder\n *\n * Extends the pure QueryBuilder base with PostgreSQL-specific execution,\n * SQL generation, relation hydration, and scope management.\n *\n * @module cascade/drivers/postgres\n */\n\nimport type { GenericObject } from \"@mongez/reinforcements\";\nimport type {\n ChunkCallback,\n CursorPaginationOptions,\n CursorPaginationResult,\n DriverQuery,\n GroupByInput,\n PaginationOptions,\n PaginationResult,\n QueryBuilderContract,\n RawExpression,\n} from \"../../contracts/query-builder.contract\";\nimport type { DataSource } from \"../../data-source/data-source\";\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\nimport { isAggregateExpression } from \"../../expressions\";\nimport type { GlobalScopeDefinition } from \"../../model/model\";\nimport { resolveModelClass, tryResolveModelClass, type ModelRef } from \"../../model/register-model\";\nimport { QueryBuilder, type Op } from \"../../query-builder/query-builder\";\nimport {\n inferBelongsToForeignKey,\n inferHasForeignKey,\n inferPivotKey,\n inferPivotTable,\n} from \"../../relations/key-conventions\";\nimport { attachLoadedRelation, RelationLoader } from \"../../relations/relation-loader\";\nimport type { PostgresDriver } from \"./postgres-driver\";\nimport { PostgresQueryParser, type PostgresParserOperation } from \"./postgres-query-parser\";\n\n// ============================================================================\n// HELPER\n// ============================================================================\n\n/**\n * Cast an Op[] to PostgresParserOperation[] — the shapes are compatible since\n * both have `type: string` and `data: Record<string, unknown>`.\n */\nfunction toParserOps(ops: Op[]): PostgresParserOperation[] {\n return ops as unknown as PostgresParserOperation[];\n}\n\n// ============================================================================\n// JOIN RELATIONS MAP TYPE\n// ============================================================================\n\ntype JoinRelationConfig = {\n alias: string;\n type: \"belongsTo\" | \"hasOne\" | \"hasMany\";\n model?: ModelRef;\n localKey?: string;\n foreignKey?: string;\n ownerKey?: string;\n parentPath?: string | null;\n relationName?: string;\n parentModel?: ModelRef;\n select?: string[];\n /** Operations recorded by a joinWith constraint callback. */\n constraintOps?: Op[];\n};\n\n// ============================================================================\n// POSTGRES QUERY BUILDER\n// ============================================================================\n\n/**\n * PostgreSQL Query Builder.\n *\n * Collects query operations (via the base class) and delegates SQL generation\n * to `PostgresQueryParser`. Owns execution, hydration, and relation loading.\n *\n * @example\n * ```typescript\n * const users = await User.query()\n * .select([\"id\", \"name\", \"email\"])\n * .where(\"status\", \"active\")\n * .orderBy(\"createdAt\", \"desc\")\n * .limit(10)\n * .get();\n * ```\n */\nexport class PostgresQueryBuilder<T = unknown>\n extends QueryBuilder<T>\n implements QueryBuilderContract<T>\n{\n // ──────────────────────────────────────────────────────────────\n // POSTGRES-SPECIFIC STATE\n // ──────────────────────────────────────────────────────────────\n\n /** Data source backing this builder. */\n public readonly dataSource: DataSource;\n\n /** Hydration callback for transforming result rows into model instances. */\n public hydrateCallback?: (data: unknown, index: number) => unknown;\n\n /** Invoked before query execution. */\n private fetchingCallback?: (query: this) => void | Promise<void>;\n\n /** Invoked after fetch but before hydration. */\n private hydratingCallback?: (records: unknown[], context: unknown) => void | Promise<void>;\n\n /** Invoked after fetch and hydration. */\n private fetchedCallback?: (records: unknown[], context: unknown) => void | Promise<void>;\n\n /**\n * Map of relations registered via `joinWith()`.\n * Keyed by dot-notation path (e.g. \"organizationAiModel.aiModel\").\n */\n public joinRelations = new Map<string, JoinRelationConfig>();\n\n /**\n * Idempotency guard for `applyJoinRelations()` so calling `parse()` then\n * `get()` (or `parse()` twice) doesn't double-emit `selectRelatedColumns`\n * operations.\n */\n private joinRelationsApplied = false;\n\n /**\n * Idempotency guard for `applyCountRelations()` — see `joinRelationsApplied`.\n */\n private countRelationsApplied = false;\n\n /**\n * Idempotency guard for `applyHasRelations()` — see `joinRelationsApplied`.\n */\n private hasRelationsApplied = false;\n\n /**\n * Alias → SQL expression for two-arg `groupBy` aggregates. Recorded by the\n * `groupBy` override; consumed by `applyGroupByAggregates` to rewrite a\n * `having()` on the alias into the underlying expression (Postgres forbids\n * SELECT aliases in HAVING).\n */\n private aggregateAliases = new Map<string, string>();\n\n /**\n * Idempotency guard for `applyGroupByAggregates()` — see `joinRelationsApplied`.\n */\n private groupByAggregatesApplied = false;\n\n // ──────────────────────────────────────────────────────────────\n // CONSTRUCTOR\n // ──────────────────────────────────────────────────────────────\n\n /**\n * @param table - Target table name\n * @param dataSource - Optional (uses default data source from registry if omitted)\n */\n public constructor(\n public readonly table: string,\n dataSource?: DataSource,\n ) {\n super();\n this.dataSource = dataSource ?? dataSourceRegistry.get()!;\n }\n\n // ──────────────────────────────────────────────────────────────\n // DRIVER\n // ──────────────────────────────────────────────────────────────\n\n private get driver(): PostgresDriver {\n return this.dataSource.driver as PostgresDriver;\n }\n\n // ──────────────────────────────────────────────────────────────\n // CLONE\n // ──────────────────────────────────────────────────────────────\n\n public clone(): this {\n const cloned = new PostgresQueryBuilder<T>(this.table, this.dataSource) as this;\n\n // Copy base-class state\n cloned.operations = [...this.operations];\n cloned.pendingGlobalScopes = this.pendingGlobalScopes;\n cloned.availableLocalScopes = this.availableLocalScopes;\n cloned.disabledGlobalScopes = new Set(this.disabledGlobalScopes);\n cloned.scopesApplied = this.scopesApplied;\n cloned.eagerLoadRelations = new Map(this.eagerLoadRelations);\n cloned.countRelations = new Map(this.countRelations);\n cloned.relationDefinitions = this.relationDefinitions;\n cloned.modelClass = this.modelClass;\n\n // Copy PG-specific state\n cloned.hydrateCallback = this.hydrateCallback;\n cloned.joinRelations = new Map(this.joinRelations);\n cloned.joinRelationsApplied = this.joinRelationsApplied;\n cloned.countRelationsApplied = this.countRelationsApplied;\n cloned.hasRelationsApplied = this.hasRelationsApplied;\n cloned.aggregateAliases = new Map(this.aggregateAliases);\n cloned.groupByAggregatesApplied = this.groupByAggregatesApplied;\n\n return cloned;\n }\n\n // ============================================================================\n // PG-SPECIFIC FLUENT METHODS\n // ============================================================================\n\n /**\n * Native-query escape hatch. Passes `operations[]` to the callback for\n * direct manipulation. Use sparingly — only when fluent API is insufficient.\n *\n * @example\n * q.raw(ops => ops.push({ type: \"whereRaw\", data: { expression: \"1=1\" } }))\n */\n public raw(callback: (operations: Op[]) => void): this {\n callback(this.operations);\n return this;\n }\n\n /**\n * Record a DISTINCT flag AND auto-select the field(s).\n * In PostgreSQL, DISTINCT ON (col) requires the col to appear in SELECT.\n *\n * @example\n * q.distinctValues(\"category\") // SELECT category … DISTINCT ON (category)\n * q.distinctValues([\"category\", \"status\"]) // both fields in DISTINCT ON and SELECT\n */\n public override distinctValues(fields?: string | string[]): this {\n // Record the base DISTINCT flag op\n super.distinctValues(fields);\n // Also add a select for the field(s) so they appear in the SELECT clause\n if (fields) {\n const fieldArr = Array.isArray(fields) ? fields : [fields];\n this.addOperation(\"select\", { fields: fieldArr });\n }\n return this;\n }\n\n /**\n * GROUP BY with computed aggregates.\n *\n * Single-arg form defers to the base builder. With `aggregates`, each entry\n * is translated to SQL — via the dialect for `$agg.*` helpers, verbatim for\n * a raw SQL string — and pushed through the proven `selectRaw` projection\n * (the same plumbing `similarTo` / `applyCountRelations` rely on). The\n * grouped columns are projected explicitly because `SELECT *` is invalid\n * alongside `GROUP BY`. The alias → expression map is recorded so\n * `applyGroupByAggregates` can later rewrite `having()` on the alias.\n *\n * `$agg.distinct/floor/first/last` throw (MongoDB-only on Postgres v1);\n * MongoDB operator objects throw (not portable to SQL).\n *\n * @example\n * Order.query().groupBy(\"category\", {\n * orders: $agg.count(),\n * revenue: $agg.sum(\"amount\"),\n * }).having(\"revenue\", \">\", 1000);\n */\n public groupBy(fields: GroupByInput): this;\n public groupBy(fields: GroupByInput, aggregates: Record<string, RawExpression>): this;\n public groupBy(fields: GroupByInput, aggregates?: Record<string, RawExpression>): this {\n if (!aggregates) {\n return super.groupBy(fields);\n }\n\n const fieldList = Array.isArray(fields) ? fields : [fields];\n\n this.addOperation(\"select\", { fields: fieldList });\n\n for (const [alias, expression] of Object.entries(aggregates)) {\n let sql: string;\n\n if (isAggregateExpression(expression)) {\n sql = this.driver.dialect.aggregateToSql(expression);\n } else if (typeof expression === \"string\") {\n sql = expression;\n } else {\n throw new Error(\n `groupBy aggregate \"${alias}\" must be a $agg.* helper or a raw SQL ` +\n `string on Postgres; got ${typeof expression}. MongoDB operator ` +\n `objects are not portable to SQL — use selectRaw with explicit SQL.`,\n );\n }\n\n this.aggregateAliases.set(alias, sql);\n\n this.addOperation(\"selectRaw\", {\n expression: `${sql} AS ${this.driver.dialect.quoteIdentifier(alias)}`,\n bindings: [],\n });\n }\n\n return super.groupBy(fields);\n }\n\n /**\n * Nearest-neighbour vector similarity search via pgvector cosine distance.\n *\n * Adds two operations atomically:\n * 1. `selectRaw` → `1 - (column <=> $n::vector) AS <alias>`\n * Makes the similarity score available on every returned row.\n * 2. `orderByRaw` → `column <=> $n::vector`\n * Tells the PostgreSQL query planner to use the IVFFlat/HNSW vector index.\n * Using the alias in ORDER BY would bypass the index — the raw expression is required.\n *\n * @example\n * ```typescript\n * const results = await Vector.query()\n * .where({ organization_id: \"org-123\", content_type: \"summary\" })\n * .similarTo(\"embedding\", queryEmbedding)\n * .limit(5)\n * .get<VectorRow & { score: number }>();\n * ```\n */\n public similarTo(column: string, embedding: number[], alias = \"score\"): this {\n // pgvector expects the literal format: [n,n,n,...]\n const literal = `[${embedding.join(\",\")}]`;\n const quotedCol = this.driver.dialect.quoteIdentifier(column);\n const quotedTable = this.driver.dialect.quoteIdentifier(this.table);\n\n // 0 — Preserve all table columns.\n // Adding a selectRaw suppresses the parser's \"SELECT *\" fallback,\n // so we must explicitly include table.* before the score expression.\n this.addOperation(\"selectRaw\", {\n expression: `${quotedTable}.*`,\n bindings: [],\n });\n\n // 1 — Add similarity score to SELECT\n this.addOperation(\"selectRaw\", {\n expression: `1 - (${quotedCol} <=> ?::vector) AS ${alias}`,\n bindings: [literal],\n });\n\n // 2 — ORDER BY the raw expression so the vector index is used\n this.addOperation(\"orderByRaw\", {\n expression: `${quotedCol} <=> ?::vector`,\n bindings: [literal],\n });\n\n return this;\n }\n\n /** Set a hydration callback that transforms each result row. */\n public hydrate(callback: (data: unknown, index: number) => unknown): this {\n this.hydrateCallback = callback;\n return this;\n }\n\n /** Register a callback invoked before query execution. */\n public onFetching(callback: (query: this) => void | Promise<void>): () => void {\n this.fetchingCallback = callback;\n return () => {\n this.fetchingCallback = undefined;\n };\n }\n\n /** Register a callback invoked after fetch but before hydration. */\n public onHydrating(\n callback: (records: unknown[], context: unknown) => void | Promise<void>,\n ): () => void {\n this.hydratingCallback = callback;\n return () => {\n this.hydratingCallback = undefined;\n };\n }\n\n /** Register a callback invoked after fetch and hydration. */\n public onFetched(\n callback: (records: unknown[], context: unknown) => void | Promise<void>,\n ): () => void {\n this.fetchedCallback = callback;\n return () => {\n this.fetchedCallback = undefined;\n };\n }\n\n // ============================================================================\n // SCOPES\n // ============================================================================\n\n /** Apply pending global scopes to the operations list. */\n private applyPendingScopes(): void {\n if (!this.pendingGlobalScopes || this.scopesApplied) return;\n\n const beforeOps: Op[] = [];\n const afterOps: Op[] = [];\n\n for (const [name, { callback, timing }] of this.pendingGlobalScopes as Map<\n string,\n GlobalScopeDefinition\n >) {\n if (this.disabledGlobalScopes.has(name)) continue;\n\n const temp = new PostgresQueryBuilder(this.table, this.dataSource);\n callback(temp as unknown as QueryBuilderContract<T>);\n\n if (timing === \"before\") {\n beforeOps.push(...temp.operations);\n } else {\n afterOps.push(...temp.operations);\n }\n }\n\n this.operations = [...beforeOps, ...this.operations, ...afterOps];\n this.scopesApplied = true;\n }\n\n // ============================================================================\n // WHERE — POSTGRES-SPECIFIC (driver.dialect required)\n // ============================================================================\n\n /** Array field contains a value (or object with key). */\n public whereArrayContains(field: string, value: unknown, key?: string): this {\n const quotedField = this.driver.dialect.quoteIdentifier(field);\n if (key) {\n this.addOperation(\"whereRaw\", {\n expression: `${quotedField} @> ?::jsonb`,\n bindings: [JSON.stringify([{ [key]: value }])],\n });\n } else {\n this.addOperation(\"whereRaw\", {\n expression: `? = ANY(${quotedField})`,\n bindings: [value],\n });\n }\n return this;\n }\n\n /** Array field does NOT contain a value (or object with key). */\n public whereArrayNotContains(field: string, value: unknown, key?: string): this {\n const quotedField = this.driver.dialect.quoteIdentifier(field);\n if (key) {\n this.addOperation(\"whereRaw\", {\n expression: `NOT (${quotedField} @> ?::jsonb)`,\n bindings: [JSON.stringify([{ [key]: value }])],\n });\n } else {\n this.addOperation(\"whereRaw\", {\n expression: `NOT (? = ANY(${quotedField}))`,\n bindings: [value],\n });\n }\n return this;\n }\n\n /** Array field contains value OR is empty. */\n public whereArrayHasOrEmpty(field: string, value: unknown, key?: string): this {\n const quotedField = this.driver.dialect.quoteIdentifier(field);\n if (key) {\n this.addOperation(\"whereRaw\", {\n expression: `(${quotedField} @> ?::jsonb OR ${quotedField} = '[]'::jsonb OR ${quotedField} IS NULL)`,\n bindings: [JSON.stringify([{ [key]: value }])],\n });\n } else {\n this.addOperation(\"whereRaw\", {\n expression: `(? = ANY(${quotedField}) OR array_length(${quotedField}, 1) IS NULL)`,\n bindings: [value],\n });\n }\n return this;\n }\n\n /** Array field does NOT contain value OR is empty. */\n public whereArrayNotHaveOrEmpty(field: string, value: unknown, key?: string): this {\n const quotedField = this.driver.dialect.quoteIdentifier(field);\n if (key) {\n this.addOperation(\"whereRaw\", {\n expression: `(NOT (${quotedField} @> ?::jsonb) OR ${quotedField} = '[]'::jsonb OR ${quotedField} IS NULL)`,\n bindings: [JSON.stringify([{ [key]: value }])],\n });\n } else {\n this.addOperation(\"whereRaw\", {\n expression: `(NOT (? = ANY(${quotedField})) OR array_length(${quotedField}, 1) IS NULL)`,\n bindings: [value],\n });\n }\n return this;\n }\n\n // ============================================================================\n // joinWith — RESOLVE RELATION DEFINITIONS\n // ============================================================================\n\n /**\n * Load relations via SQL JOINs (single query) with optional per-relation constraints.\n *\n * Supports:\n * - `joinWith(\"author\")` / `joinWith([\"author\", \"category\"])`\n * - `joinWith({ actions: q => q.where(\"status\", \"pending\").limit(5) })`\n * - `joinWith({ organizationAiModel: \"id,name\", actions: q => q.orderBy(\"sort_order\") })`\n *\n * @example\n * ChatMessage.joinWith({\n * actions: q => q.where(\"status\", \"pending\").orderBy(\"sort_order\", \"asc\").limit(5),\n * organizationAiModel: \"id,createdAt\",\n * })\n */\n public override joinWith(...args: unknown[]): this {\n // Normalise all args into an array of { path, constraint } pairs\n type Entry = { path: string; constraint?: string | ((q: QueryBuilder) => void) };\n const entries: Entry[] = [];\n\n for (const arg of args) {\n if (typeof arg === \"string\") {\n entries.push({ path: arg });\n } else if (Array.isArray(arg)) {\n for (const rel of arg) {\n entries.push({ path: rel });\n }\n } else if (typeof arg === \"object\" && arg !== null) {\n for (const [rel, val] of Object.entries(arg)) {\n entries.push({ path: rel, constraint: val });\n }\n }\n }\n\n for (const { path, constraint } of entries) {\n // Parse each dot-notation path segment (supports \"rel1.rel2\" nesting)\n const segments = path.split(\".\");\n let currentModel: unknown = this.modelClass;\n let currentPath = \"\";\n\n for (let i = 0; i < segments.length; i++) {\n const rawSeg = segments[i];\n // String shorthand: \"relName:col1,col2\"\n const colonIdx = rawSeg.indexOf(\":\");\n const segName = colonIdx === -1 ? rawSeg : rawSeg.slice(0, colonIdx);\n const segColumns =\n colonIdx === -1\n ? undefined\n : rawSeg\n .slice(colonIdx + 1)\n .split(\",\")\n .filter(Boolean);\n\n currentPath = currentPath ? `${currentPath}.${segName}` : segName;\n\n // If already registered, update if new select columns given; advance model\n if (this.joinRelations.has(currentPath)) {\n const existing = this.joinRelations.get(currentPath)!;\n if (segColumns) existing.select = segColumns;\n\n // Apply constraint only on the deepest segment\n if (i === segments.length - 1 && constraint !== undefined) {\n existing.constraintOps = this._resolveConstraintOps(constraint);\n }\n\n currentModel = tryResolveModelClass(existing.model);\n continue;\n }\n\n if (!this.relationDefinitions) continue;\n\n const def = (\n i === 0\n ? (this.relationDefinitions as Record<string, unknown>)\n : (currentModel as { relations?: Record<string, unknown> })?.relations\n )?.[segName] as Record<string, unknown> | undefined;\n\n if (!def) {\n throw new Error(\n `Relation \"${segName}\" not found on model ${(currentModel as { name?: string })?.name ?? \"unknown\"}`,\n );\n }\n\n // Resolve select columns: colon shorthand > constraint string > def.select\n let selectColumns: string[] | undefined =\n segColumns ?? (def.select as string[] | undefined);\n\n let constraintOps: Op[] | undefined;\n if (i === segments.length - 1 && constraint !== undefined) {\n if (typeof constraint === \"string\") {\n selectColumns = constraint.split(\",\").filter(Boolean);\n } else {\n constraintOps = this._resolveConstraintOps(constraint);\n }\n }\n\n const alias = currentPath.replace(/\\./g, \"_\");\n\n this.joinRelations.set(currentPath, {\n alias,\n type: def.type as JoinRelationConfig[\"type\"],\n model: def.model as ModelRef | undefined,\n localKey: def.localKey as string | undefined,\n foreignKey: def.foreignKey as string | undefined,\n ownerKey: def.ownerKey as string | undefined,\n parentPath: i > 0 ? currentPath.substring(0, currentPath.lastIndexOf(\".\")) : null,\n relationName: segName,\n parentModel: currentModel as ModelRef | undefined,\n select: selectColumns,\n constraintOps,\n });\n\n currentModel = tryResolveModelClass(def.model as ModelRef | undefined);\n\n if (!currentModel) {\n throw new Error(`Relation model not found for \"${segName}\" in \"${currentPath}\"`);\n }\n }\n }\n\n return this;\n }\n\n /** Run a joinWith constraint callback against a sub-QB and capture its operations. */\n private _resolveConstraintOps(constraint: string | ((q: QueryBuilder) => void)): Op[] {\n if (typeof constraint === \"string\") return [];\n const sub = new PostgresQueryBuilder(\"__sub__\", this.dataSource);\n constraint(sub);\n return sub.operations;\n }\n\n // ============================================================================\n // EXECUTION METHODS\n // ============================================================================\n\n /**\n * Execute the query and return all matching rows.\n */\n public async get<TResult = T>(): Promise<TResult[]> {\n this.applyPendingScopes();\n this._processJoinWithOps();\n this.applyJoinRelations();\n this.applyHasRelations();\n this.applyCountRelations();\n this.applyGroupByAggregates();\n\n if (this.fetchingCallback) {\n await this.fetchingCallback(this);\n }\n\n const parser = new PostgresQueryParser({\n table: this.table,\n operations: toParserOps(this.operations),\n });\n\n const { query = \"\", bindings = [] } = parser.parse();\n\n try {\n const result = await this.driver.query<TResult>(query, bindings);\n let records = result.rows;\n\n const joinedData = this.extractJoinedRelationData(records);\n\n if (this.hydratingCallback) {\n await this.hydratingCallback(records as unknown[], {});\n }\n\n if (this.hydrateCallback) {\n records = records.map((row, index) => this.hydrateCallback!(row, index)) as TResult[];\n }\n\n this.attachJoinedRelations(records, joinedData);\n\n await this.applyEagerLoading(records as unknown[]);\n\n if (this.fetchedCallback) {\n await this.fetchedCallback(records as unknown[], {});\n }\n\n this.operations = [];\n return records;\n } catch (error) {\n console.log(\"Error while executing:\", query, bindings);\n console.log(\"Query Builder Error:\", error);\n throw error;\n }\n }\n\n /** Get first result. */\n public async first<TResult = T>(): Promise<TResult | null> {\n const results = await this.limit(1).get<TResult>();\n return results[0] ?? null;\n }\n\n /** Get last result (by id desc). */\n public async last<TResult = T>(): Promise<TResult | null> {\n const results = await this.orderByDesc(\"id\").limit(1).get<TResult>();\n return results[0] ?? null;\n }\n\n /** Get random results. */\n public async random<TResult = T>(limit?: number): Promise<TResult[]> {\n this.orderByRaw(\"RANDOM()\");\n if (limit) this.limit(limit);\n return this.get<TResult>();\n }\n\n /** Get first or throw. */\n public async firstOrFail<TResult = T>(): Promise<TResult> {\n const result = await this.first<TResult>();\n if (!result) throw new Error(\"No records found\");\n return result;\n }\n\n /** Get first or call callback. */\n public async firstOr<TResult = T>(callback: () => TResult | Promise<TResult>): Promise<TResult> {\n const result = await this.first<TResult>();\n return result ?? (await callback());\n }\n\n /** Get first or return null. */\n public async firstOrNull<TResult = T>(): Promise<TResult | null> {\n return this.first<TResult>();\n }\n\n /** Get first or return default. */\n public async firstOrNew<TResult = T>(defaults: GenericObject): Promise<TResult> {\n const result = await this.first<TResult>();\n return result ?? (defaults as unknown as TResult);\n }\n\n /** Find by primary key. */\n public async find<TResult = T>(id: number | string): Promise<TResult | null> {\n return this.where(\"id\", id).first<TResult>();\n }\n\n /** Count matching rows. */\n public async count(): Promise<number> {\n this.applyPendingScopes();\n const countOps: PostgresParserOperation[] = toParserOps([\n ...this.operations.filter((op) => op.type.includes(\"where\") || op.type.includes(\"join\")),\n { type: \"selectRaw\", data: { expression: 'COUNT(*) AS \"count\"' } },\n ]);\n\n const parser = new PostgresQueryParser({ table: this.table, operations: countOps });\n const { query = \"\", bindings = [] } = parser.parse();\n const result = await this.driver.query<{ count: string }>(query, bindings);\n return parseInt(result.rows[0]?.count ?? \"0\", 10);\n }\n\n /** SUM a numeric field. */\n public async sum(field: string): Promise<number> {\n this.applyPendingScopes();\n const result = await this.selectRaw(`SUM(${field}) as sum`).first<{ sum: string }>();\n return parseFloat(result?.sum ?? \"0\");\n }\n\n /** AVG of a numeric field. */\n public async avg(field: string): Promise<number> {\n this.applyPendingScopes();\n const result = await this.selectRaw(`AVG(${field}) as avg`).first<{ avg: string }>();\n return parseFloat(result?.avg ?? \"0\");\n }\n\n /** MIN of a numeric field. */\n public async min(field: string): Promise<number> {\n this.applyPendingScopes();\n const result = await this.selectRaw(`MIN(${field}) as min`).first<{ min: string }>();\n return parseFloat(result?.min ?? \"0\");\n }\n\n /** MAX of a numeric field. */\n public async max(field: string): Promise<number> {\n this.applyPendingScopes();\n const result = await this.selectRaw(`MAX(${field}) as max`).first<{ max: string }>();\n return parseFloat(result?.max ?? \"0\");\n }\n\n /** Get distinct values for a field. */\n public async distinct<TResult = unknown>(field: string): Promise<TResult[]> {\n this.distinctValues(field);\n const results = await this.get<{ [key: string]: TResult }>();\n return results.map((row) => row[field]);\n }\n\n /** Get array of all values for a single field. */\n public async pluck(field: string): Promise<unknown[]> {\n const results = await this.select([field]).get<Record<string, unknown>>();\n return results.map((row) => row[field]);\n }\n\n /** Get a single scalar value. */\n public async value<TResult = unknown>(field: string): Promise<TResult | null> {\n const result = await this.select([field]).first<Record<string, TResult>>();\n return result?.[field] ?? null;\n }\n\n /** Check whether any matching rows exist. */\n public async exists(): Promise<boolean> {\n const count = await this.limit(1).count();\n return count > 0;\n }\n\n /** Check whether NO matching rows exist. */\n public async notExists(): Promise<boolean> {\n return !(await this.exists());\n }\n\n /** COUNT DISTINCT a field. */\n public async countDistinct(field: string): Promise<number> {\n const result = await this.selectRaw(`COUNT(DISTINCT ${field}) as count`).first<{\n count: string;\n }>();\n return parseInt(result?.count ?? \"0\", 10);\n }\n\n // ─── Aggregation shortcuts via latest/oldest ─────────────────\n\n /** Get latest records ordered by a column. */\n public async latest(column = \"createdAt\"): Promise<T[]> {\n return this.orderBy(column, \"desc\").get();\n }\n\n // ─── Increment / Decrement ───────────────────────────────────\n\n /** Increment a numeric field. Returns new value. */\n public async increment(field: string, amount = 1): Promise<number> {\n this.applyPendingScopes();\n const { sql: filterSql, params: filterParams } = this.buildFilter();\n const updateSql =\n `UPDATE ${this.driver.dialect.quoteIdentifier(this.table)} ` +\n `SET ${this.driver.dialect.quoteIdentifier(field)} = COALESCE(${this.driver.dialect.quoteIdentifier(field)}, 0) + $1 ` +\n (filterSql ? `WHERE ${filterSql.replace(\"WHERE \", \"\")} ` : \"\") +\n `RETURNING ${this.driver.dialect.quoteIdentifier(field)}`;\n const result = await this.driver.query<Record<string, number>>(updateSql, [\n amount,\n ...filterParams,\n ]);\n return result.rows[0]?.[field] ?? 0;\n }\n\n /** Decrement a numeric field. Returns new value. */\n public async decrement(field: string, amount = 1): Promise<number> {\n return this.increment(field, -amount);\n }\n\n /** Increment a field for all matching rows. Returns affected row count. */\n public async incrementMany(field: string, amount = 1): Promise<number> {\n this.applyPendingScopes();\n const { sql: filterSql, params: filterParams } = this.buildFilter();\n const updateSql =\n `UPDATE ${this.driver.dialect.quoteIdentifier(this.table)} ` +\n `SET ${this.driver.dialect.quoteIdentifier(field)} = COALESCE(${this.driver.dialect.quoteIdentifier(field)}, 0) + $1` +\n (filterSql ? ` WHERE ${filterSql.replace(\"WHERE \", \"\")}` : \"\");\n const result = await this.driver.query(updateSql, [amount, ...filterParams]);\n return result.rowCount ?? 0;\n }\n\n /** Decrement a field for all matching rows. Returns affected row count. */\n public async decrementMany(field: string, amount = 1): Promise<number> {\n return this.incrementMany(field, -amount);\n }\n\n // ─── Chunking / Pagination ───────────────────────────────────\n\n /**\n * Process results in memory-efficient chunks.\n *\n * @example\n * await User.query().chunk(100, async (rows, idx) => { ... })\n */\n public async chunk(size: number, callback: ChunkCallback<T>): Promise<void> {\n let chunkIndex = 0;\n let hasMore = true;\n\n while (hasMore) {\n const chunk = await this.clone()\n .skip(chunkIndex * size)\n .limit(size)\n .get();\n if (chunk.length === 0) break;\n\n const shouldContinue = await callback(chunk, chunkIndex);\n if (shouldContinue === false) break;\n\n hasMore = chunk.length === size;\n chunkIndex++;\n }\n }\n\n /** Page-based pagination. */\n public async paginate(options?: PaginationOptions): Promise<PaginationResult<T>> {\n const page = options?.page ?? 1;\n const limit = options?.limit ?? 10;\n const skip = (page - 1) * limit;\n\n const [data, total] = await Promise.all([\n this.clone().skip(skip).limit(limit).get(),\n this.count(),\n ]);\n\n return {\n data,\n pagination: {\n total,\n page,\n limit,\n pages: Math.ceil(total / limit),\n },\n };\n }\n\n /**\n * Set cursor pagination hints fluently.\n * The recorded values are picked up by `cursorPaginate()` when no explicit\n * options are passed.\n *\n * @example\n * User.query().cursor(lastId).cursorPaginate({ limit: 20 })\n */\n public cursor(after?: unknown, before?: unknown): this {\n this.addOperation(\"cursor\", { after, before });\n return this;\n }\n\n /** Cursor-based pagination. */\n public async cursorPaginate(\n options?: CursorPaginationOptions,\n ): Promise<CursorPaginationResult<T>> {\n // Fall back to fluently-recorded cursor op if options.cursor not provided\n const cursorOp = this.getOps(\"cursor\")[0];\n const recordedCursor = cursorOp?.data.after;\n\n const {\n limit = 10,\n cursor = recordedCursor,\n column = \"id\",\n direction = \"next\",\n } = options ?? {};\n\n if (cursor) {\n this.where(column, direction === \"next\" ? \">\" : \"<\", cursor);\n }\n\n this.orderBy(column, direction === \"next\" ? \"asc\" : \"desc\");\n const results = await this.limit(limit + 1).get();\n const hasMore = results.length > limit;\n let data = hasMore ? results.slice(0, limit) : results;\n if (direction === \"prev\") data = data.reverse();\n\n let nextCursor: unknown;\n let prevCursor: unknown;\n let hasPrev = false;\n\n if (data.length > 0) {\n const firstItem = (data[0] as Record<string, unknown>)[column];\n const lastItem = (data[data.length - 1] as Record<string, unknown>)[column];\n\n if (direction === \"next\") {\n nextCursor = hasMore ? lastItem : undefined;\n if (cursor) {\n hasPrev = true;\n prevCursor = firstItem;\n }\n } else {\n prevCursor = hasMore ? firstItem : undefined;\n hasPrev = hasMore;\n if (cursor) nextCursor = lastItem;\n }\n }\n\n return { data, pagination: { hasMore, hasPrev, nextCursor, prevCursor } };\n }\n\n // ─── Mutation methods ────────────────────────────────────────\n\n /** Delete matching rows. Returns deleted count. */\n public async delete(): Promise<number> {\n this.applyPendingScopes();\n const { sql, params } = this.buildFilter();\n const deleteSql = `DELETE FROM ${this.driver.dialect.quoteIdentifier(this.table)} ${sql}`;\n const result = await this.driver.query(deleteSql, params);\n return result.rowCount ?? 0;\n }\n\n /** Delete the first matching row. */\n public async deleteOne(): Promise<number> {\n return this.limit(1).delete();\n }\n\n /** Update matching rows. */\n public async update(fields: Record<string, unknown>): Promise<number> {\n this.applyPendingScopes();\n const result = await this.driver.updateMany(this.table, {}, { $set: fields });\n return result.modifiedCount;\n }\n\n /** Unset fields from matching rows. */\n public async unset(...fields: string[]): Promise<number> {\n this.applyPendingScopes();\n const updateObj: Record<string, 1> = {};\n for (const field of fields) updateObj[field] = 1;\n const result = await this.driver.updateMany(this.table, {}, { $unset: updateObj });\n return result.modifiedCount;\n }\n\n // ─── Inspection / Debugging ───────────────────────────────────\n\n /**\n * Return the SQL + bindings without executing.\n *\n * Runs the same prelude as `get()` (scopes, joinWith expansion, joinRelations,\n * countRelations) so the preview matches what would actually be sent to the\n * database. The apply* methods are idempotent — calling `parse()` then `get()`\n * does not double-emit operations.\n */\n public parse(): DriverQuery {\n this.applyPendingScopes();\n this._processJoinWithOps();\n this.applyJoinRelations();\n this.applyHasRelations();\n this.applyCountRelations();\n this.applyGroupByAggregates();\n\n const parser = new PostgresQueryParser({\n table: this.table,\n operations: toParserOps(this.operations),\n });\n return parser.parse();\n }\n\n /** Formatted SQL string (for logging/debugging). */\n public pretty(): string {\n const { query = \"\", bindings } = this.parse();\n return `${query}\\n-- Bindings: ${JSON.stringify(bindings ?? [])}`;\n }\n\n /** Run EXPLAIN ANALYZE on the query. */\n public async explain(): Promise<unknown> {\n const { query = \"\", bindings = [] } = this.parse();\n const result = await this.driver.query(\n `EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) ${query}`,\n bindings,\n );\n return result.rows;\n }\n\n // ─── Utility ──────────────────────────────────────────────────\n\n /** Extend the builder with a driver-specific extension. */\n public extend<R>(extension: string, ..._args: unknown[]): R {\n throw new Error(`Extension \"${extension}\" is not supported by PostgresQueryBuilder`);\n }\n\n /** Pluck scalar values for a single field (alias for pluck). */\n public async pluckOne<TResult = unknown>(field: string): Promise<TResult[]> {\n const results = await this.select([field]).get<Record<string, TResult>>();\n return results.map((row) => row[field]);\n }\n\n // ============================================================================\n // JOIN RELATIONS — INTERNAL PIPELINE\n // ============================================================================\n\n /**\n * Before `get()` runs the parser, consume any joinWith ops recorded by the base\n * class and expand them into the joinRelations Map.\n */\n private _processJoinWithOps(): void {\n const joinWithOps = this.operations.filter((op) => op.type === \"joinWith\");\n if (joinWithOps.length === 0) return;\n\n // Remove joinWith ops from main operations — they are consumed here\n this.operations = this.operations.filter((op) => op.type !== \"joinWith\");\n\n for (const op of joinWithOps) {\n const constraints = op.data.constraints as Record<\n string,\n string | ((q: QueryBuilder) => void)\n >;\n for (const [path, constraint] of Object.entries(constraints)) {\n // Re-delegate to the extended joinWith implementation\n if (!constraint || constraint === \"\") {\n this.joinWith(path);\n } else {\n this.joinWith({ [path]: constraint });\n }\n }\n }\n }\n\n /**\n * Translate each entry in `joinRelations` into actual JOIN + selectRelatedColumns operations.\n *\n * Idempotent — guarded by `joinRelationsApplied` so repeat calls (e.g.\n * `parse()` followed by `get()`) don't double-emit operations.\n */\n private applyJoinRelations(): void {\n if (this.joinRelationsApplied || this.joinRelations.size === 0) {\n return;\n }\n\n this.joinRelationsApplied = true;\n\n for (const [path, config] of this.joinRelations) {\n const RelatedModel = tryResolveModelClass(config.model) as\n | { table: string; name?: string; primaryKey?: string }\n | undefined;\n\n if (!RelatedModel) {\n throw new Error(`Relation model not found for ${path}`);\n }\n\n const relatedTable = (RelatedModel as { table: string }).table;\n const alias = config.alias;\n const parentTable = config.parentPath\n ? this.joinRelations.get(config.parentPath)!.alias\n : this.table;\n\n const parentModel = config.parentModel as { name?: string; primaryKey?: string } | undefined;\n const relatedModelMeta = RelatedModel as { name?: string; primaryKey?: string };\n\n let localField: string;\n let foreignField: string;\n\n const conventions = this.dataSource?.relationDefaults;\n\n if (config.type === \"belongsTo\") {\n localField =\n config.foreignKey ?? inferBelongsToForeignKey(config.relationName ?? \"\", conventions);\n foreignField = config.ownerKey ?? relatedModelMeta.primaryKey ?? \"id\";\n } else {\n localField = config.localKey ?? parentModel?.primaryKey ?? \"id\";\n foreignField =\n config.foreignKey ?? inferHasForeignKey(parentModel?.name ?? \"Model\", conventions);\n }\n\n // hasMany uses a correlated subquery in SELECT (no JOIN) to avoid row explosion\n if (config.type !== \"hasMany\") {\n this.addOperation(\"leftJoin\", {\n table: relatedTable,\n alias,\n localField: `${parentTable}.${localField}`,\n foreignField,\n // For hasOne/belongsTo joinWith with a constraint callback, the parser\n // appends the constraint's where-clauses to the JOIN's ON condition\n // (not the outer WHERE, which would convert LEFT JOIN semantics into\n // INNER JOIN — main rows without a matching constraint-passing related\n // row would disappear).\n constraintOps: config.constraintOps,\n });\n }\n\n this.addOperation(\"selectRelatedColumns\", {\n alias,\n relationName: config.relationName,\n path,\n table: relatedTable,\n select: config.select,\n type: config.type,\n foreignKey: foreignField,\n localKey: localField,\n parentTable,\n constraintOps: config.constraintOps, // passed through to parser\n });\n }\n }\n\n // ============================================================================\n // HAS RELATIONS — INTERNAL PIPELINE\n // ============================================================================\n\n /**\n * Translate every `has` / `whereHas` / `orWhereHas` / `doesntHave` /\n * `whereDoesntHave` operation into an equivalent `whereRaw` (or\n * `orWhereRaw`) carrying an EXISTS / NOT EXISTS / COUNT-comparison\n * subquery. Keeps the parser pure (no schema awareness) — same pattern as\n * `applyJoinRelations` and `applyCountRelations`.\n *\n * In-place rewrite preserves position so the boolean (AND/OR) stays\n * correctly slotted relative to other where conditions.\n *\n * Idempotent — guarded by `hasRelationsApplied` so repeat calls (e.g.\n * `parse()` followed by `get()`) don't double-translate.\n */\n private applyHasRelations(): void {\n if (this.hasRelationsApplied) {\n return;\n }\n\n const HAS_OP_TYPES = new Set([\n \"has\",\n \"whereHas\",\n \"orWhereHas\",\n \"doesntHave\",\n \"whereDoesntHave\",\n ]);\n\n const hasAnyHasOp = this.operations.some((op) => HAS_OP_TYPES.has(op.type));\n\n if (!hasAnyHasOp) {\n this.hasRelationsApplied = true;\n return;\n }\n\n this.hasRelationsApplied = true;\n\n this.operations = this.operations.map((op) => {\n if (!HAS_OP_TYPES.has(op.type)) {\n return op;\n }\n\n return this.translateHasOp(op);\n });\n\n this.rebuildIndex();\n }\n\n /**\n * Translate one has-family operation into its `whereRaw`/`orWhereRaw`\n * equivalent. Resolves the relation definition, builds the EXISTS or\n * COUNT-comparison subquery, and returns the replacement op.\n */\n private translateHasOp(op: Op): Op {\n const data = op.data as {\n relation: string;\n subquery?: Op[];\n operator?: string;\n count?: number;\n };\n\n const definition = this.relationDefinitions?.[data.relation] as\n | Record<string, unknown>\n | undefined;\n\n if (!definition) {\n const modelName = (this.modelClass as { name?: string } | undefined)?.name ?? \"unknown\";\n throw new Error(`${op.type}: Relation \"${data.relation}\" not found on model ${modelName}`);\n }\n\n const RelatedModel = tryResolveModelClass(definition.model as ModelRef | undefined) as\n | { table?: string; name?: string; primaryKey?: string }\n | undefined;\n\n if (!RelatedModel || !(RelatedModel as { table?: string }).table) {\n throw new Error(`${op.type}: Related model not resolvable for \"${data.relation}\"`);\n }\n\n const subquery = this.buildHasSubquery(\n op.type,\n data.relation,\n definition,\n RelatedModel as { table: string; name: string; primaryKey?: string },\n data.subquery,\n data.operator,\n data.count,\n );\n\n const targetType = op.type === \"orWhereHas\" ? \"orWhereRaw\" : \"whereRaw\";\n\n return {\n type: targetType,\n data: {\n expression: subquery.expression,\n bindings: subquery.bindings,\n },\n };\n }\n\n /**\n * Build the SQL fragment that goes inside a `whereRaw` op for a has-family\n * translation. Branches on relation type AND on the operation type:\n *\n * - `has` with default operator/count → `EXISTS (SELECT 1 FROM ...)`\n * - `has` with custom operator/count → `(SELECT COUNT(*) FROM ...) <op> <count>`\n * - `whereHas` / `orWhereHas` → `EXISTS (SELECT 1 ... AND <constraint>)`\n * - `doesntHave` → `NOT EXISTS (SELECT 1 FROM ...)`\n * - `whereDoesntHave` → `NOT EXISTS (SELECT 1 ... AND <constraint>)`\n */\n private buildHasSubquery(\n opType: string,\n relationName: string,\n definition: Record<string, unknown>,\n RelatedModel: { table: string; name: string; primaryKey?: string },\n constraintOps: Op[] | undefined,\n operator: string | undefined,\n count: number | undefined,\n ): { expression: string; bindings: unknown[] } {\n const dialect = this.driver.dialect;\n const quotedSelfTable = dialect.quoteIdentifier(this.table);\n const quotedRelatedTable = dialect.quoteIdentifier(RelatedModel.table);\n const relationType = definition.type as string;\n const selfModel = this.modelClass as { name?: string; primaryKey?: string } | undefined;\n const conventions = this.dataSource?.relationDefaults;\n\n const where = this.extractCountWhereFragment(RelatedModel.table, constraintOps);\n\n let fromClause: string;\n let joinCondition: string;\n\n if (relationType === \"hasMany\" || relationType === \"hasOne\") {\n const localKey = (definition.localKey as string | undefined) ?? selfModel?.primaryKey ?? \"id\";\n const foreignKey =\n (definition.foreignKey as string | undefined) ??\n inferHasForeignKey(selfModel?.name ?? \"Model\", conventions);\n\n fromClause = quotedRelatedTable;\n joinCondition =\n `${quotedRelatedTable}.${dialect.quoteIdentifier(foreignKey)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(localKey)}`;\n } else if (relationType === \"belongsTo\") {\n const ownerKey =\n (definition.localKey as string | undefined) ?? RelatedModel.primaryKey ?? \"id\";\n const foreignKey =\n (definition.foreignKey as string | undefined) ??\n inferBelongsToForeignKey(relationName, conventions);\n\n fromClause = quotedRelatedTable;\n joinCondition =\n `${quotedRelatedTable}.${dialect.quoteIdentifier(ownerKey)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(foreignKey)}`;\n } else if (relationType === \"belongsToMany\") {\n const pivotTableName =\n (definition.pivot as string | undefined) ??\n inferPivotTable(selfModel?.name ?? \"Model\", RelatedModel.name, conventions);\n\n const quotedPivot = dialect.quoteIdentifier(pivotTableName);\n const pivotLocalCol =\n (definition.localKey as string | undefined) ??\n inferPivotKey(selfModel?.name ?? \"Model\", conventions);\n const pivotForeignCol =\n (definition.foreignKey as string | undefined) ??\n inferPivotKey(RelatedModel.name, conventions);\n const selfPk =\n (definition.pivotLocalKey as string | undefined) ?? selfModel?.primaryKey ?? \"id\";\n const relatedPk =\n (definition.pivotForeignKey as string | undefined) ?? RelatedModel.primaryKey ?? \"id\";\n\n // Constraint-free: pivot-only count. With constraint: INNER JOIN related so\n // the constraint can target related columns.\n if (!constraintOps || constraintOps.length === 0) {\n fromClause = quotedPivot;\n joinCondition =\n `${quotedPivot}.${dialect.quoteIdentifier(pivotLocalCol)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(selfPk)}`;\n } else {\n fromClause =\n `${quotedPivot} INNER JOIN ${quotedRelatedTable} ON ` +\n `${quotedRelatedTable}.${dialect.quoteIdentifier(relatedPk)} = ` +\n `${quotedPivot}.${dialect.quoteIdentifier(pivotForeignCol)}`;\n joinCondition =\n `${quotedPivot}.${dialect.quoteIdentifier(pivotLocalCol)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(selfPk)}`;\n }\n } else {\n throw new Error(\n `${opType}: Unsupported relation type \"${relationType}\" for \"${relationName}\"`,\n );\n }\n\n const fullWhere = where.fragment ? `${joinCondition} AND ${where.fragment}` : joinCondition;\n\n // `has` with custom operator/count compiles to a COUNT comparison; everything\n // else uses EXISTS / NOT EXISTS for short-circuit behaviour.\n const isCountComparison =\n opType === \"has\" && ((operator !== undefined && operator !== \">=\") || (count ?? 1) !== 1);\n\n if (isCountComparison) {\n const op = operator ?? \">=\";\n const compareCount = count ?? 1;\n\n return {\n expression: `(SELECT COUNT(*) FROM ${fromClause} WHERE ${fullWhere}) ${op} ${compareCount}`,\n bindings: where.bindings,\n };\n }\n\n const negate = opType === \"doesntHave\" || opType === \"whereDoesntHave\";\n const keyword = negate ? \"NOT EXISTS\" : \"EXISTS\";\n\n return {\n expression: `${keyword} (SELECT 1 FROM ${fromClause} WHERE ${fullWhere})`,\n bindings: where.bindings,\n };\n }\n\n // ============================================================================\n // COUNT RELATIONS — INTERNAL PIPELINE\n // ============================================================================\n\n /**\n * Translate each entry in `countRelations` into a correlated COUNT subquery\n * emitted as a `selectRaw` operation. Runs after `applyJoinRelations` so the\n * \"preserve main table columns\" guard sees any joins already in place.\n *\n * Idempotent — guarded by `countRelationsApplied` so repeat calls (e.g.\n * `parse()` followed by `get()`) don't double-emit operations.\n */\n private applyCountRelations(): void {\n if (this.countRelationsApplied || this.countRelations.size === 0) {\n return;\n }\n\n this.countRelationsApplied = true;\n\n this.ensureMainColumnsForCount();\n\n for (const [alias, entry] of this.countRelations) {\n const definition = this.relationDefinitions?.[entry.relation] as\n | Record<string, unknown>\n | undefined;\n\n if (!definition) {\n const modelName = (this.modelClass as { name?: string } | undefined)?.name ?? \"unknown\";\n throw new Error(`withCount: Relation \"${entry.relation}\" not found on model ${modelName}`);\n }\n\n const RelatedModel = tryResolveModelClass(definition.model as ModelRef | undefined) as\n | { table?: string; name?: string }\n | undefined;\n\n if (!RelatedModel || !(RelatedModel as { table?: string }).table) {\n throw new Error(\n `withCount: Related model not resolvable for \"${entry.relation}\" (alias \"${alias}\")`,\n );\n }\n\n const subquery = this.buildCountSubquery(\n alias,\n entry.relation,\n definition,\n RelatedModel as { table: string; name: string },\n entry.constraintOps,\n );\n\n this.addOperation(\"selectRaw\", {\n expression: subquery.expression,\n bindings: subquery.bindings,\n });\n }\n }\n\n /**\n * Without an explicit `select(...)` or any `selectRaw`/`selectRelatedColumns`\n * already pushed, the parser's \"no selects → SELECT *\" fallback would be\n * suppressed once we add count expressions. Push `<table>.*` first so the\n * caller's columns survive.\n */\n private ensureMainColumnsForCount(): void {\n const hasExistingSelect = this.operations.some(\n (op) => op.type === \"select\" || op.type === \"selectRaw\" || op.type === \"selectRelatedColumns\",\n );\n\n if (hasExistingSelect) {\n return;\n }\n\n const quotedTable = this.driver.dialect.quoteIdentifier(this.table);\n\n this.addOperation(\"selectRaw\", {\n expression: `${quotedTable}.*`,\n bindings: [],\n });\n }\n\n /**\n * Build a single correlated-subquery expression for a count entry. Branches\n * on relation type (hasMany/hasOne/belongsTo/belongsToMany). The optional\n * constraint callback's where-ops are translated via a sub-parser and\n * spliced into the subquery's WHERE clause.\n */\n private buildCountSubquery(\n alias: string,\n relationName: string,\n definition: Record<string, unknown>,\n RelatedModel: { table: string; name: string },\n constraintOps: Op[] | undefined,\n ): { expression: string; bindings: unknown[] } {\n const dialect = this.driver.dialect;\n const quotedAlias = dialect.quoteIdentifier(alias);\n const quotedSelfTable = dialect.quoteIdentifier(this.table);\n const quotedRelatedTable = dialect.quoteIdentifier(RelatedModel.table);\n const relationType = definition.type as string;\n\n const selfModel = this.modelClass as { name?: string; primaryKey?: string } | undefined;\n const relatedMeta = RelatedModel as { name: string; primaryKey?: string; table: string };\n const conventions = this.dataSource?.relationDefaults;\n\n if (relationType === \"hasMany\" || relationType === \"hasOne\") {\n const localKey = (definition.localKey as string | undefined) ?? selfModel?.primaryKey ?? \"id\";\n const foreignKey =\n (definition.foreignKey as string | undefined) ??\n inferHasForeignKey(selfModel?.name ?? \"Model\", conventions);\n const where = this.extractCountWhereFragment(RelatedModel.table, constraintOps);\n\n const fkCondition =\n `${quotedRelatedTable}.${dialect.quoteIdentifier(foreignKey)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(localKey)}`;\n const fullWhere = where.fragment ? `${fkCondition} AND ${where.fragment}` : fkCondition;\n\n return {\n expression: `(SELECT COUNT(*) FROM ${quotedRelatedTable} WHERE ${fullWhere})::int AS ${quotedAlias}`,\n bindings: where.bindings,\n };\n }\n\n if (relationType === \"belongsTo\") {\n const ownerKey =\n (definition.localKey as string | undefined) ?? relatedMeta.primaryKey ?? \"id\";\n const foreignKey =\n (definition.foreignKey as string | undefined) ??\n inferBelongsToForeignKey(relationName, conventions);\n const where = this.extractCountWhereFragment(RelatedModel.table, constraintOps);\n\n const condition =\n `${quotedRelatedTable}.${dialect.quoteIdentifier(ownerKey)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(foreignKey)}`;\n const fullWhere = where.fragment ? `${condition} AND ${where.fragment}` : condition;\n\n return {\n expression: `(SELECT COUNT(*) FROM ${quotedRelatedTable} WHERE ${fullWhere})::int AS ${quotedAlias}`,\n bindings: where.bindings,\n };\n }\n\n if (relationType === \"belongsToMany\") {\n const pivotTableName =\n (definition.pivot as string | undefined) ??\n inferPivotTable(selfModel?.name ?? \"Model\", relatedMeta.name, conventions);\n\n const quotedPivot = dialect.quoteIdentifier(pivotTableName);\n const pivotLocalCol =\n (definition.localKey as string | undefined) ??\n inferPivotKey(selfModel?.name ?? \"Model\", conventions);\n const pivotForeignCol =\n (definition.foreignKey as string | undefined) ??\n inferPivotKey(relatedMeta.name, conventions);\n const selfPk =\n (definition.pivotLocalKey as string | undefined) ?? selfModel?.primaryKey ?? \"id\";\n const relatedPk =\n (definition.pivotForeignKey as string | undefined) ?? relatedMeta.primaryKey ?? \"id\";\n\n const pivotCondition =\n `${quotedPivot}.${dialect.quoteIdentifier(pivotLocalCol)} = ` +\n `${quotedSelfTable}.${dialect.quoteIdentifier(selfPk)}`;\n\n if (!constraintOps || constraintOps.length === 0) {\n return {\n expression: `(SELECT COUNT(*) FROM ${quotedPivot} WHERE ${pivotCondition})::int AS ${quotedAlias}`,\n bindings: [],\n };\n }\n\n const where = this.extractCountWhereFragment(RelatedModel.table, constraintOps);\n const join =\n `INNER JOIN ${quotedRelatedTable} ON ${quotedRelatedTable}.${dialect.quoteIdentifier(relatedPk)} = ` +\n `${quotedPivot}.${dialect.quoteIdentifier(pivotForeignCol)}`;\n const fullWhere = where.fragment ? `${pivotCondition} AND ${where.fragment}` : pivotCondition;\n\n return {\n expression: `(SELECT COUNT(*) FROM ${quotedPivot} ${join} WHERE ${fullWhere})::int AS ${quotedAlias}`,\n bindings: where.bindings,\n };\n }\n\n throw new Error(`withCount: Unsupported relation type \"${relationType}\" for \"${relationName}\"`);\n }\n\n /**\n * Run a constraint's where-ops through a fresh sub-parser to obtain a SQL\n * WHERE-fragment plus bindings. Strips the leading `WHERE ` and rewrites\n * `$N` placeholders back to `?` so the outer parser renumbers them\n * consistently when it processes the enclosing `selectRaw` operation.\n *\n * Non-where ops (orderBy / limit / etc.) are silently dropped — they have\n * no meaning inside a COUNT subquery.\n */\n private extractCountWhereFragment(\n relatedTable: string,\n constraintOps: Op[] | undefined,\n ): { fragment: string; bindings: unknown[] } {\n if (!constraintOps || constraintOps.length === 0) {\n return { fragment: \"\", bindings: [] };\n }\n\n const whereOps = constraintOps.filter(\n (op) => op.type.startsWith(\"where\") || op.type.startsWith(\"orWhere\"),\n );\n\n if (whereOps.length === 0) {\n return { fragment: \"\", bindings: [] };\n }\n\n const subParser = new PostgresQueryParser({\n table: relatedTable,\n operations: toParserOps(whereOps),\n });\n\n const { query = \"\", bindings = [] } = subParser.parse();\n const match = query.match(/WHERE\\s+(.+)$/);\n\n if (!match) {\n return { fragment: \"\", bindings: [] };\n }\n\n const fragment = match[1].replace(/\\$\\d+/g, \"?\");\n\n return { fragment, bindings: bindings ?? [] };\n }\n\n // ============================================================================\n // GROUP-BY AGGREGATES — INTERNAL PIPELINE\n // ============================================================================\n\n /**\n * Rewrite every `having` op whose field matches a recorded aggregate alias\n * into a `havingRaw` carrying the underlying SQL expression. PostgreSQL\n * forbids SELECT aliases in HAVING, so `having(\"revenue\", \">\", 1000)` on a\n * `groupBy` aggregate would otherwise throw at runtime. A `having` on a\n * grouped column (no alias match) is left untouched. Runs at parse time\n * (not in the `groupBy` override) so it is independent of fluent call order.\n *\n * Idempotent — guarded by `groupByAggregatesApplied` so repeat calls (e.g.\n * `parse()` followed by `get()`) don't double-process.\n */\n private applyGroupByAggregates(): void {\n if (this.groupByAggregatesApplied) {\n return;\n }\n\n this.groupByAggregatesApplied = true;\n\n if (this.aggregateAliases.size === 0) {\n return;\n }\n\n this.operations = this.operations.map((operation) => {\n if (operation.type !== \"having\") {\n return operation;\n }\n\n const field = operation.data.field as string;\n const sql = this.aggregateAliases.get(field);\n\n if (!sql) {\n return operation;\n }\n\n const operator = (operation.data.operator as string) ?? \"=\";\n\n return {\n type: \"havingRaw\",\n data: {\n expression: `${sql} ${operator} ?`,\n bindings: [operation.data.value],\n },\n };\n });\n\n this.rebuildIndex();\n }\n\n // ============================================================================\n // EAGER LOADING — INTERNAL PIPELINE\n // ============================================================================\n\n /**\n * Run the RelationLoader against the fetched rows for every relation\n * registered via `with()`. Mutates each model instance in place — attaches\n * loaded relations onto `model.loadedRelations` and as direct properties.\n *\n * Lives here (not in `buildQuery`'s `onFetched` callback as it did\n * historically) so any code path that calls `get()` — including\n * `Model.newQueryBuilder()` direct instantiation, custom builder subclasses\n * via `static builder`, or any `eagerLoadRelations`-bearing builder — gets\n * eager-loading. Previously the loader was only installed when the builder\n * was constructed via `Model.query()` / `buildQuery`, so bypassing that\n * factory made `with()` a silent no-op.\n *\n * Skipped silently when `modelClass` is absent (raw driver-level\n * `queryBuilder()` usage has no relations map to consult).\n */\n private async applyEagerLoading(records: unknown[]): Promise<void> {\n if (!this.modelClass || this.eagerLoadRelations.size === 0 || records.length === 0) {\n return;\n }\n\n const constraints: Record<string, (query: QueryBuilderContract) => void> = {};\n\n for (const [name, constraint] of this.eagerLoadRelations) {\n if (typeof constraint === \"function\") {\n constraints[name] = constraint as (query: QueryBuilderContract) => void;\n }\n }\n\n const loader = new RelationLoader(records as never, this.modelClass as never);\n await loader.load([...this.eagerLoadRelations.keys()], constraints);\n }\n\n /**\n * Extract per-relation data from raw DB rows (before hydration).\n * Returns a Map of row index → nested relation data tree.\n */\n private extractJoinedRelationData(records: unknown[]): Map<number, Record<string, unknown>> {\n const result = new Map<number, Record<string, unknown>>();\n if (this.joinRelations.size === 0) return result;\n\n (records as Record<string, unknown>[]).forEach((record, index) => {\n const relationData: Record<string, unknown> = {};\n\n // Process shallower paths first so parents exist before children\n const sortedPaths = Array.from(this.joinRelations.keys()).sort(\n (a, b) => a.split(\".\").length - b.split(\".\").length,\n );\n\n for (const path of sortedPaths) {\n const config = this.joinRelations.get(path)!;\n const columnName = config.alias;\n\n const relatedData = record[columnName];\n delete record[columnName];\n\n const parsedData =\n relatedData !== null &&\n !(\n typeof relatedData === \"object\" &&\n Object.values(relatedData as object).every((v) => v === null)\n )\n ? relatedData\n : null;\n\n const parts = path.split(\".\");\n const lastPart = parts.pop()!;\n let current = relationData;\n\n for (const part of parts) {\n if (!current[part]) current[part] = {};\n current = current[part] as Record<string, unknown>;\n }\n\n current[lastPart] = parsedData;\n }\n\n result.set(index, relationData);\n });\n\n return result;\n }\n\n /**\n * Attach extracted relation data to hydrated model instances.\n */\n private attachJoinedRelations(\n records: unknown[],\n joinedData: Map<number, Record<string, unknown>>,\n ): void {\n if (this.joinRelations.size === 0) return;\n\n const attachNested = (model: unknown, dataTree: unknown, currentPath = \"\"): void => {\n if (!dataTree || typeof dataTree !== \"object\") return;\n\n for (const [key, data] of Object.entries(dataTree as Record<string, unknown>)) {\n const path = currentPath ? `${currentPath}.${key}` : key;\n const config = this.joinRelations.get(path);\n if (!config) continue;\n\n if (data === null) {\n attachLoadedRelation(model as object, key, null);\n continue;\n }\n\n const RelatedModel = resolveModelClass(config.model as string);\n if (!RelatedModel) continue;\n\n const childKeys = Array.from(this.joinRelations.keys())\n .filter((p) => p.startsWith(`${path}.`))\n .map((p) => p.split(\".\")[path.split(\".\").length]);\n\n if (config.type === \"hasMany\") {\n const rows = Array.isArray(data) ? data : [];\n const instances = rows.map((row: unknown) => {\n const rowData = { ...(row as object) } as Record<string, unknown>;\n for (const childKey of childKeys) delete rowData[childKey];\n return (RelatedModel as { hydrate: (d: unknown) => unknown }).hydrate(rowData);\n });\n\n attachLoadedRelation(model as object, key, instances as never);\n } else {\n const modelData = { ...(data as object) } as Record<string, unknown>;\n for (const childKey of childKeys) delete modelData[childKey];\n\n const relatedInstance = (RelatedModel as { hydrate: (d: unknown) => unknown }).hydrate(\n modelData,\n );\n attachNested(relatedInstance, data, path);\n\n attachLoadedRelation(model as object, key, relatedInstance as never);\n }\n }\n };\n\n records.forEach((model, index) => {\n const relationData = joinedData.get(index);\n if (relationData) attachNested(model, relationData);\n });\n }\n\n // ============================================================================\n // INTERNAL HELPERS\n // ============================================================================\n\n /**\n * Build a WHERE-only SQL fragment from `where*` operations on the current builder.\n * Used by DELETE / UPDATE / increment paths.\n */\n private buildFilter(): { sql: string; params: unknown[] } {\n const whereOps = this.operations.filter(\n (op) => op.type.includes(\"where\") || op.type.includes(\"Where\"),\n );\n\n if (whereOps.length === 0) return { sql: \"\", params: [] };\n\n const parser = new PostgresQueryParser({\n table: this.table,\n operations: toParserOps(whereOps),\n });\n\n const { query = \"\", bindings = [] } = parser.parse();\n const whereMatch = query.match(/WHERE .+$/);\n return { sql: whereMatch ? whereMatch[0] : \"\", params: bindings };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,351 @@
1
+ import { DriverQuery } from "../../contracts/query-builder.contract.mjs";
2
+ import { SqlDialectContract } from "../sql/sql-dialect.contract.mjs";
3
+
4
+ //#region ../../@warlock.js/cascade/src/drivers/postgres/postgres-query-parser.d.ts
5
+ /**
6
+ * Operation types supported by the query parser.
7
+ */
8
+ type PostgresOperationType = "where" | "orWhere" | "whereRaw" | "orWhereRaw" | "whereIn" | "whereNotIn" | "whereNull" | "whereNotNull" | "whereBetween" | "whereNotBetween" | "whereLike" | "whereNotLike" | "whereColumn" | "orWhereColumn" | "whereExists" | "whereNotExists" | "whereDate" | "whereDateBefore" | "whereDateAfter" | "whereDateBetween" | "whereJsonContains" | "whereJsonDoesntContain" | "whereFullText" | "select" | "selectRaw" | "deselect" | "join" | "leftJoin" | "rightJoin" | "innerJoin" | "fullJoin" | "crossJoin" | "joinRaw" | "orderBy" | "orderByRaw" | "groupBy" | "having" | "havingRaw" | "limit" | "offset" | "has" | "whereHas" | "doesntHave" | "whereDoesntHave" | "selectRelatedColumns" | "distinct";
9
+ /**
10
+ * Internal operation representation.
11
+ */
12
+ type PostgresParserOperation = {
13
+ /** Operation type */readonly type: PostgresOperationType; /** Operation data/parameters */
14
+ readonly data: Record<string, unknown>;
15
+ };
16
+ /**
17
+ * Parser configuration options.
18
+ */
19
+ type PostgresParserOptions = {
20
+ /** Target table name */readonly table: string; /** Table alias (optional) */
21
+ readonly alias?: string; /** Operations to parse */
22
+ readonly operations: PostgresParserOperation[]; /** SQL dialect for syntax generation */
23
+ readonly dialect?: SqlDialectContract; /** Factory for creating sub-parsers (for nested queries) */
24
+ readonly createSubParser?: (table: string) => PostgresQueryParser;
25
+ };
26
+ /**
27
+ * PostgreSQL Query Parser.
28
+ *
29
+ * Converts a list of query operations into a SQL query string with parameters.
30
+ * Handles SELECT, WHERE, JOIN, ORDER BY, GROUP BY, LIMIT/OFFSET clauses.
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * const parser = new PostgresQueryParser({
35
+ * table: 'users',
36
+ * operations: [
37
+ * { type: 'where', data: { field: 'name', operator: '=', value: 'Alice' } },
38
+ * { type: 'orderBy', data: { field: 'createdAt', direction: 'desc' } },
39
+ * { type: 'limit', data: { value: 10 } }
40
+ * ]
41
+ * });
42
+ *
43
+ * const { sql, params } = parser.parse();
44
+ * // sql: 'SELECT * FROM "users" WHERE "name" = $1 ORDER BY "createdAt" DESC LIMIT 10'
45
+ * // params: ['Alice']
46
+ * ```
47
+ */
48
+ declare class PostgresQueryParser {
49
+ /**
50
+ * Target table name.
51
+ */
52
+ private readonly table;
53
+ /**
54
+ * Table alias.
55
+ */
56
+ private readonly alias?;
57
+ /**
58
+ * Operations to process.
59
+ */
60
+ private readonly operations;
61
+ /**
62
+ * SQL dialect for syntax.
63
+ */
64
+ private readonly dialect;
65
+ /**
66
+ * Current parameter index (1-based for PostgreSQL).
67
+ */
68
+ private paramIndex;
69
+ /**
70
+ * Collected parameters.
71
+ */
72
+ private readonly params;
73
+ /**
74
+ * SELECT columns.
75
+ */
76
+ selectColumns: string[];
77
+ /**
78
+ * Deselected (excluded) columns.
79
+ */
80
+ private deselectColumns;
81
+ /**
82
+ * Raw SELECT expressions.
83
+ */
84
+ private selectRaw;
85
+ /**
86
+ * WHERE clauses.
87
+ */
88
+ whereClauses: string[];
89
+ /**
90
+ * JOIN clauses.
91
+ */
92
+ private joinClauses;
93
+ /**
94
+ * ORDER BY clauses.
95
+ */
96
+ orderClauses: string[];
97
+ /**
98
+ * GROUP BY columns.
99
+ */
100
+ private groupColumns;
101
+ /**
102
+ * HAVING clauses.
103
+ */
104
+ private havingClauses;
105
+ /**
106
+ * LIMIT value.
107
+ */
108
+ limitValue?: number;
109
+ /**
110
+ * OFFSET value.
111
+ */
112
+ offsetValue?: number;
113
+ /**
114
+ * DISTINCT flag.
115
+ */
116
+ private isDistinct;
117
+ /**
118
+ * Whether the query has any JOIN operations (pre-scanned before processing).
119
+ * Used by qualifyColumn() to decide whether to prefix columns with the main table.
120
+ */
121
+ private hasJoins;
122
+ /**
123
+ * Tracked joined tables (for table reference detection).
124
+ */
125
+ private readonly joinedTables;
126
+ /**
127
+ * Create a new query parser.
128
+ *
129
+ * @param options - Parser configuration
130
+ */
131
+ constructor(options: PostgresParserOptions);
132
+ /**
133
+ * Parse all operations and build the SQL query.
134
+ *
135
+ * @returns DriverQuery with `query` (SQL string) and `bindings` (parameter values)
136
+ */
137
+ parse(): DriverQuery;
138
+ /**
139
+ * Get a formatted string representation of the query.
140
+ *
141
+ * @returns Formatted SQL with bindings
142
+ */
143
+ toPrettyString(): string;
144
+ /**
145
+ * Process a single operation.
146
+ *
147
+ * @param operation - The operation to process
148
+ */
149
+ private processOperation;
150
+ /**
151
+ * Build the final SQL query from collected clauses.
152
+ *
153
+ * @returns Complete SQL query string
154
+ */
155
+ private buildSql;
156
+ /**
157
+ * Build the SELECT clause.
158
+ *
159
+ * @returns SELECT clause string
160
+ */
161
+ private buildSelectClause;
162
+ /**
163
+ * Add a placeholder and parameter.
164
+ *
165
+ * @param value - Parameter value
166
+ * @returns Placeholder string ($1, $2, etc.)
167
+ */
168
+ private addParam;
169
+ /**
170
+ * Absorb a sub-parser's params into this parser, returning a rewriter
171
+ * function that translates the sub-parser's `$N` placeholders into freshly
172
+ * numbered placeholders in this parser's namespace.
173
+ *
174
+ * Required whenever sub-parser SQL fragments (e.g. WHERE clauses produced
175
+ * for a `joinWith` constraint) are spliced into the outer query — without
176
+ * the rewrite the embedded `$N` references point at parameters this
177
+ * parser has no knowledge of, leaving them dangling in the final SQL.
178
+ *
179
+ * The sub-parser's `params[i]` corresponds to its `$(i+1)` placeholder
180
+ * (its `paramIndex` always starts at 1), so we map sequentially.
181
+ *
182
+ * @example
183
+ * const renumber = this.absorbSubParserParams(subParser);
184
+ * const fragment = renumber(subParser.whereClauses.join(" "));
185
+ */
186
+ private absorbSubParserParams;
187
+ /**
188
+ * Process a basic WHERE operation.
189
+ *
190
+ * Delegates to specialised processors for operators that require more than a
191
+ * single placeholder (between, in, like-variants, exists, etc.).
192
+ */
193
+ private processWhere;
194
+ /**
195
+ * Process a raw WHERE operation.
196
+ */
197
+ private processWhereRaw;
198
+ /**
199
+ * Process WHERE IN / NOT IN.
200
+ */
201
+ private processWhereIn;
202
+ /**
203
+ * Process WHERE NULL / NOT NULL.
204
+ */
205
+ private processWhereNull;
206
+ /**
207
+ * Process WHERE BETWEEN / NOT BETWEEN.
208
+ */
209
+ private processWhereBetween;
210
+ /**
211
+ * Process WHERE LIKE / NOT LIKE.
212
+ */
213
+ private processWhereLike;
214
+ /**
215
+ * Process WHERE column comparison.
216
+ */
217
+ private processWhereColumn;
218
+ /**
219
+ * Process WHERE JSON contains.
220
+ */
221
+ private processWhereJsonContains;
222
+ /**
223
+ * Process full-text search WHERE.
224
+ */
225
+ private processWhereFullText;
226
+ /**
227
+ * Process SELECT operation.
228
+ */
229
+ private processSelect;
230
+ /**
231
+ * Process raw SELECT expression.
232
+ */
233
+ private processSelectRaw;
234
+ /**
235
+ * Process DESELECT operation.
236
+ */
237
+ private processDeselect;
238
+ /**
239
+ * Process SELECT for related columns (joinWith).
240
+ *
241
+ * - hasOne / belongsTo → LEFT JOIN + row_to_json (single object)
242
+ * - hasMany → correlated subquery with json_agg (array, no row explosion)
243
+ *
244
+ * @example hasMany correlated subquery:
245
+ * (SELECT json_agg(row_to_json(a.*))
246
+ * FROM "chat_message_actions" a
247
+ * WHERE a."chat_message_id" = "chat_messages"."id") AS "actions"
248
+ *
249
+ * @example hasOne/belongsTo row_to_json:
250
+ * row_to_json("organizationAiModel".*) AS "organizationAiModel"
251
+ */
252
+ private processSelectRelatedColumns;
253
+ /**
254
+ * Process JOIN operation with smart field detection.
255
+ *
256
+ * Handles both regular columns and JSONB nested paths:
257
+ * - "id" → "table"."id" (auto-prefixed)
258
+ * - "users.id" → "users"."id" (explicit table)
259
+ * - "createdBy.id" → "table"."createdBy"->>'id' (JSONB path)
260
+ * - "posts.createdBy.id" → "posts"."createdBy"->>'id' (JSONB with table)
261
+ */
262
+ private processJoin;
263
+ /**
264
+ * Parse a column identifier with smart detection for table prefixes and JSONB paths.
265
+ *
266
+ * Supports an optional explicit cast suffix using PostgreSQL's `::type` syntax,
267
+ * which is the only way to coerce a JSONB-extracted value (always returned as
268
+ * `text`) into another type. The parser does NOT infer casts from key names —
269
+ * coercion is always opt-in by the caller.
270
+ *
271
+ * @param field - The field string. Examples:
272
+ * - "id" → `"table"."id"`
273
+ * - "users.id" → `"users"."id"`
274
+ * - "createdBy.id" → `"table"."createdBy"->>'id'`
275
+ * - "createdBy.id::int" → `("table"."createdBy"->>'id')::int`
276
+ * - "meta.score::numeric" → `("table"."meta"->>'score')::numeric`
277
+ * - "posts.createdBy.id::uuid" → `("posts"."createdBy"->>'id')::uuid`
278
+ * @param defaultTable - Default table to use if no prefix
279
+ * @param tableAlias - Table alias to use if provided
280
+ * @returns Properly quoted SQL expression
281
+ */
282
+ private parseColumnIdentifier;
283
+ /**
284
+ * Check if a string is a table reference (main table or join table).
285
+ */
286
+ private isTableReference;
287
+ /**
288
+ * Build a JSONB path expression.
289
+ *
290
+ * @param table - Table name
291
+ * @param column - JSONB column name
292
+ * @param path - Array of nested keys
293
+ * @returns PostgreSQL JSONB path expression
294
+ *
295
+ * Returns the raw JSONB path expression — extracted values are always `text`
296
+ * (`->>` returns text). Callers that need a different type must request an
297
+ * explicit cast via the `::type` suffix in `parseColumnIdentifier`.
298
+ *
299
+ * @example
300
+ * buildJsonbPath("posts", "createdBy", ["id"])
301
+ * // Returns: "posts"."createdBy"->>'id'
302
+ *
303
+ * buildJsonbPath("posts", "createdBy", ["address", "city"])
304
+ * // Returns: "posts"."createdBy"->'address'->>'city'
305
+ */
306
+ private buildJsonbPath;
307
+ /**
308
+ * Process CROSS JOIN operation.
309
+ */
310
+ private processCrossJoin;
311
+ /**
312
+ * Process raw JOIN expression.
313
+ */
314
+ private processJoinRaw;
315
+ /**
316
+ * Process ORDER BY operation.
317
+ */
318
+ private processOrderBy;
319
+ /**
320
+ * Process raw ORDER BY expression.
321
+ */
322
+ private processOrderByRaw;
323
+ /**
324
+ * Process GROUP BY operation.
325
+ */
326
+ private processGroupBy;
327
+ /**
328
+ * Process HAVING operation.
329
+ */
330
+ private processHaving;
331
+ /**
332
+ * Process a raw HAVING expression, threading `?` placeholders into
333
+ * positional params the same way `processWhereRaw` / `processSelectRaw` do.
334
+ * Without this, bindings on a `havingRaw` op are silently dropped.
335
+ */
336
+ private processHavingRaw;
337
+ /**
338
+ * Add a WHERE clause with boolean operator.
339
+ */
340
+ private addWhereClause;
341
+ /**
342
+ * Map simple Cascade operators to their SQL equivalents.
343
+ *
344
+ * Complex operators (between, in, like-variants, exists) are handled by
345
+ * dedicated processors and should never reach this method.
346
+ */
347
+ private mapOperator;
348
+ }
349
+ //#endregion
350
+ export { PostgresOperationType, PostgresParserOperation, PostgresParserOptions, PostgresQueryParser };
351
+ //# sourceMappingURL=postgres-query-parser.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-query-parser.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/drivers/postgres/postgres-query-parser.ts"],"mappings":";;;;;;;KAsBY,qBAAA;;;;KA4DA,uBAAA;EAUA,8BARD,IAAA,EAAM,qBAAA;WAEN,IAAA,EAAM,MAAM;AAAA;;;;KAMX,qBAAA;EAID,iCAFA,KAAA,UAIY;EAAA,SAFZ,KAAA,WAIU;EAAA,SAFV,UAAA,EAAY,uBAAA,IAIO;EAAA,SAFnB,OAAA,GAAU,kBAAA,EAE8C;EAAA,SAAxD,eAAA,IAAmB,KAAA,aAAkB,mBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;cAyBnC,mBAAA;EAsGiB;;;EAAA,iBAlGX,KAAA;EA0JV;;;EAAA,iBArJU,KAAA;EA4XT;;;EAAA,iBAvXS,UAAA;EA8dT;;;EAAA,iBAzdS,OAAA;EA+gBT;;;EAAA,QA1gBA,UAAA;EAykBA;;;EAAA,iBApkBS,MAAA;EA+yBT;;;EA1yBD,aAAA;EA05BC;;;EAAA,QAr5BA,eAAA;EAu8BA;;;EAAA,QAl8BA,SAAA;EA8+BW;AAAA;;EAz+BZ,YAAA;;;;UAKC,WAAA;;;;EAKD,YAAA;;;;UAKC,YAAA;;;;UAKA,aAAA;;;;EAKD,UAAA;;;;EAKA,WAAA;;;;UAKC,UAAA;;;;;UAMA,QAAA;;;;mBAKS,YAAA;;;;;;cAOE,OAAA,EAAS,qBAAA;;;;;;EAYrB,KAAA,CAAA,GAAS,WAAW;;;;;;EA4CpB,cAAA,CAAA;;;;;;UAUC,gBAAA;;;;;;UAyIA,QAAA;;;;;;UAqDA,iBAAA;;;;;;;UA+BA,QAAA;;;;;;;;;;;;;;;;;;UAsBA,qBAAA;;;;;;;UAqBA,YAAA;;;;UA4CA,eAAA;;;;UAgBA,cAAA;;;;UAcA,gBAAA;;;;UAUA,mBAAA;;;;UAeA,gBAAA;;;;UAeA,kBAAA;;;;UAeA,wBAAA;;;;UAcA,oBAAA;;;;UAgBA,aAAA;;;;UAkBA,gBAAA;;;;UAsBA,eAAA;;;;;;;;;;;;;;;UAmBA,2BAAA;;;;;;;;;;UAoHA,WAAA;;;;;;;;;;;;;;;;;;;;UA8EA,qBAAA;;;;UAiDA,gBAAA;;;;;;;;;;;;;;;;;;;;UA+BA,cAAA;;;;UAuBA,gBAAA;;;;UASA,cAAA;;;;UAeA,cAAA;;;;UAWA,iBAAA;;;;UAeA,cAAA;;;;UASA,aAAA;;;;;;UAgBA,gBAAA;;;;UAcA,cAAA;;;;;;;UAcA,WAAA;AAAA"}