@warlock.js/cascade 4.0.171 → 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":"mongodb-query-builder.mjs","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/drivers/mongodb/mongodb-query-builder.ts"],"sourcesContent":["/* eslint-disable no-case-declarations */\r\nimport { GenericObject, get } from \"@mongez/reinforcements\";\r\nimport type { AggregateOptions, ClientSession, Collection } from \"mongodb\";\r\nimport { databaseTransactionContext } from \"../../context/database-transaction-context\";\r\nimport type {\r\n CursorPaginationOptions,\r\n CursorPaginationResult,\r\n DriverQuery,\r\n GroupByInput,\r\n HavingInput,\r\n JoinOptions,\r\n OrderDirection,\r\n PaginationOptions,\r\n PaginationResult,\r\n QueryBuilderContract,\r\n RawExpression,\r\n WhereCallback,\r\n WhereObject,\r\n WhereOperator,\r\n} from \"../../contracts\";\r\nimport { type DataSource } from \"../../data-source/data-source\";\r\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\r\nimport { QueryBuilder } from \"../../query-builder/query-builder\";\r\nimport { type MongoDbDriver } from \"./mongodb-driver\";\r\nimport { MongoQueryOperations } from \"./mongodb-query-operations\";\r\nimport { MongoQueryParser } from \"./mongodb-query-parser\";\r\nimport type { Operation } from \"./types\";\r\n\r\n/**\r\n * MongoDB-specific query builder implementation using aggregation pipeline.\r\n */\r\nexport class MongoQueryBuilder<T = unknown>\r\n extends QueryBuilder<T>\r\n implements QueryBuilderContract<T>\r\n{\r\n /**\r\n * Ordered list of operations to be converted to MongoDB aggregation pipeline.\r\n * Public to allow parser access. Uses MongoDB's own Operation type.\r\n *\r\n * NOTE: This shadows the base `operations: Op[]` field intentionally — the Mongo\r\n * Operation type carries an extra `stage` discriminator used by the pipeline assembler.\r\n */\r\n public override operations: Operation[] = [];\r\n\r\n /**\r\n * Data source instance\r\n */\r\n public readonly dataSource: DataSource;\r\n\r\n /**\r\n * Lazy-loaded operations helper for constructing pipeline operations.\r\n */\r\n protected _operationsHelper?: MongoQueryOperations;\r\n\r\n public hydrateCallback?: (data: any, index: number) => any;\r\n\r\n private fetchingCallback?: (query: this) => void | Promise<void>;\r\n private hydratingCallback?: (records: any[], context: any) => void | Promise<void>;\r\n private fetchedCallback?: (records: any[], context: any) => void | Promise<void>;\r\n\r\n // scopesApplied, pendingGlobalScopes, availableLocalScopes, disabledGlobalScopes\r\n // are inherited from QueryBuilder base class.\r\n\r\n /**\r\n * Create a new query builder for the given collection.\r\n * @param collection - The MongoDB collection to query\r\n */\r\n public constructor(\r\n public readonly table: string,\r\n dataSource?: DataSource,\r\n ) {\r\n super();\r\n this.dataSource = dataSource || dataSourceRegistry.get()!;\r\n // TODO: Trigger the fetching event\r\n }\r\n\r\n /**\r\n * Gets the operations helper instance, creating it if needed.\r\n * @returns The operations helper instance\r\n */\r\n protected get operationsHelper(): MongoQueryOperations {\r\n if (!this._operationsHelper) {\r\n this._operationsHelper = new MongoQueryOperations(this.operations);\r\n }\r\n return this._operationsHelper;\r\n }\r\n\r\n /**\r\n * Get collection instance\r\n */\r\n public get collection(): Collection {\r\n const driver = this.dataSource.driver as MongoDbDriver;\r\n\r\n return driver.database!.collection(this.table);\r\n }\r\n\r\n /**\r\n * Add hydrate callback function\r\n */\r\n public hydrate(callback: (data: any, index: number) => any): this {\r\n this.hydrateCallback = callback;\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a callback to be invoked before query execution\r\n * @returns Unsubscribe function to remove the callback\r\n */\r\n public onFetching(callback: (query: this) => void | Promise<void>): () => void {\r\n this.fetchingCallback = callback;\r\n return () => {\r\n this.fetchingCallback = undefined;\r\n };\r\n }\r\n\r\n /**\r\n * Register a callback to be invoked after records are fetched but before hydration\r\n * @returns Unsubscribe function to remove the callback\r\n */\r\n public onHydrating(callback: (records: any[], context: any) => void | Promise<void>): () => void {\r\n this.hydratingCallback = callback;\r\n return () => {\r\n this.hydratingCallback = undefined;\r\n };\r\n }\r\n\r\n /**\r\n * Register a callback to be invoked after records are fetched and hydrated\r\n * @returns Unsubscribe function to remove the callback\r\n */\r\n public onFetched(callback: (records: any[], context: any) => void | Promise<void>): () => void {\r\n this.fetchedCallback = callback;\r\n return () => {\r\n this.fetchedCallback = undefined;\r\n };\r\n }\r\n\r\n /**\r\n * Disable one or more global scopes for this query\r\n */\r\n public withoutGlobalScope(...scopeNames: string[]): this {\r\n scopeNames.forEach((name) => this.disabledGlobalScopes.add(name));\r\n return this;\r\n }\r\n\r\n /**\r\n * Disable all global scopes for this query\r\n */\r\n public withoutGlobalScopes(): this {\r\n if (this.pendingGlobalScopes) {\r\n this.pendingGlobalScopes.forEach((_, name) => {\r\n this.disabledGlobalScopes.add(name);\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply a local scope to this query\r\n */\r\n public scope(scopeName: string, ...args: any[]): this {\r\n if (!this.availableLocalScopes) {\r\n throw new Error(`No local scopes available`);\r\n }\r\n\r\n const scopeCallback = this.availableLocalScopes.get(scopeName);\r\n if (!scopeCallback) {\r\n throw new Error(`Local scope \"${scopeName}\" not found`);\r\n }\r\n\r\n // Apply scope immediately (not deferred)\r\n scopeCallback(this, ...args);\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply pending global scopes before query execution\r\n */\r\n private applyPendingScopes(): void {\r\n if (!this.pendingGlobalScopes || this.scopesApplied) {\r\n return;\r\n }\r\n\r\n const beforeOps: any[] = [];\r\n const afterOps: any[] = [];\r\n\r\n for (const [name, { callback, timing }] of this.pendingGlobalScopes) {\r\n // Skip disabled scopes\r\n if (this.disabledGlobalScopes.has(name)) {\r\n continue;\r\n }\r\n\r\n // Create temporary query builder to capture operations\r\n const tempBuilder = new MongoQueryBuilder(this.table, this.dataSource);\r\n callback(tempBuilder);\r\n\r\n // Collect operations based on timing\r\n if (timing === \"before\") {\r\n beforeOps.push(...tempBuilder.operations);\r\n } else {\r\n afterOps.push(...tempBuilder.operations);\r\n }\r\n }\r\n\r\n // Apply: before scopes + user operations + after scopes\r\n this.operations = [...beforeOps, ...this.operations, ...afterOps];\r\n this.scopesApplied = true;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - BASIC\r\n // ============================================================================\r\n\r\n /**\r\n * Adds a WHERE clause to filter documents. Supports equality, operators, objects, or callbacks.\r\n * @param field - Field name, or conditions object, or callback\r\n * @param operator - Comparison operator\r\n * @param value - Value to compare\r\n */\r\n public where(field: string, value: unknown): this;\r\n public where(field: string, operator: WhereOperator, value: unknown): this;\r\n public where(conditions: WhereObject): this;\r\n public where(callback: WhereCallback<T>): this;\r\n public where(...args: any[]): this {\r\n this.addWhereClause(\"where\", args);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an OR WHERE clause. Works like where() but uses OR logic.\r\n * @param field - Field name, or conditions object, or callback\r\n * @param operator - Comparison operator\r\n * @param value - Value to compare\r\n */\r\n public orWhere(field: string, value: unknown): this;\r\n public orWhere(field: string, operator: WhereOperator, value: unknown): this;\r\n public orWhere(conditions: WhereObject): this;\r\n public orWhere(callback: WhereCallback<T>): this;\r\n public orWhere(...args: any[]): this {\r\n this.addWhereClause(\"orWhere\", args);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a raw WHERE clause using MongoDB's native query syntax.\r\n * @param expression - Raw MongoDB expression\r\n * @param bindings - Optional parameter bindings for string expressions\r\n */\r\n public whereRaw(expression: RawExpression, bindings?: unknown[]): this {\r\n return this.addRawWhere(\"whereRaw\", expression, bindings);\r\n }\r\n\r\n /**\r\n * Adds a raw OR WHERE clause using MongoDB's native query syntax.\r\n * @param expression - Raw MongoDB expression\r\n * @param bindings - Optional parameter bindings\r\n */\r\n public orWhereRaw(expression: RawExpression, bindings?: unknown[]): this {\r\n return this.addRawWhere(\"orWhereRaw\", expression, bindings);\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - COLUMN COMPARISONS\r\n // ============================================================================\r\n\r\n /**\r\n * Adds a WHERE clause comparing two columns/fields directly.\r\n * @param first - The first field name\r\n * @param operator - The comparison operator\r\n * @param second - The second field name\r\n */\r\n public whereColumn(first: string, operator: WhereOperator, second: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereColumn\", {\r\n first,\r\n operator,\r\n second,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an OR WHERE clause comparing two columns/fields directly.\r\n * @param first - The first field name\r\n * @param operator - The comparison operator\r\n * @param second - The second field name\r\n */\r\n public orWhereColumn(first: string, operator: WhereOperator, second: string): this {\r\n this.operationsHelper.addMatchOperation(\"orWhereColumn\", {\r\n first,\r\n operator,\r\n second,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds multiple column comparison clauses at once.\r\n * @param comparisons - Array of tuples [leftField, operator, rightField]\r\n */\r\n public whereColumns(\r\n comparisons: Array<[left: string, operator: WhereOperator, right: string]>,\r\n ): this {\r\n for (const [left, operator, right] of comparisons) {\r\n this.whereColumn(left, operator, right);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value falls between two other fields.\r\n * @param field - The field to check\r\n * @param lowerColumn - The field defining the lower bound\r\n * @param upperColumn - The field defining the upper bound\r\n */\r\n public whereBetweenColumns(field: string, lowerColumn: string, upperColumn: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereBetweenColumns\", {\r\n field,\r\n lowerColumn,\r\n upperColumn,\r\n });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - DATE OPERATIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents where a date field matches the given date (ignoring time).\r\n * @param field - The date field name\r\n * @param value - The date to match\r\n */\r\n public whereDate(field: string, value: Date | string): this {\r\n this.operationsHelper.addMatchOperation(\"whereDate\", { field, value });\r\n return this;\r\n }\r\n\r\n /**\r\n * Alias for `whereDate()`. Filters by exact date match (ignoring time).\r\n * @param field - The date field name\r\n * @param value - The date to match\r\n */\r\n public whereDateEquals(field: string, value: Date | string): this {\r\n this.operationsHelper.addMatchOperation(\"whereDateEquals\", {\r\n field,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a date field is before the given date.\r\n * @param field - The date field name\r\n * @param value - The cutoff date\r\n */\r\n public whereDateBefore(field: string, value: Date | string): this {\r\n this.operationsHelper.addMatchOperation(\"whereDateBefore\", {\r\n field,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a date field is after the given date.\r\n * @param field - The date field name\r\n * @param value - The cutoff date\r\n */\r\n public whereDateAfter(field: string, value: Date | string): this {\r\n this.operationsHelper.addMatchOperation(\"whereDateAfter\", { field, value });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a time field matches the given time (HH:MM:SS format).\r\n * @param field - The time/datetime field name\r\n * @param value - The time string in HH:MM:SS format\r\n */\r\n public whereTime(field: string, value: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereTime\", { field, value });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where the day of the month matches the given value (1-31).\r\n * @param field - The date field name\r\n * @param value - The day of the month\r\n */\r\n public whereDay(field: string, value: number): this {\r\n this.operationsHelper.addMatchOperation(\"whereDay\", { field, value });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where the month matches the given value (1-12).\r\n * @param field - The date field name\r\n * @param value - The month number\r\n */\r\n public whereMonth(field: string, value: number): this {\r\n this.operationsHelper.addMatchOperation(\"whereMonth\", { field, value });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where the year matches the given value.\r\n * @param field - The date field name\r\n * @param value - The year\r\n */\r\n public whereYear(field: string, value: number): this {\r\n this.operationsHelper.addMatchOperation(\"whereYear\", { field, value });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - JSON OPERATIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents where a JSON field contains the specified value.\r\n * @param path - The JSON path to check\r\n * @param value - The value to search for\r\n */\r\n public whereJsonContains(path: string, value: unknown): this {\r\n this.operationsHelper.addMatchOperation(\"whereJsonContains\", {\r\n path,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a JSON field does NOT contain the specified value.\r\n * @param path - The JSON path to check\r\n * @param value - The value to exclude\r\n */\r\n public whereJsonDoesntContain(path: string, value: unknown): this {\r\n this.operationsHelper.addMatchOperation(\"whereJsonDoesntContain\", {\r\n path,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a JSON field contains a specific key.\r\n * @param path - The JSON path to check for key existence\r\n */\r\n public whereJsonContainsKey(path: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereJsonContainsKey\", { path });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a JSON array or string has a specific length.\r\n * @param path - The JSON path to check\r\n * @param operator - The comparison operator\r\n * @param value - The length value to compare against\r\n */\r\n public whereJsonLength(path: string, operator: WhereOperator, value: number): this {\r\n this.operationsHelper.addMatchOperation(\"whereJsonLength\", {\r\n path,\r\n operator,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a JSON field is an array.\r\n * @param path - The JSON path to check\r\n */\r\n public whereJsonIsArray(path: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereJsonIsArray\", { path });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a JSON field is an object.\r\n * @param path - The JSON path to check\r\n */\r\n public whereJsonIsObject(path: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereJsonIsObject\", { path });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where an array field has a specific length.\r\n * @param field - The array field name\r\n * @param operator - The comparison operator\r\n * @param value - The length value to compare against\r\n */\r\n public whereArrayLength(field: string, operator: WhereOperator, value: number): this {\r\n this.operationsHelper.addMatchOperation(\"whereArrayLength\", {\r\n field,\r\n operator,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - CONVENIENCE METHODS\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents by ID (convenience method for `where(\"id\", value)`).\r\n * @param value - The ID value to match\r\n */\r\n public whereId(value: string | number): this {\r\n return this.where(\"id\", value);\r\n }\r\n\r\n /**\r\n * Filters documents by multiple IDs (convenience method for `whereIn(\"id\", values)`).\r\n * @param values - Array of ID values to match\r\n */\r\n public whereIds(values: Array<string | number>): this {\r\n return this.whereIn(\"id\", values);\r\n }\r\n\r\n /**\r\n * Filters documents by UUID (convenience method for `where(\"uuid\", value)`).\r\n * @param value - The UUID string to match\r\n */\r\n public whereUuid(value: string): this {\r\n return this.where(\"uuid\", value);\r\n }\r\n\r\n /**\r\n * Filters documents by ULID (convenience method for `where(\"ulid\", value)`).\r\n * @param value - The ULID string to match\r\n */\r\n public whereUlid(value: string): this {\r\n return this.where(\"ulid\", value);\r\n }\r\n\r\n /**\r\n * Performs full-text search on one or more fields.\r\n * @param fields - Field name or array of field names to search\r\n * @param query - The search query string\r\n */\r\n public whereFullText(fields: string | string[], query: string): this {\r\n const filters = typeof fields === \"string\" ? { fields: [fields] } : { fields: fields ?? [] };\r\n this.operationsHelper.addMatchOperation(\"whereFullText\", {\r\n fields: filters.fields,\r\n query,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs full-text search with OR logic.\r\n * @param fields - Field name or array of field names to search\r\n * @param query - The search query string\r\n */\r\n public orWhereFullText(fields: string | string[], query: string): this {\r\n const filters = typeof fields === \"string\" ? { fields: [fields] } : { fields: fields ?? [] };\r\n this.operationsHelper.addMatchOperation(\"orWhereFullText\", {\r\n fields: filters.fields,\r\n query,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Alias for `whereFullText()` with a single field.\r\n * @param field - The field name to search\r\n * @param query - The search query string\r\n */\r\n public whereSearch(field: string, query: string): this {\r\n return this.whereFullText(field, query);\r\n }\r\n\r\n /**\r\n * Negates a set of conditions using a callback.\r\n * @param callback - Callback function defining conditions to negate\r\n */\r\n public whereNot(callback: WhereCallback<T>): this {\r\n this.operationsHelper.addMatchOperation(\"where:not\", { callback });\r\n return this;\r\n }\r\n\r\n /**\r\n * Negates a set of conditions with OR logic.\r\n * @param callback - Callback function defining conditions to negate\r\n */\r\n public orWhereNot(callback: WhereCallback<T>): this {\r\n this.operationsHelper.addMatchOperation(\"orWhere:not\", { callback });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - COMPARISON OPERATORS\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents where a field's value matches any value in the given array.\r\n * @param field - The field name to check\r\n * @param values - Array of values to match against\r\n */\r\n public whereIn(field: string, values: unknown[]): this {\r\n this.operationsHelper.addMatchOperation(\"whereIn\", { field, values });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value does NOT match any value in the array.\r\n * @param field - The field name to check\r\n * @param values - Array of values to exclude\r\n */\r\n public whereNotIn(field: string, values: unknown[]): this {\r\n this.operationsHelper.addMatchOperation(\"whereNotIn\", { field, values });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value is null or undefined.\r\n * @param field - The field name to check\r\n */\r\n public whereNull(field: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereNull\", { field });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value is NOT null or undefined.\r\n * @param field - The field name to check\r\n */\r\n public whereNotNull(field: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereNotNull\", { field });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value falls within the given range (inclusive).\r\n * @param field - The field name to check\r\n * @param range - Tuple of [min, max] values\r\n */\r\n public whereBetween(field: string, range: [unknown, unknown]): this {\r\n this.operationsHelper.addMatchOperation(\"whereBetween\", { field, range });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value is NOT within the given range.\r\n * @param field - The field name to check\r\n * @param range - Tuple of [min, max] values to exclude\r\n */\r\n public whereNotBetween(field: string, range: [unknown, unknown]): this {\r\n this.operationsHelper.addMatchOperation(\"whereNotBetween\", {\r\n field,\r\n range,\r\n });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - PATTERN MATCHING\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents where a field matches the given pattern (case-insensitive).\r\n * @param field - The field name to search\r\n * @param pattern - The pattern to match\r\n */\r\n public whereLike(field: string, pattern: RegExp | string): this {\r\n this.operationsHelper.addMatchOperation(\"whereLike\", { field, pattern });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field does NOT match the given pattern.\r\n * @param field - The field name to search\r\n * @param pattern - The pattern to exclude\r\n */\r\n public whereNotLike(field: string, pattern: RegExp | string): this {\r\n this.operationsHelper.addMatchOperation(\"whereNotLike\", { field, pattern });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value starts with the given prefix.\r\n * @param field - The field name to check\r\n * @param value - The prefix to match\r\n */\r\n public whereStartsWith(field: string, value: string | number): this {\r\n this.operationsHelper.addMatchOperation(\"whereStartsWith\", {\r\n field,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value does NOT start with the given prefix.\r\n * @param field - The field name to check\r\n * @param value - The prefix to exclude\r\n */\r\n public whereNotStartsWith(field: string, value: string | number): this {\r\n this.operationsHelper.addMatchOperation(\"whereNotStartsWith\", {\r\n field,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value ends with the given suffix.\r\n * @param field - The field name to check\r\n * @param value - The suffix to match\r\n */\r\n public whereEndsWith(field: string, value: string | number): this {\r\n this.operationsHelper.addMatchOperation(\"whereEndsWith\", { field, value });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field's value does NOT end with the given suffix.\r\n * @param field - The field name to check\r\n * @param value - The suffix to exclude\r\n */\r\n public whereNotEndsWith(field: string, value: string | number): this {\r\n this.operationsHelper.addMatchOperation(\"whereNotEndsWith\", {\r\n field,\r\n value,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a date field falls within the given date range.\r\n * @param field - The date field name\r\n * @param range - Tuple of [startDate, endDate]\r\n */\r\n public whereDateBetween(field: string, range: [Date, Date]): this {\r\n this.operationsHelper.addMatchOperation(\"whereDateBetween\", {\r\n field,\r\n range,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a date field is NOT within the given date range.\r\n * @param field - The date field name\r\n * @param range - Tuple of [startDate, endDate] to exclude\r\n */\r\n public whereDateNotBetween(field: string, range: [Date, Date]): this {\r\n this.operationsHelper.addMatchOperation(\"whereDateNotBetween\", {\r\n field,\r\n range,\r\n });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - EXISTENCE CHECKS\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents where a field exists (has any value including null).\r\n * @param field - The field name to check for existence\r\n * @param callback - Optional callback for subquery existence\r\n */\r\n public whereExists(field: string): this;\r\n public whereExists(callback: WhereCallback<T>): this;\r\n public whereExists(param: string | WhereCallback<T>): this {\r\n if (typeof param === \"function\") {\r\n this.operationsHelper.addMatchOperation(\"where:exists\", {\r\n callback: param,\r\n });\r\n return this;\r\n }\r\n\r\n this.operationsHelper.addMatchOperation(\"whereExists\", { field: param });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where a field does NOT exist in the document.\r\n * @param field - The field name to check for absence\r\n * @param callback - Optional callback for subquery non-existence\r\n */\r\n public whereNotExists(field: string): this;\r\n public whereNotExists(callback: WhereCallback<T>): this;\r\n public whereNotExists(param: string | WhereCallback<T>): this {\r\n if (typeof param === \"function\") {\r\n this.operationsHelper.addMatchOperation(\"where:notExists\", {\r\n callback: param,\r\n });\r\n return this;\r\n }\r\n\r\n this.operationsHelper.addMatchOperation(\"whereNotExists\", {\r\n field: param,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where an array field has a specific size.\r\n * @param field - The array field name\r\n * @param size - The exact size to match\r\n * @param operator - Optional comparison operator\r\n */\r\n public whereSize(field: string, size: number): this;\r\n public whereSize(field: string, operator: \">\" | \">=\" | \"=\" | \"<\" | \"<=\", size: number): this;\r\n public whereSize(field: string, ...args: any[]): this {\r\n if (args.length === 1) {\r\n this.operationsHelper.addMatchOperation(\"whereSize\", {\r\n field,\r\n operator: \"=\",\r\n size: args[0],\r\n });\r\n } else {\r\n this.operationsHelper.addMatchOperation(\"whereSize\", {\r\n field,\r\n operator: args[0],\r\n size: args[1],\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - FULL-TEXT SEARCH\r\n // ============================================================================\r\n\r\n /**\r\n * Performs a full-text search on the specified fields.\r\n * @param query - The search query string\r\n * @param filters - Optional additional filter conditions\r\n */\r\n public textSearch(query: string, filters?: WhereObject): this {\r\n this.operationsHelper.addMatchOperation(\"textSearch\", { query, filters });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // WHERE CLAUSES - ARRAY OPERATIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Filters documents where an array field contains the given value.\r\n * @param field - The array field name\r\n * @param value - The value to search for in the array\r\n * @param key - Optional key to check within array objects\r\n */\r\n public whereArrayContains(field: string, value: unknown, key?: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereArrayContains\", {\r\n field,\r\n value,\r\n key,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where an array field does NOT contain the given value.\r\n * @param field - The array field name\r\n * @param value - The value to exclude from the array\r\n * @param key - Optional key to check within array objects\r\n */\r\n public whereArrayNotContains(field: string, value: unknown, key?: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereArrayNotContains\", {\r\n field,\r\n value,\r\n key,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where an array field contains the value OR is empty.\r\n * @param field - The array field name\r\n * @param value - The value to search for\r\n * @param key - Optional key to check within array objects\r\n */\r\n public whereArrayHasOrEmpty(field: string, value: unknown, key?: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereArrayHasOrEmpty\", {\r\n field,\r\n value,\r\n key,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters documents where an array field does NOT contain the value AND is not empty.\r\n * @param field - The array field name\r\n * @param value - The value to exclude\r\n * @param key - Optional key to check within array objects\r\n */\r\n public whereArrayNotHaveOrEmpty(field: string, value: unknown, key?: string): this {\r\n this.operationsHelper.addMatchOperation(\"whereArrayNotHaveOrEmpty\", {\r\n field,\r\n value,\r\n key,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Internal helper for processing where clause arguments.\r\n * @param prefix - The operation prefix\r\n * @param args - The arguments passed to where/orWhere\r\n */\r\n protected addWhereClause(prefix: \"where\" | \"orWhere\", args: any[]): void {\r\n if (args.length === 1) {\r\n if (typeof args[0] === \"function\") {\r\n // Callback-based where\r\n this.operationsHelper.addMatchOperation(`${prefix}:callback`, args[0]);\r\n } else {\r\n // Object-based where\r\n this.operationsHelper.addMatchOperation(`${prefix}:object`, args[0]);\r\n }\r\n } else if (args.length === 2) {\r\n // Simple equality: where(field, value)\r\n this.operationsHelper.addMatchOperation(prefix, {\r\n field: args[0],\r\n operator: \"=\",\r\n value: args[1],\r\n });\r\n } else if (args.length === 3) {\r\n // With operator: where(field, operator, value)\r\n this.operationsHelper.addMatchOperation(prefix, {\r\n field: args[0],\r\n operator: args[1],\r\n value: args[2],\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Internal helper for adding raw where clauses.\r\n * @param type - The operation type\r\n * @param expression - The raw expression in MongoDB query language\r\n * @param bindings - Optional bindings for the expression\r\n */\r\n protected addRawWhere(\r\n type: \"whereRaw\" | \"orWhereRaw\",\r\n expression: RawExpression,\r\n bindings?: unknown[],\r\n ): this {\r\n this.operationsHelper.addMatchOperation(type, { expression, bindings });\r\n return this;\r\n }\r\n\r\n /**\r\n * Normalizes select field arguments into a structured format.\r\n * @param args - The arguments to normalize\r\n * @returns Normalized selection object with fields and aliases\r\n */\r\n protected normalizeSelectFields(args: any[]): {\r\n fields?: string[];\r\n projection?: Record<string, unknown>;\r\n } {\r\n // Single argument cases\r\n if (args.length === 1) {\r\n const arg = args[0];\r\n\r\n // Object format: { field: 1, field2: 0, field3: \"alias\", field4: true }\r\n if (typeof arg === \"object\" && !Array.isArray(arg)) {\r\n return { projection: arg };\r\n }\r\n\r\n // Array format: [\"field1\", \"field2\"]\r\n if (Array.isArray(arg)) {\r\n return { fields: arg };\r\n }\r\n\r\n // Single string: \"field\"\r\n if (typeof arg === \"string\") {\r\n return { fields: [arg] };\r\n }\r\n }\r\n\r\n // Multiple string arguments: select(\"field1\", \"field2\", \"field3\")\r\n return { fields: args.filter((arg) => typeof arg === \"string\") };\r\n }\r\n\r\n // ============================================================================\r\n // SELECT / PROJECTION\r\n // ============================================================================\r\n\r\n /**\r\n * Specifies which fields to include in the query results.\r\n * Supports arrays, multiple args, or object with aliases/inclusion/exclusion.\r\n * @param fields - Field names, array, or projection object\r\n */\r\n public select(fields: string[]): this;\r\n public select(fields: Record<string, 0 | 1 | boolean | string>): this;\r\n public select(...fields: string[]): this;\r\n public select(...args: any): this {\r\n const normalized = this.normalizeSelectFields(args);\r\n this.operationsHelper.addProjectOperation(\"select\", normalized);\r\n return this;\r\n }\r\n\r\n /**\r\n * Selects a field with an alias.\r\n * @param field - The field to select\r\n * @param alias - The alias name for the field\r\n * @returns The query builder instance\r\n */\r\n public selectAs(field: string, alias: string): this {\r\n return this.select({ [field]: alias });\r\n }\r\n\r\n /**\r\n * Adds a computed field using a raw MongoDB expression.\r\n * @param expression - The raw MongoDB expression\r\n * @param bindings - Optional parameter bindings for string expressions\r\n */\r\n public selectRaw(expression: RawExpression, bindings?: unknown[]): this {\r\n this.operationsHelper.addProjectOperation(\"selectRaw\", {\r\n expression,\r\n bindings,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds multiple computed fields using raw MongoDB expressions.\r\n * @param definitions - Array of field definitions with alias, expression, and optional bindings\r\n */\r\n public selectRawMany(\r\n definitions: Array<{\r\n alias: string;\r\n expression: RawExpression;\r\n bindings?: unknown[];\r\n }>,\r\n ): this {\r\n for (const definition of definitions) {\r\n this.selectRaw({ [definition.alias]: definition.expression }, definition.bindings);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a subquery as a computed field.\r\n * @param expression - The subquery expression\r\n * @param alias - The alias for the computed field\r\n */\r\n public selectSub(expression: RawExpression, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectSub\", {\r\n expression,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an additional subquery field to existing selections.\r\n * @param expression - The subquery expression\r\n * @param alias - The alias for the computed field\r\n */\r\n public addSelectSub(expression: RawExpression, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"addSelectSub\", {\r\n expression,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an aggregate value as a computed field.\r\n * @param field - The field to aggregate\r\n * @param aggregate - The aggregate function to apply\r\n * @param alias - The alias for the computed field\r\n */\r\n public selectAggregate(\r\n field: string,\r\n aggregate: \"sum\" | \"avg\" | \"min\" | \"max\" | \"count\" | \"first\" | \"last\",\r\n alias: string,\r\n ): this {\r\n this.operationsHelper.addProjectOperation(\"selectAggregate\", {\r\n field,\r\n aggregate,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a boolean field indicating whether a related document exists.\r\n * @param field - The field to check for existence\r\n * @param alias - The alias for the boolean field\r\n */\r\n public selectExists(field: string, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectExists\", {\r\n field,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a count field for a related collection.\r\n * @param field - The field to count\r\n * @param alias - The alias for the count field\r\n */\r\n public selectCount(field: string, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectCount\", { field, alias });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a CASE-like conditional field using multiple conditions.\r\n * @param cases - Array of when/then pairs\r\n * @param otherwise - Default value if no conditions match\r\n * @param alias - The alias for the computed field\r\n */\r\n public selectCase(\r\n cases: Array<{ when: RawExpression; then: RawExpression | unknown }>,\r\n otherwise: RawExpression | unknown,\r\n alias: string,\r\n ): this {\r\n this.operationsHelper.addProjectOperation(\"selectCase\", {\r\n cases,\r\n otherwise,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a simple conditional field (if/else).\r\n * @param condition - The condition to evaluate\r\n * @param thenValue - Value if condition is true\r\n * @param elseValue - Value if condition is false\r\n * @param alias - The alias for the computed field\r\n */\r\n public selectWhen(\r\n condition: RawExpression,\r\n thenValue: RawExpression | unknown,\r\n elseValue: RawExpression | unknown,\r\n alias: string,\r\n ): this {\r\n this.operationsHelper.addProjectOperation(\"selectWhen\", {\r\n condition,\r\n thenValue,\r\n elseValue,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Allows direct manipulation of the MongoDB projection object.\r\n * @param callback - Function that receives and modifies the projection object\r\n */\r\n public selectDriverProjection(callback: (projection: Record<string, unknown>) => void): this {\r\n this.operationsHelper.addProjectOperation(\"selectDriverProjection\", {\r\n callback,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Extracts a JSON field from a document.\r\n * @param path - The JSON path to extract\r\n * @param alias - Optional alias for the extracted field\r\n */\r\n public selectJson(path: string, alias?: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectJson\", { path, alias });\r\n return this;\r\n }\r\n\r\n /**\r\n * Extracts a JSON field using a raw MongoDB expression.\r\n * @param path - The JSON path\r\n * @param expression - The raw expression for extraction\r\n * @param alias - The alias for the extracted field\r\n */\r\n public selectJsonRaw(path: string, expression: RawExpression, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectJsonRaw\", {\r\n path,\r\n expression,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Excludes a JSON path from the results.\r\n * @param path - The JSON path to exclude\r\n */\r\n public deselectJson(path: string): this {\r\n this.operationsHelper.addProjectOperation(\"deselectJson\", { path });\r\n return this;\r\n }\r\n\r\n /**\r\n * Concatenates multiple fields into a single string field.\r\n * @param fields - Array of fields or expressions to concatenate\r\n * @param alias - The alias for the concatenated field\r\n */\r\n public selectConcat(fields: Array<string | RawExpression>, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectConcat\", {\r\n fields,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the first non-null value from a list of fields.\r\n * @param fields - Array of fields to check\r\n * @param alias - The alias for the coalesced field\r\n */\r\n public selectCoalesce(fields: Array<string | RawExpression>, alias: string): this {\r\n this.operationsHelper.addProjectOperation(\"selectCoalesce\", {\r\n fields,\r\n alias,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds window function operations to the query.\r\n * @param spec - The window function specification\r\n */\r\n public selectWindow(spec: RawExpression): this {\r\n this.operationsHelper.addOperation(\"$setWindowFields\", \"selectWindow\", { spec }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Excludes specific fields from the query results.\r\n * @param fields - Field names to exclude\r\n */\r\n public deselect(fields: string[]): this;\r\n public deselect(...fields: Array<string | string[]>): this;\r\n public deselect(...args: Array<string | string[]>): this {\r\n const fields = this.normalizeSelectFields(args);\r\n this.operationsHelper.addProjectOperation(\"deselect\", { fields });\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns only distinct values for the specified fields.\r\n * @param fields - Optional field names to use for distinctness\r\n */\r\n public distinctValues(fields?: string | string[]): this {\r\n this.operationsHelper.addGroupOperation(\"distinct\", { fields }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds additional fields to an existing selection.\r\n * @param fields - Additional field names to include\r\n */\r\n public addSelect(fields: string[]): this;\r\n public addSelect(...fields: Array<string | string[]>): this;\r\n public addSelect(...args: Array<string | string[]>): this {\r\n const fields = this.normalizeSelectFields(args);\r\n this.operationsHelper.addProjectOperation(\"addSelect\", { fields });\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all field selection restrictions.\r\n */\r\n public clearSelect(): this {\r\n this.operations = this.operations.filter((op) => op.stage !== \"$project\");\r\n return this;\r\n }\r\n\r\n /**\r\n * Alias for `clearSelect()`. Removes all field restrictions.\r\n */\r\n public selectAll(): this {\r\n return this.clearSelect();\r\n }\r\n\r\n /**\r\n * Alias for `clearSelect()`. Resets to default field selection.\r\n */\r\n public selectDefault(): this {\r\n return this.clearSelect();\r\n }\r\n\r\n // ============================================================================\r\n // ORDERING\r\n // ============================================================================\r\n\r\n /**\r\n * Orders the query results by a specific field or multiple fields.\r\n *\r\n * @param field - The field name to sort by, or an object with multiple fields\r\n * @param direction - The sort direction (only used when field is a string)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Single field\r\n * query.orderBy(\"createdAt\", \"desc\");\r\n *\r\n * // Multiple fields\r\n * query.orderBy({ id: \"asc\", age: \"desc\", createdAt: \"desc\" });\r\n * ```\r\n */\r\n public orderBy(field: string, direction?: OrderDirection): this;\r\n public orderBy(fields: Record<string, OrderDirection>): this;\r\n public orderBy(\r\n fieldOrFields: string | Record<string, OrderDirection>,\r\n direction: OrderDirection = \"asc\",\r\n ): this {\r\n if (typeof fieldOrFields === \"string\") {\r\n // Single field\r\n this.operationsHelper.addSortOperation(\"orderBy\", {\r\n field: fieldOrFields,\r\n direction,\r\n });\r\n } else {\r\n // Multiple fields - add each as a separate operation (they'll be merged)\r\n for (const [field, dir] of Object.entries(fieldOrFields)) {\r\n this.operationsHelper.addSortOperation(\"orderBy\", {\r\n field,\r\n direction: dir,\r\n });\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Orders the query results by a field in descending order.\r\n * @param field - The field name to sort by\r\n */\r\n public orderByDesc(field: string): this {\r\n return this.orderBy(field, \"desc\");\r\n }\r\n\r\n /**\r\n * Orders the query results using a raw MongoDB sort expression.\r\n * @param expression - The raw MongoDB sort expression\r\n * @param bindings - Optional parameter bindings\r\n */\r\n public orderByRaw(expression: RawExpression, bindings?: unknown[]): this {\r\n this.operationsHelper.addSortOperation(\"orderByRaw\", {\r\n expression,\r\n bindings,\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Orders the query results randomly.\r\n */\r\n public orderByRandom(limit: number = 1000): this {\r\n this.operationsHelper.addSortOperation(\"orderByRandom\", { limit }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Orders results by a date field in descending order (newest first).\r\n * @param column - The date column to sort by\r\n */\r\n public latest(column: string = \"createdAt\"): Promise<T[]> {\r\n return this.orderBy(column, \"desc\").get();\r\n }\r\n\r\n /**\r\n * Orders results by a date field in ascending order (oldest first).\r\n * @param column - The date column to sort by\r\n */\r\n public oldest(column: string = \"createdAt\"): this {\r\n return this.orderBy(column, \"asc\");\r\n }\r\n\r\n // ============================================================================\r\n // LIMITING / PAGINATION\r\n // ============================================================================\r\n\r\n /**\r\n * Limits the number of documents returned by the query.\r\n * @param value - The maximum number of documents to return\r\n */\r\n public limit(value: number): this {\r\n this.operationsHelper.addOperation(\"$limit\", \"limit\", { value }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Skips a specified number of documents in the query results.\r\n * @param value - The number of documents to skip\r\n */\r\n public skip(value: number): this {\r\n this.operationsHelper.addOperation(\"$skip\", \"skip\", { value }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Alias for `skip()`. Skips a specified number of documents.\r\n * @param value - The number of documents to skip\r\n */\r\n public offset(value: number): this {\r\n return this.skip(value);\r\n }\r\n\r\n /**\r\n * Alias for `limit()`. Limits the number of documents returned.\r\n * @param value - The maximum number of documents to return\r\n */\r\n public take(value: number): this {\r\n return this.limit(value);\r\n }\r\n\r\n /**\r\n * Applies cursor-based filtering for pagination.\r\n * @param after - Cursor value for forward pagination\r\n * @param before - Cursor value for backward pagination\r\n */\r\n public cursor(after?: unknown, before?: unknown): this {\r\n this.operationsHelper.addMatchOperation(\"cursor\", { after, before });\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // GROUPING / AGGREGATION\r\n // ============================================================================\r\n\r\n /**\r\n * Groups documents by one or more fields.\r\n *\r\n * @param fields - Field(s) to group by\r\n * @param aggregates - Optional aggregate operations to perform\r\n *\r\n * @example\r\n * ```typescript\r\n * import { $agg } from '@warlock.js/cascade';\r\n *\r\n * // Simple grouping\r\n * query.groupBy(\"type\");\r\n *\r\n * // Grouping with aggregates\r\n * query.groupBy(\"type\", {\r\n * count: $agg.count(),\r\n * total: $agg.sum(\"duration\")\r\n * });\r\n * ```\r\n */\r\n public groupBy(fields: GroupByInput): this;\r\n public groupBy(fields: GroupByInput, aggregates: Record<string, RawExpression>): this;\r\n public groupBy(fields: GroupByInput, aggregates?: Record<string, RawExpression>): this {\r\n if (aggregates) {\r\n this.operationsHelper.addGroupOperation(\r\n \"groupByWithAggregates\",\r\n { fields, aggregates },\r\n false,\r\n );\r\n } else {\r\n this.operationsHelper.addGroupOperation(\"groupBy\", { fields }, false);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Groups documents using a raw MongoDB expression.\r\n * @param expression - The raw grouping expression\r\n * @param bindings - Optional parameter bindings\r\n */\r\n public groupByRaw(expression: RawExpression, bindings?: unknown[]): this {\r\n this.operationsHelper.addGroupOperation(\"groupByRaw\", { expression, bindings }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters grouped results based on aggregate conditions.\r\n * @param field - The aggregate field to filter on\r\n * @param value - The value to compare against\r\n * @param operator - The comparison operator\r\n * @param condition - A condition object for complex filters\r\n */\r\n public having(field: string, value: unknown): this;\r\n public having(field: string, operator: WhereOperator, value: unknown): this;\r\n public having(condition: HavingInput): this;\r\n public having(...args: any[]): this {\r\n if (args.length === 1) {\r\n this.operationsHelper.addMatchOperation(\"having:condition\", args[0], false);\r\n } else if (args.length === 2) {\r\n this.operationsHelper.addMatchOperation(\r\n \"having\",\r\n { field: args[0], operator: \"=\", value: args[1] },\r\n false,\r\n );\r\n } else {\r\n this.operationsHelper.addMatchOperation(\r\n \"having\",\r\n { field: args[0], operator: args[1], value: args[2] },\r\n false,\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Filters grouped results using a raw MongoDB expression.\r\n * @param expression - The raw having expression\r\n * @param bindings - Optional parameter bindings\r\n */\r\n public havingRaw(expression: RawExpression, bindings?: unknown[]): this {\r\n this.operationsHelper.addMatchOperation(\"havingRaw\", { expression, bindings }, false);\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // JOINS\r\n // ============================================================================\r\n\r\n /**\r\n * Performs a join with another collection using MongoDB's $lookup.\r\n *\r\n * @param table - Target collection name\r\n * @param localField - Field from the input documents\r\n * @param foreignField - Field from the documents of the \"from\" collection\r\n */\r\n public join(table: string, localField: string, foreignField: string): this;\r\n /**\r\n * Performs a join with another collection using MongoDB's $lookup.\r\n *\r\n * @param options - Join configuration including table, fields, and optional pipeline\r\n */\r\n public join(options: JoinOptions): this;\r\n public join(\r\n tableOrOptions: string | JoinOptions,\r\n localField?: string,\r\n foreignField?: string,\r\n ): this {\r\n const options: JoinOptions =\r\n typeof tableOrOptions === \"string\"\r\n ? {\r\n table: tableOrOptions,\r\n localField: localField!,\r\n foreignField: foreignField!,\r\n type: \"left\", // MongoDB $lookup is inherently a left outer join\r\n }\r\n : tableOrOptions;\r\n\r\n this.operationsHelper.addLookupOperation(\"join\", options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs a left outer join with another collection.\r\n * In MongoDB, this is the standard $lookup behavior.\r\n *\r\n * @param table - Target collection name\r\n * @param localField - Field from the input documents\r\n * @param foreignField - Field from the documents of the \"from\" collection\r\n */\r\n public leftJoin(table: string, localField: string, foreignField: string): this;\r\n /**\r\n * Performs a left outer join with another collection.\r\n *\r\n * @param options - Join configuration\r\n */\r\n public leftJoin(options: JoinOptions): this;\r\n public leftJoin(\r\n tableOrOptions: string | JoinOptions,\r\n localField?: string,\r\n foreignField?: string,\r\n ): this {\r\n const options: JoinOptions =\r\n typeof tableOrOptions === \"string\"\r\n ? {\r\n table: tableOrOptions,\r\n localField: localField!,\r\n foreignField: foreignField!,\r\n type: \"left\",\r\n }\r\n : { ...tableOrOptions, type: \"left\" };\r\n\r\n this.operationsHelper.addLookupOperation(\"join\", options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs a right outer join with another collection.\r\n *\r\n * Note: MongoDB doesn't natively support right joins. This is implemented\r\n * as a regular left join with a warning. For true right join semantics,\r\n * consider reversing the collections in your query.\r\n *\r\n * @param table - Target collection name\r\n * @param localField - Field from the input documents\r\n * @param foreignField - Field from the documents of the \"from\" collection\r\n */\r\n public rightJoin(table: string, localField: string, foreignField: string): this;\r\n /**\r\n * Performs a right outer join with another collection.\r\n *\r\n * @param options - Join configuration\r\n */\r\n public rightJoin(options: JoinOptions): this;\r\n public rightJoin(\r\n tableOrOptions: string | JoinOptions,\r\n localField?: string,\r\n foreignField?: string,\r\n ): this {\r\n // MongoDB $lookup is always a left join from the perspective of the input collection\r\n // Right join semantics would require reversing the query direction\r\n const options: JoinOptions =\r\n typeof tableOrOptions === \"string\"\r\n ? {\r\n table: tableOrOptions,\r\n localField: localField!,\r\n foreignField: foreignField!,\r\n type: \"right\",\r\n }\r\n : { ...tableOrOptions, type: \"right\" };\r\n\r\n this.operationsHelper.addLookupOperation(\"join\", options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs an inner join with another collection.\r\n *\r\n * This adds a $lookup followed by a $match to filter out documents\r\n * where the joined array is empty.\r\n *\r\n * @param table - Target collection name\r\n * @param localField - Field from the input documents\r\n * @param foreignField - Field from the documents of the \"from\" collection\r\n */\r\n public innerJoin(table: string, localField: string, foreignField: string): this;\r\n /**\r\n * Performs an inner join with another collection.\r\n *\r\n * @param options - Join configuration\r\n */\r\n public innerJoin(options: JoinOptions): this;\r\n public innerJoin(\r\n tableOrOptions: string | JoinOptions,\r\n localField?: string,\r\n foreignField?: string,\r\n ): this {\r\n const options: JoinOptions =\r\n typeof tableOrOptions === \"string\"\r\n ? {\r\n table: tableOrOptions,\r\n localField: localField!,\r\n foreignField: foreignField!,\r\n type: \"inner\",\r\n }\r\n : { ...tableOrOptions, type: \"inner\" };\r\n\r\n this.operationsHelper.addLookupOperation(\"join\", options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs a full outer join with another collection.\r\n *\r\n * Note: MongoDB doesn't natively support full outer joins. This is implemented\r\n * as a regular left join. For true full outer join semantics, you would need\r\n * to use $unionWith and additional aggregation logic.\r\n *\r\n * @param table - Target collection name\r\n * @param localField - Field from the input documents\r\n * @param foreignField - Field from the documents of the \"from\" collection\r\n */\r\n public fullJoin(table: string, localField: string, foreignField: string): this;\r\n /**\r\n * Performs a full outer join with another collection.\r\n *\r\n * @param options - Join configuration\r\n */\r\n public fullJoin(options: JoinOptions): this;\r\n public fullJoin(\r\n tableOrOptions: string | JoinOptions,\r\n localField?: string,\r\n foreignField?: string,\r\n ): this {\r\n const options: JoinOptions =\r\n typeof tableOrOptions === \"string\"\r\n ? {\r\n table: tableOrOptions,\r\n localField: localField!,\r\n foreignField: foreignField!,\r\n type: \"full\",\r\n }\r\n : { ...tableOrOptions, type: \"full\" };\r\n\r\n this.operationsHelper.addLookupOperation(\"join\", options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs a cross join with another collection.\r\n *\r\n * This creates a cartesian product by using $lookup with empty matching criteria.\r\n *\r\n * @param table - Target collection name\r\n */\r\n public crossJoin(table: string): this {\r\n // Cross join: match every document in the foreign collection\r\n this.operationsHelper.addLookupOperation(\"join\", {\r\n table,\r\n localField: \"_crossJoinDummy\",\r\n foreignField: \"_crossJoinDummy\",\r\n type: \"cross\",\r\n pipeline: [{ $match: {} }], // Match all documents\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Performs a raw join using a custom aggregation pipeline.\r\n *\r\n * This allows full control over the $lookup stage for complex join scenarios.\r\n *\r\n * @param expression - Raw expression (typically a $lookup stage or pipeline)\r\n * @param _bindings - Optional bindings (not used in MongoDB but kept for API consistency)\r\n */\r\n public joinRaw(expression: RawExpression, _bindings?: unknown[]): this {\r\n // For MongoDB, expression should be a $lookup stage object or a simple string\r\n // describing the join. We add it as a raw operation.\r\n this.operationsHelper.addMatchOperation(\"raw\", { builder: () => expression }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Allows direct manipulation of the native MongoDB query.\r\n * @param builder - Function that receives and modifies the native query\r\n */\r\n public raw(builder: (native: unknown) => unknown): this {\r\n this.operationsHelper.addMatchOperation(\"raw\", { builder }, false);\r\n return this;\r\n }\r\n\r\n /**\r\n * Extends the query builder with driver-specific functionality.\r\n * @param extension - The extension name\r\n * @param _args - Extension-specific arguments\r\n * @returns The extension's return value\r\n */\r\n public extend<R>(extension: string, ..._args: unknown[]): R {\r\n // Driver-specific extensions can be added here\r\n throw new Error(`Extension '${extension}' is not supported by MongoQueryBuilder`);\r\n }\r\n\r\n /**\r\n * Creates a deep copy of the query builder.\r\n * @returns A new query builder instance with copied operations\r\n */\r\n public clone(): this {\r\n const cloned = new MongoQueryBuilder<T>(this.table, this.dataSource) as this;\r\n cloned.operations = [...this.operations];\r\n cloned.hydrateCallback = this.hydrateCallback?.bind(cloned);\r\n cloned.fetchingCallback = this.fetchingCallback?.bind(cloned);\r\n cloned.hydratingCallback = this.hydratingCallback?.bind(cloned);\r\n cloned.fetchedCallback = this.fetchedCallback?.bind(cloned);\r\n\r\n // Copy scope state\r\n cloned.pendingGlobalScopes = this.pendingGlobalScopes;\r\n cloned.availableLocalScopes = this.availableLocalScopes;\r\n cloned.disabledGlobalScopes = new Set(this.disabledGlobalScopes);\r\n cloned.scopesApplied = this.scopesApplied;\r\n\r\n (cloned as any).__operationsHelper = (this as any).__operationsHelper;\r\n return cloned;\r\n }\r\n\r\n /**\r\n * Executes a callback with the query builder without breaking the chain.\r\n * @param callback - Function to execute with the builder\r\n */\r\n public tap(callback: (builder: this) => void): this {\r\n callback(this);\r\n return this;\r\n }\r\n\r\n /**\r\n * Conditionally applies query modifications based on a condition.\r\n * @param condition - The condition to evaluate\r\n * @param callback - Function to execute if condition is true\r\n * @param otherwise - Optional function to execute if condition is false\r\n *\r\n * @example\r\n * query.when(searchTerm, (q, term) => q.whereLike('name', term))\r\n */\r\n public when<V>(\r\n condition: V | boolean,\r\n callback: (builder: this, value: V) => void,\r\n otherwise?: (builder: this) => void,\r\n ): this {\r\n if (condition) {\r\n callback(this, condition as V);\r\n } else if (otherwise) {\r\n otherwise(this);\r\n }\r\n return this;\r\n }\r\n\r\n // ============================================================================\r\n // EXECUTION METHODS\r\n // ============================================================================\r\n\r\n /**\r\n * Executes the query and returns all matching documents.\r\n * @returns an array of matching documents\r\n */\r\n public async get<Output = T>(): Promise<Output[]> {\r\n const startTime = Date.now();\r\n\r\n // Emit onFetching event\r\n if (this.fetchingCallback) {\r\n await this.fetchingCallback(this);\r\n }\r\n\r\n // Execute query and get raw records\r\n const rawRecords = await this.execute<Output>();\r\n\r\n // Emit onHydrating event\r\n if (this.hydratingCallback) {\r\n await this.hydratingCallback(rawRecords, {\r\n query: this,\r\n hydrateCallback: this.hydrateCallback,\r\n });\r\n }\r\n\r\n // Hydrate records\r\n const hydratedRecords = this.hydrateCallback\r\n ? rawRecords.map(this.hydrateCallback)\r\n : rawRecords;\r\n\r\n // Emit onFetched event\r\n if (this.fetchedCallback) {\r\n await this.fetchedCallback(hydratedRecords, {\r\n query: this,\r\n rawRecords,\r\n duration: Date.now() - startTime,\r\n });\r\n }\r\n\r\n return hydratedRecords;\r\n }\r\n\r\n /**\r\n * Execute the query and get first result\r\n * This is different than `first` as first adds a `limit = 1` to the pipeline\r\n */\r\n public async getFirst<Output = T>(): Promise<Output | null> {\r\n return (await this.get<Output>())?.[0] ?? null;\r\n }\r\n\r\n /**\r\n * Executes the query and returns the first matching document.\r\n * @returns the first document or null\r\n */\r\n public async first<Output = T>(): Promise<Output | null> {\r\n const results = await this.limit(1).get<Output>();\r\n return results.length > 0 ? results[0] : null;\r\n }\r\n\r\n /**\r\n * Executes the query and returns the first matching document, throwing if none found.\r\n * @returns the first document\r\n */\r\n public async firstOrFail<Output = T>(): Promise<Output> {\r\n const result = await this.first<Output>();\r\n if (!result) {\r\n throw new Error(\"No records found matching the query\");\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Find a document by its primary key (id field).\r\n */\r\n public async find<Output = T>(id: number | string): Promise<Output | null> {\r\n return this.where(\"id\", id).first<Output>();\r\n }\r\n\r\n /**\r\n * Configures the query to retrieve the last matching document.\r\n */\r\n public last<Output = T>(field: string = \"createdAt\"): Promise<Output | null> {\r\n this.orderBy(field, \"desc\");\r\n return this.first<Output>();\r\n }\r\n\r\n /**\r\n * Counts the number of documents matching the query.\r\n * @returns the count of matching documents\r\n */\r\n public async count(): Promise<number> {\r\n const pipeline = this.buildPipeline();\r\n pipeline.push({ $count: \"total\" });\r\n\r\n const results = await this.execute<{ total: number }>(pipeline);\r\n\r\n return results.length > 0 ? results[0].total : 0;\r\n }\r\n\r\n /**\r\n * Calculates the sum of a numeric field across matching documents.\r\n * @param field - The numeric field to sum\r\n * @returns the sum value\r\n */\r\n public async sum(field: string): Promise<number> {\r\n this.groupByRaw({\r\n _id: null,\r\n total: { $sum: `$${field}` },\r\n });\r\n\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n const result = await this.getFirst<{ total: number }>();\r\n\r\n return result?.total ?? 0;\r\n }\r\n\r\n /**\r\n * Calculates the average value of a numeric field across matching documents.\r\n * @param field - The numeric field to average\r\n * @returns the average value\r\n */\r\n public async avg(field: string): Promise<number> {\r\n this.groupByRaw({\r\n _id: null,\r\n average: { $avg: `$${field}` },\r\n });\r\n\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n return (await this.getFirst<{ average: number }>())?.average ?? 0;\r\n }\r\n\r\n /**\r\n * Finds the minimum value of a field across matching documents.\r\n * @param field - The field to find the minimum of\r\n * @returns the minimum value\r\n */\r\n public async min(field: string): Promise<number> {\r\n this.groupByRaw({\r\n _id: null,\r\n minimum: { $min: `$${field}` },\r\n });\r\n\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n return (await this.getFirst<{ minimum: number }>())?.minimum ?? 0;\r\n }\r\n\r\n /**\r\n * Finds the maximum value of a field across matching documents.\r\n * @param field - The field to find the maximum of\r\n * @returns the maximum value\r\n */\r\n public async max(field: string): Promise<number> {\r\n this.groupByRaw({\r\n _id: null,\r\n maximum: { $max: `$${field}` },\r\n });\r\n\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n return (await this.getFirst<{ maximum: number }>())?.maximum ?? 0;\r\n }\r\n\r\n /**\r\n * Returns an array of distinct values for a field, respecting query filters.\r\n * @param field - The field to get distinct values from\r\n * @returns an array of distinct values\r\n */\r\n public async distinct<T = unknown>(field: string, ignoreNull = true): Promise<T[]> {\r\n if (ignoreNull) {\r\n this.whereNotNull(field);\r\n }\r\n\r\n this.groupBy(field);\r\n\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n const results = await this.get<{ _id: T }>();\r\n return results.map((doc) => doc._id);\r\n }\r\n\r\n /**\r\n * Count distinct values for a field, respecting query filters.\r\n * @param field - The field to count distinct values for\r\n * @returns the count of distinct values\r\n */\r\n public async countDistinct(field: string, ignoreNull = true): Promise<number> {\r\n if (ignoreNull) {\r\n this.whereNotNull(field);\r\n }\r\n\r\n return await this.groupBy(field).count();\r\n }\r\n\r\n /**\r\n * Extracts a single field value from each matching document.\r\n * @param field - The field to extract\r\n * @returns an array of field values\r\n */\r\n public async pluck<T = unknown>(field: string): Promise<T[]> {\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n // Use object aliasing: { [field]: \"value\" } to project field as \"value\"\r\n const results = await this.selectAs(field, \"value\").get<{\r\n value: T;\r\n }>();\r\n\r\n return results.map((doc) => doc.value).filter((value) => value !== undefined);\r\n }\r\n\r\n /**\r\n * Gets the value of a single field from the first matching document.\r\n * @param field - The field to extract\r\n * @returns the field value or null\r\n */\r\n public async value<T = unknown>(field: string): Promise<T | null> {\r\n // make sure to clear the data map callback\r\n this.hydrateCallback = undefined;\r\n\r\n const result = await this.selectAs(field, \"value\").first<{ value: T }>();\r\n return result?.value ?? null;\r\n }\r\n\r\n /**\r\n * Checks if any documents match the query.\r\n * @param filter - Optional filter to apply to the query\r\n * @returns true if documents exist, false otherwise\r\n */\r\n public async exists(filter?: GenericObject): Promise<boolean> {\r\n if (filter) {\r\n this.where(filter);\r\n }\r\n\r\n const count = await this.limit(1).count();\r\n return count > 0;\r\n }\r\n\r\n /**\r\n * Checks if no documents match the query.\r\n * @param filter - Optional filter to apply to the query\r\n * @returns true if no documents exist, false otherwise\r\n */\r\n public async notExists(filter?: GenericObject): Promise<boolean> {\r\n return !(await this.exists(filter));\r\n }\r\n\r\n /**\r\n * Increments a numeric field by the specified amount for first matching document.\r\n * @param field - The field to increment\r\n * @param amount - The amount to increment by (default: 1)\r\n * @returns the new value\r\n */\r\n public async increment(field: string, amount: number = 1): Promise<number> {\r\n const filter = this.buildFilter();\r\n\r\n const result = await this.collection.findOneAndUpdate(\r\n filter,\r\n {\r\n $inc: { [field]: amount },\r\n },\r\n {\r\n returnDocument: \"after\",\r\n },\r\n );\r\n\r\n return get(result, field, 0);\r\n }\r\n\r\n /**\r\n * Decrements a numeric field by the specified amount.\r\n * @param field - The field to decrement\r\n * @param amount - The amount to decrement by\r\n * @returns the new value\r\n */\r\n public async decrement(field: string, amount: number = 1): Promise<number> {\r\n return this.increment(field, -amount);\r\n }\r\n\r\n /**\r\n * Increments a numeric field by the specified amount for all matching documents.\r\n * @param field - The field to increment\r\n * @param amount - The amount to increment by (default: 1)\r\n * @returns the number of documents modified\r\n */\r\n public async incrementMany(field: string, amount: number = 1): Promise<number> {\r\n const filter = this.buildFilter();\r\n\r\n const result = await this.dataSource.driver.updateMany(this.table, filter, {\r\n $inc: { [field]: amount },\r\n });\r\n\r\n return result.modifiedCount;\r\n }\r\n\r\n /**\r\n * Decrements a numeric field by the specified amount for all matching documents.\r\n * @param field - The field to decrement\r\n * @param amount - The amount to decrement by (default: 1)\r\n * @returns the number of documents modified\r\n */\r\n public async decrementMany(field: string, amount: number = 1): Promise<number> {\r\n return this.incrementMany(field, -amount);\r\n }\r\n\r\n /**\r\n * Delete all documents matching the query.\r\n */\r\n public async delete(): Promise<number> {\r\n const filter = this.buildFilter();\r\n return await this.dataSource.driver.deleteMany(this.table, filter);\r\n }\r\n\r\n /**\r\n * Delete a single document matching the query.\r\n */\r\n public async deleteOne(): Promise<number> {\r\n const filter = this.buildFilter();\r\n return await this.dataSource.driver.delete(this.table, filter);\r\n }\r\n\r\n /**\r\n * Update the given fields for all documents matching the query.\r\n */\r\n public async update(fields: Record<string, unknown>): Promise<number> {\r\n const filter = this.buildFilter();\r\n const result = await this.dataSource.driver.updateMany(this.table, filter, {\r\n $set: fields,\r\n });\r\n return result.modifiedCount;\r\n }\r\n\r\n /**\r\n * Unset the given fields from all documents matching the query.\r\n */\r\n public async unset(...fields: string[]): Promise<number> {\r\n const filter = this.buildFilter();\r\n const result = await this.dataSource.driver.updateMany(this.table, filter, {\r\n $unset: fields.reduce(\r\n (acc, field) => {\r\n acc[field] = 1;\r\n return acc;\r\n },\r\n {} as Record<string, 1 | true>,\r\n ),\r\n });\r\n return result.modifiedCount;\r\n }\r\n\r\n // ============================================================================\r\n // CHUNKING / PAGINATION\r\n // ============================================================================\r\n\r\n /**\r\n * Processes query results in chunks, executing a callback for each chunk.\r\n * @param size - The number of documents per chunk\r\n * @param callback - Function to execute for each chunk\r\n * @returns void\r\n */\r\n public async chunk(\r\n size: number,\r\n callback: (rows: T[], chunkIndex: number) => Promise<boolean | void> | boolean | void,\r\n ): Promise<void> {\r\n let chunkIndex = 0;\r\n let hasMore = true;\r\n\r\n while (hasMore) {\r\n const chunk = await this.clone()\r\n .skip(chunkIndex * size)\r\n .limit(size)\r\n .get();\r\n\r\n if (chunk.length === 0) {\r\n break;\r\n }\r\n\r\n const shouldContinue = await callback(chunk, chunkIndex);\r\n\r\n if (shouldContinue === false) {\r\n break;\r\n }\r\n\r\n hasMore = chunk.length === size;\r\n chunkIndex++;\r\n }\r\n }\r\n\r\n /**\r\n * Executes the query with traditional page-based pagination.\r\n * @param options - Pagination options\r\n * @returns pagination result with data and metadata\r\n */\r\n public async paginate(options?: PaginationOptions): Promise<PaginationResult<T>> {\r\n const page = options?.page ?? 1;\r\n const limit = options?.limit ?? 10;\r\n const skip = (page - 1) * limit;\r\n\r\n const [data, total] = await Promise.all([\r\n this.clone().skip(skip).limit(limit).get(),\r\n this.count(),\r\n ]);\r\n\r\n return {\r\n data,\r\n pagination: {\r\n total,\r\n page,\r\n limit,\r\n pages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Executes the query with cursor-based pagination supporting both directions.\r\n * @param options - Cursor pagination options\r\n * @returns cursor pagination result with data and cursor info\r\n */\r\n public async cursorPaginate(\r\n options?: CursorPaginationOptions,\r\n ): Promise<CursorPaginationResult<T>> {\r\n const limit = options?.limit ?? 10;\r\n const cursor = options?.cursor;\r\n const column = options?.column ?? \"id\";\r\n const direction = options?.direction ?? \"next\";\r\n\r\n // Apply cursor filter\r\n if (cursor) {\r\n const operator = direction === \"next\" ? \">\" : \"<\";\r\n this.where(column, operator, cursor);\r\n }\r\n\r\n // Apply sorting\r\n const sortOrder = direction === \"next\" ? \"asc\" : \"desc\";\r\n this.orderBy(column, sortOrder);\r\n\r\n this.orderBy(\"_id\", sortOrder); // Always sort by _id to ensure consistent order\r\n\r\n // Fetch one extra to detect if there are more results\r\n const results = await this.limit(limit + 1).get<T>();\r\n\r\n const hasMore = results.length > limit;\r\n let data = hasMore ? results.slice(0, limit) : results;\r\n\r\n // Reverse results if fetching previous page to keep natural order\r\n if (direction === \"prev\") {\r\n data = data.reverse();\r\n }\r\n\r\n // Determine cursors based on actual data\r\n let nextCursor: unknown | undefined;\r\n let prevCursor: unknown | undefined;\r\n let hasPrev = false;\r\n\r\n if (data.length > 0) {\r\n const firstItem = (data[0] as any)[column];\r\n const lastItem = (data[data.length - 1] as any)[column];\r\n\r\n if (direction === \"next\") {\r\n // Forward pagination\r\n nextCursor = hasMore ? lastItem : undefined;\r\n\r\n // Check if there's a previous page\r\n if (cursor) {\r\n hasPrev = true;\r\n prevCursor = firstItem;\r\n }\r\n } else {\r\n // Backward pagination\r\n prevCursor = hasMore ? firstItem : undefined;\r\n hasPrev = hasMore;\r\n\r\n // Check if there's a next page\r\n if (cursor) {\r\n nextCursor = lastItem;\r\n }\r\n }\r\n }\r\n\r\n return {\r\n data,\r\n pagination: {\r\n hasMore,\r\n hasPrev,\r\n nextCursor,\r\n prevCursor,\r\n },\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // INSPECTION / DEBUGGING\r\n // ============================================================================\r\n\r\n /**\r\n * Returns the MongoDB aggregation pipeline that will be executed.\r\n */\r\n public parse(): DriverQuery {\r\n return { pipeline: this.buildPipeline() };\r\n }\r\n\r\n /**\r\n * Returns a formatted string representation of the query pipeline.\r\n * @returns A formatted string representation of the pipeline\r\n */\r\n public pretty() {\r\n return this.getParser().toPrettyString();\r\n }\r\n\r\n /**\r\n * Returns the MongoDB query execution plan.\r\n * @returns MongoDB's explain output\r\n */\r\n public async explain(): Promise<unknown> {\r\n // TODO: Trigger the explaining event\r\n const pipeline = this.buildPipeline();\r\n const session = databaseTransactionContext.getSession();\r\n const options = session ? { session, explain: true } : { explain: true };\r\n\r\n return this.collection.aggregate(pipeline, options as any).toArray();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL PIPELINE BUILDING\r\n // ============================================================================\r\n\r\n /**\r\n * Get query parser instance\r\n */\r\n protected getParser(): MongoQueryParser {\r\n this.applyPendingScopes();\r\n\r\n return new MongoQueryParser({\r\n collection: this.collection,\r\n operations: this.operations,\r\n createSubBuilder: () => new MongoQueryBuilder(this.table, this.dataSource),\r\n });\r\n }\r\n\r\n /**\r\n * Build the MongoDB aggregation pipeline from the operations list.\r\n * @returns The MongoDB aggregation pipeline\r\n */\r\n protected buildPipeline() {\r\n const parser = this.getParser();\r\n\r\n return parser.parse();\r\n }\r\n\r\n /**\r\n * Build a MongoDB filter object from the query's where clauses.\r\n * Used for update operations like increment/decrement.\r\n * @returns The MongoDB filter object\r\n */\r\n protected buildFilter(): Record<string, unknown> {\r\n // Get all match operations\r\n const matchOperations = this.operations.filter((op) => op.stage === \"$match\");\r\n\r\n if (matchOperations.length === 0) {\r\n return {}; // No filters, match all documents\r\n }\r\n\r\n // Build the pipeline and extract the first $match stage\r\n const pipeline = this.buildPipeline();\r\n const matchStage = pipeline.find((stage) => stage.$match);\r\n\r\n if (matchStage && matchStage.$match) {\r\n return matchStage.$match;\r\n }\r\n\r\n return {};\r\n }\r\n\r\n /**\r\n * Execute the aggregate command\r\n */\r\n protected async execute<T extends any = any>(pipeline?: any[]): Promise<T[]> {\r\n const aggregationPipeline = pipeline || this.buildPipeline();\r\n const session = databaseTransactionContext.getSession() as ClientSession | undefined;\r\n const options: AggregateOptions = { session };\r\n\r\n // TODO: Trigger the executing event\r\n const results = (await this.collection\r\n .aggregate(aggregationPipeline, options)\r\n .toArray()) as T[];\r\n\r\n // TODO: Trigger the fetched event\r\n\r\n // we need to cleanup the operations list\r\n this.operations = [];\r\n this.operationsHelper.setOperations(this.operations);\r\n\r\n return results;\r\n }\r\n\r\n // ============================================================================\r\n // RELATIONS / EAGER LOADING (Stubs)\r\n // ============================================================================\r\n\r\n /**\r\n * Relations to eagerly load.\r\n */\r\n public eagerLoadRelations: Map<string, boolean | ((query: QueryBuilderContract) => void)> =\r\n new Map();\r\n\r\n /**\r\n * Relations to load via $lookup (single query).\r\n */\r\n public joinRelations: Map<string, { alias: string; type: \"belongsTo\" | \"hasOne\" | \"hasMany\" }> =\r\n new Map();\r\n\r\n /**\r\n * Relation definitions from the model.\r\n */\r\n declare public relationDefinitions?: Record<string, any>;\r\n\r\n /**\r\n * Model class reference.\r\n */\r\n declare public modelClass?: any;\r\n\r\n /**\r\n * Load relations using MongoDB $lookup in a single aggregation query.\r\n *\r\n * Unlike `with()` which uses separate queries, `joinWith()` uses\r\n * $lookup to fetch related data in a single aggregation pipeline.\r\n *\r\n * @param relations - Relation names to load via $lookup\r\n * @returns This builder for chaining\r\n */\r\n public joinWith(...relations: string[]): this {\r\n for (const relation of relations) {\r\n const def = this.relationDefinitions?.[relation];\r\n if (def) {\r\n this.joinRelations.set(relation, {\r\n alias: `_rel_${relation}`,\r\n type: def.type,\r\n });\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Eagerly load one or more relations.\r\n *\r\n * Supported patterns:\r\n * - `with(\"posts\")` - Load relation\r\n * - `with(\"posts\", \"comments\")` - Load multiple relations\r\n * - `with(\"posts\", callback)` - Load relation with constraint\r\n * - `with({ posts: true, comments: callback })` - Object configuration\r\n *\r\n * @param args - Relation name(s), callbacks, or configuration object\r\n */\r\n public with(\r\n ...args: (\r\n | string\r\n | Record<string, boolean | ((query: QueryBuilderContract) => void)>\r\n | ((query: QueryBuilderContract) => void)\r\n )[]\r\n ): this {\r\n for (let i = 0; i < args.length; i++) {\r\n const arg = args[i];\r\n\r\n if (typeof arg === \"string\") {\r\n // Check if next argument is a callback for this relation\r\n const nextArg = args[i + 1];\r\n if (typeof nextArg === \"function\") {\r\n this.eagerLoadRelations.set(arg, nextArg);\r\n i++; // Skip the callback in next iteration\r\n } else {\r\n this.eagerLoadRelations.set(arg, true);\r\n }\r\n } else if (typeof arg === \"object\" && arg !== null) {\r\n for (const [key, value] of Object.entries(arg)) {\r\n this.eagerLoadRelations.set(key, value);\r\n }\r\n }\r\n // Functions not preceded by a string are ignored (invalid usage)\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Filter results to only those that have related models.\r\n * @param relation - Relation name\r\n * @param operator - Optional comparison operator\r\n * @param count - Optional count to compare against\r\n */\r\n public has(relation: string, operator?: string, count?: number): this {\r\n // TODO: Implement has() using $lookup and $match\r\n this.operationsHelper.addMatchOperation(\"has\", { relation, operator, count });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filter results that have related models matching specific conditions.\r\n * @param relation - Relation name\r\n * @param callback - Callback to define conditions\r\n */\r\n public whereHas(relation: string, callback: (query: QueryBuilderContract) => void): this {\r\n // TODO: Implement whereHas() using $lookup with pipeline\r\n this.operationsHelper.addMatchOperation(\"whereHas\", { relation, callback });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filter results that don't have any related models.\r\n * @param relation - Relation name\r\n */\r\n public doesntHave(relation: string): this {\r\n // TODO: Implement doesntHave() using $lookup and $match\r\n this.operationsHelper.addMatchOperation(\"doesntHave\", { relation });\r\n return this;\r\n }\r\n\r\n /**\r\n * Filter results that don't have related models matching specific conditions.\r\n * @param relation - Relation name\r\n * @param callback - Callback to define conditions\r\n */\r\n public whereDoesntHave(relation: string, callback: (query: QueryBuilderContract) => void): this {\r\n // TODO: Implement whereDoesntHave() using $lookup with pipeline\r\n this.operationsHelper.addMatchOperation(\"whereDoesntHave\", { relation, callback });\r\n return this;\r\n }\r\n\r\n /**\r\n * Nearest-neighbour vector similarity search via MongoDB Atlas $vectorSearch.\r\n *\r\n * Adds two pipeline stages:\r\n * 1. `$vectorSearch` — runs the ANN search using the Atlas vector index.\r\n * Must be the first stage in the pipeline. Limit is embedded here.\r\n * 2. `$addFields` — exposes `{ $meta: \"vectorSearchScore\" }` under `alias`\r\n * so callers can filter by minimum score after `.get()`.\r\n *\r\n * **Prerequisites:**\r\n * - MongoDB Atlas cluster (local/Community MongoDB does NOT support $vectorSearch)\r\n * - A vector search index on the collection, e.g.:\r\n * `{ \"fields\": [{ \"type\": \"vector\", \"path\": \"embedding\", \"numDimensions\": 1536, \"similarity\": \"cosine\" }] }`\r\n * - The index name convention used here is `\"${column}_index\"` (override via `alias` if needed).\r\n *\r\n * @param column - Vector column name (e.g. `\"embedding\"`)\r\n * @param embedding - Query embedding as a plain number array\r\n * @param alias - Score alias added to each result row (default: `\"score\"`)\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = await Vector.query()\r\n * .where({ organization_id: \"org-123\" })\r\n * .similarTo(\"embedding\", queryEmbedding)\r\n * .limit(5)\r\n * .get<VectorRow & { score: number }>();\r\n * ```\r\n */\r\n public similarTo(column: string, embedding: number[], alias = \"score\"): this {\r\n // Grab the limit op recorded so far (default to 10 if not set yet)\r\n const limitOp = this.operations.find((op) => op.type === \"limit\");\r\n const limit = (limitOp?.data?.value as number) ?? 10;\r\n\r\n // Stage 1: $vectorSearch — ANN search via Atlas vector index\r\n this.operationsHelper.addOperation(\r\n \"$vectorSearch\",\r\n \"vectorSearch\",\r\n {\r\n index: `${column}_index`,\r\n path: column,\r\n queryVector: embedding,\r\n numCandidates: limit * 10, // Atlas recommendation: 10–20x the limit\r\n limit,\r\n },\r\n false, // Not mergeable — must stay as its own stage\r\n );\r\n\r\n // Stage 2: $addFields — expose vectorSearchScore as the score alias\r\n this.operationsHelper.addOperation(\r\n \"$addFields\",\r\n \"vectorSearchScore\",\r\n { [alias]: { $meta: \"vectorSearchScore\" } },\r\n false,\r\n );\r\n\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ import { Operation, PipelineStage } from "./types.mjs";
2
+
3
+ //#region ../../@warlock.js/cascade/src/drivers/mongodb/mongodb-query-operations.d.ts
4
+ /**
5
+ * Helper class for constructing MongoDB aggregation pipeline operations.
6
+ *
7
+ * This class encapsulates the logic for creating operation objects that will be
8
+ * converted to MongoDB aggregation stages by the query parser. It provides a
9
+ * clean abstraction over the low-level operation structure, making the query
10
+ * builder code more maintainable and testable.
11
+ *
12
+ * Each operation consists of:
13
+ * - **stage**: The MongoDB aggregation stage name (e.g., "$match", "$project")
14
+ * - **type**: An internal identifier for the operation type
15
+ * - **data**: The data associated with the operation
16
+ * - **mergeable**: Whether this operation can be merged with adjacent similar operations
17
+ *
18
+ * @internal This class is for internal use within the MongoDB driver
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const operations: Operation[] = [];
23
+ * const helper = new MongoQueryOperations(operations);
24
+ *
25
+ * // Add a match operation
26
+ * helper.addMatchOperation("whereIn", { field: "status", values: ["active", "pending"] });
27
+ *
28
+ * // Add a project operation
29
+ * helper.addProjectOperation("select", { fields: ["name", "email"] });
30
+ *
31
+ * // Operations array is now populated
32
+ * console.log(operations);
33
+ * // [
34
+ * // { stage: "$match", mergeable: true, type: "whereIn", data: {...} },
35
+ * // { stage: "$project", mergeable: true, type: "select", data: {...} }
36
+ * // ]
37
+ * ```
38
+ */
39
+ declare class MongoQueryOperations {
40
+ private operations;
41
+ /**
42
+ * Creates a new operations helper.
43
+ *
44
+ * The helper maintains a reference to the operations array and populates it
45
+ * as methods are called. This allows the query builder to maintain a single
46
+ * ordered list of operations that will be converted to a MongoDB aggregation
47
+ * pipeline.
48
+ *
49
+ * @param operations - Reference to the operations array to populate
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const operations: Operation[] = [];
54
+ * const helper = new MongoQueryOperations(operations);
55
+ * ```
56
+ */
57
+ constructor(operations: Operation[]);
58
+ setOperations(operations: Operation[]): void;
59
+ /**
60
+ * Adds a $match stage operation to the pipeline.
61
+ *
62
+ * Match operations filter documents in the aggregation pipeline, similar to
63
+ * the WHERE clause in SQL. Multiple match operations can be merged together
64
+ * by the parser for optimization.
65
+ *
66
+ * @param type - The operation type identifier (e.g., "where", "whereIn", "whereLike")
67
+ * @param data - The operation data data containing filter criteria
68
+ * @param mergeable - Whether this operation can be merged with adjacent match operations (default: true)
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * // Simple where operation
73
+ * helper.addMatchOperation("where", { field: "age", operator: ">", value: 18 });
74
+ *
75
+ * // WhereIn operation
76
+ * helper.addMatchOperation("whereIn", { field: "status", values: ["active", "pending"] });
77
+ *
78
+ * // Non-mergeable match (e.g., after a group stage)
79
+ * helper.addMatchOperation("having", { field: "count", operator: ">", value: 5 }, false);
80
+ * ```
81
+ */
82
+ addMatchOperation(type: string, data: Record<string, unknown>, mergeable?: boolean): void;
83
+ /**
84
+ * Adds a $project stage operation to the pipeline.
85
+ *
86
+ * Project operations control which fields are included or excluded in the
87
+ * output documents, similar to the SELECT clause in SQL. They can also be
88
+ * used to compute new fields or reshape documents.
89
+ *
90
+ * @param type - The operation type identifier (e.g., "select", "deselect", "selectRaw")
91
+ * @param data - The operation data data containing projection specifications
92
+ * @param mergeable - Whether this operation can be merged with adjacent project operations (default: true)
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * // Select specific fields
97
+ * helper.addProjectOperation("select", { fields: ["name", "email", "age"] });
98
+ *
99
+ * // Deselect fields
100
+ * helper.addProjectOperation("deselect", { fields: ["password", "secret"] });
101
+ *
102
+ * // Computed field
103
+ * helper.addProjectOperation("selectRaw", {
104
+ * expression: { fullName: { $concat: ["$firstName", " ", "$lastName"] } }
105
+ * });
106
+ * ```
107
+ */
108
+ addProjectOperation(type: string, data: Record<string, unknown>, mergeable?: boolean): void;
109
+ /**
110
+ * Adds a $sort stage operation to the pipeline.
111
+ *
112
+ * Sort operations order the documents in the pipeline, similar to the ORDER BY
113
+ * clause in SQL. Multiple sort operations can be merged to create compound
114
+ * sorting.
115
+ *
116
+ * @param type - The operation type identifier (e.g., "orderBy", "orderByRandom")
117
+ * @param data - The operation data data containing sort specifications
118
+ * @param mergeable - Whether this operation can be merged with adjacent sort operations (default: true)
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * // Order by a single field
123
+ * helper.addSortOperation("orderBy", { field: "createdAt", direction: "desc" });
124
+ *
125
+ * // Random ordering (not mergeable)
126
+ * helper.addSortOperation("orderByRandom", {limit: 1000}, false);
127
+ *
128
+ * // Order by raw expression
129
+ * helper.addSortOperation("orderByRaw", {
130
+ * expression: { score: -1, name: 1 }
131
+ * });
132
+ * ```
133
+ */
134
+ addSortOperation(type: string, data: Record<string, unknown>, mergeable?: boolean): void;
135
+ /**
136
+ * Adds a $group stage operation to the pipeline.
137
+ *
138
+ * Group operations aggregate documents by specified fields and compute
139
+ * aggregate values, similar to the GROUP BY clause in SQL. Group operations
140
+ * are typically not mergeable as they represent distinct aggregation boundaries.
141
+ *
142
+ * @param type - The operation type identifier (e.g., "groupBy", "distinct")
143
+ * @param data - The operation data data containing grouping specifications
144
+ * @param mergeable - Whether this operation can be merged with adjacent group operations (default: false)
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * // Group by a single field
149
+ * helper.addGroupOperation("groupBy", { fields: "category" });
150
+ *
151
+ * // Group by multiple fields
152
+ * helper.addGroupOperation("groupBy", {
153
+ * fields: { category: "$category", status: "$status" }
154
+ * });
155
+ *
156
+ * // Distinct operation (special case of grouping)
157
+ * helper.addGroupOperation("distinct", { fields: ["email"] });
158
+ * ```
159
+ */
160
+ addGroupOperation(type: string, data: Record<string, unknown>, mergeable?: boolean): void;
161
+ /**
162
+ * Adds a $lookup stage operation to the pipeline.
163
+ *
164
+ * Lookup operations perform left outer joins with other collections, similar
165
+ * to JOIN in SQL. Lookup operations are never mergeable as each represents a
166
+ * distinct join operation.
167
+ *
168
+ * @param type - The operation type identifier (typically "join")
169
+ * @param data - The operation data data containing join specifications
170
+ *
171
+ * @example
172
+ * ```typescript
173
+ * // Simple lookup
174
+ * helper.addLookupOperation("join", {
175
+ * table: "orders",
176
+ * localField: "id",
177
+ * foreignField: "userId",
178
+ * alias: "userOrders"
179
+ * });
180
+ *
181
+ * // Lookup with pipeline
182
+ * helper.addLookupOperation("join", {
183
+ * table: "products",
184
+ * pipeline: [
185
+ * { $match: { inStock: true } },
186
+ * { $sort: { price: 1 } }
187
+ * ],
188
+ * alias: "availableProducts"
189
+ * });
190
+ * ```
191
+ */
192
+ addLookupOperation(type: string, data: Record<string, unknown>): void;
193
+ /**
194
+ * Adds a generic stage operation to the pipeline.
195
+ *
196
+ * This method provides flexibility to add any MongoDB aggregation stage,
197
+ * including less common stages like $facet, $bucket, $setWindowFields, etc.
198
+ * Use this for operations that don't fit into the standard categories.
199
+ *
200
+ * @param stage - The MongoDB aggregation stage name (e.g., "$limit", "$skip", "$unwind")
201
+ * @param type - The operation type identifier
202
+ * @param data - The operation data data
203
+ * @param mergeable - Whether this operation can be merged with adjacent operations (default: false)
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * // Add a limit operation
208
+ * helper.addOperation("$limit", "limit", { value: 10 });
209
+ *
210
+ * // Add a skip operation
211
+ * helper.addOperation("$skip", "skip", { value: 20 });
212
+ *
213
+ * // Add an unwind operation
214
+ * helper.addOperation("$unwind", "unwind", { path: "$tags" });
215
+ *
216
+ * // Add a window function
217
+ * helper.addOperation("$setWindowFields", "selectWindow", {
218
+ * spec: {
219
+ * partitionBy: "$category",
220
+ * sortBy: { price: 1 },
221
+ * output: { rank: { $rank: {} } }
222
+ * }
223
+ * });
224
+ * ```
225
+ */
226
+ addOperation(stage: PipelineStage, type: string, data: Record<string, unknown>, mergeable?: boolean): void;
227
+ }
228
+ //#endregion
229
+ export { MongoQueryOperations };
230
+ //# sourceMappingURL=mongodb-query-operations.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb-query-operations.d.mts","names":[],"sources":["../../../../../../../@warlock.js/cascade/src/drivers/mongodb/mongodb-query-operations.ts"],"mappings":";;;;;AAqCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,oBAAA;EAAA,QAiBgB,UAAA;EAqG0C;;;;;;;;;;;;;;;;cArG1C,UAAA,EAAY,SAAA;EAEhC,aAAA,CAAc,UAAA,EAAY,SAAA;EA+Nd;;;;;;;;;;;;;;;;;;;;;;;EApMZ,iBAAA,CAAkB,IAAA,UAAc,IAAA,EAAM,MAAA,mBAAyB,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC/D,mBAAA,CACL,IAAA,UACA,IAAA,EAAM,MAAA,mBACN,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCK,gBAAA,CAAiB,IAAA,UAAc,IAAA,EAAM,MAAA,mBAAyB,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC9D,iBAAA,CACL,IAAA,UACA,IAAA,EAAM,MAAA,mBACN,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCK,kBAAA,CAAmB,IAAA,UAAc,IAAA,EAAM,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CvC,YAAA,CACL,KAAA,EAAO,aAAA,EACP,IAAA,UACA,IAAA,EAAM,MAAA,mBACN,SAAA;AAAA"}