@warlock.js/cascade 4.0.92 → 4.0.93

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 (269) hide show
  1. package/cjs/contracts/database-driver.contract.d.ts +118 -0
  2. package/cjs/contracts/database-driver.contract.d.ts.map +1 -1
  3. package/cjs/contracts/migration-driver.contract.d.ts +14 -0
  4. package/cjs/contracts/migration-driver.contract.d.ts.map +1 -1
  5. package/cjs/contracts/query-builder.contract.d.ts +410 -1
  6. package/cjs/contracts/query-builder.contract.d.ts.map +1 -1
  7. package/cjs/data-source/data-source-registry.d.ts +4 -0
  8. package/cjs/data-source/data-source-registry.d.ts.map +1 -1
  9. package/cjs/data-source/data-source-registry.js +7 -0
  10. package/cjs/data-source/data-source-registry.js.map +1 -1
  11. package/cjs/drivers/mongodb/mongodb-blueprint.d.ts.map +1 -0
  12. package/cjs/drivers/mongodb/mongodb-blueprint.js.map +1 -0
  13. package/{esm/drivers/mongo → cjs/drivers/mongodb}/mongodb-driver.d.ts +49 -0
  14. package/cjs/drivers/mongodb/mongodb-driver.d.ts.map +1 -0
  15. package/cjs/drivers/{mongo → mongodb}/mongodb-driver.js +125 -8
  16. package/cjs/drivers/mongodb/mongodb-driver.js.map +1 -0
  17. package/cjs/drivers/{mongo/mongo-id-generator.d.ts → mongodb/mongodb-id-generator.d.ts} +1 -1
  18. package/cjs/drivers/mongodb/mongodb-id-generator.d.ts.map +1 -0
  19. package/cjs/drivers/{mongo/mongo-id-generator.js → mongodb/mongodb-id-generator.js} +1 -1
  20. package/cjs/drivers/mongodb/mongodb-id-generator.js.map +1 -0
  21. package/cjs/drivers/{mongo/mongo-migration-driver.d.ts → mongodb/mongodb-migration-driver.d.ts} +10 -1
  22. package/cjs/drivers/mongodb/mongodb-migration-driver.d.ts.map +1 -0
  23. package/cjs/drivers/{mongo/mongo-migration-driver.js → mongodb/mongodb-migration-driver.js} +18 -1
  24. package/cjs/drivers/mongodb/mongodb-migration-driver.js.map +1 -0
  25. package/cjs/drivers/{mongo/mongo-query-builder.d.ts → mongodb/mongodb-query-builder.d.ts} +172 -4
  26. package/cjs/drivers/mongodb/mongodb-query-builder.d.ts.map +1 -0
  27. package/cjs/drivers/{mongo/mongo-query-builder.js → mongodb/mongodb-query-builder.js} +220 -14
  28. package/cjs/drivers/mongodb/mongodb-query-builder.js.map +1 -0
  29. package/{esm/drivers/mongo/mongo-query-operations.d.ts → cjs/drivers/mongodb/mongodb-query-operations.d.ts} +16 -16
  30. package/cjs/drivers/mongodb/mongodb-query-operations.d.ts.map +1 -0
  31. package/cjs/drivers/{mongo/mongo-query-operations.js → mongodb/mongodb-query-operations.js} +22 -22
  32. package/cjs/drivers/mongodb/mongodb-query-operations.js.map +1 -0
  33. package/cjs/drivers/{mongo/mongo-query-parser.d.ts → mongodb/mongodb-query-parser.d.ts} +2 -2
  34. package/cjs/drivers/mongodb/mongodb-query-parser.d.ts.map +1 -0
  35. package/cjs/drivers/{mongo/mongo-query-parser.js → mongodb/mongodb-query-parser.js} +87 -87
  36. package/cjs/drivers/mongodb/mongodb-query-parser.js.map +1 -0
  37. package/cjs/drivers/{mongo/mongo-sync-adapter.d.ts → mongodb/mongodb-sync-adapter.d.ts} +2 -2
  38. package/cjs/drivers/mongodb/mongodb-sync-adapter.d.ts.map +1 -0
  39. package/cjs/drivers/{mongo/mongo-sync-adapter.js → mongodb/mongodb-sync-adapter.js} +2 -2
  40. package/cjs/drivers/mongodb/mongodb-sync-adapter.js.map +1 -0
  41. package/{esm/drivers/mongo → cjs/drivers/mongodb}/types.d.ts +2 -2
  42. package/cjs/drivers/mongodb/types.d.ts.map +1 -0
  43. package/cjs/drivers/postgres/index.d.ts +16 -0
  44. package/cjs/drivers/postgres/index.d.ts.map +1 -0
  45. package/cjs/drivers/postgres/postgres-blueprint.d.ts +64 -0
  46. package/cjs/drivers/postgres/postgres-blueprint.d.ts.map +1 -0
  47. package/cjs/drivers/postgres/postgres-blueprint.js +121 -0
  48. package/cjs/drivers/postgres/postgres-blueprint.js.map +1 -0
  49. package/cjs/drivers/postgres/postgres-dialect.d.ts +135 -0
  50. package/cjs/drivers/postgres/postgres-dialect.d.ts.map +1 -0
  51. package/cjs/drivers/postgres/postgres-dialect.js +245 -0
  52. package/cjs/drivers/postgres/postgres-dialect.js.map +1 -0
  53. package/cjs/drivers/postgres/postgres-driver.d.ts +360 -0
  54. package/cjs/drivers/postgres/postgres-driver.d.ts.map +1 -0
  55. package/cjs/drivers/postgres/postgres-driver.js +763 -0
  56. package/cjs/drivers/postgres/postgres-driver.js.map +1 -0
  57. package/cjs/drivers/postgres/postgres-migration-driver.d.ts +297 -0
  58. package/cjs/drivers/postgres/postgres-migration-driver.d.ts.map +1 -0
  59. package/cjs/drivers/postgres/postgres-migration-driver.js +578 -0
  60. package/cjs/drivers/postgres/postgres-migration-driver.js.map +1 -0
  61. package/cjs/drivers/postgres/postgres-query-builder.d.ts +824 -0
  62. package/cjs/drivers/postgres/postgres-query-builder.d.ts.map +1 -0
  63. package/cjs/drivers/postgres/postgres-query-builder.js +1800 -0
  64. package/cjs/drivers/postgres/postgres-query-builder.js.map +1 -0
  65. package/cjs/drivers/postgres/postgres-query-parser.d.ts +308 -0
  66. package/cjs/drivers/postgres/postgres-query-parser.d.ts.map +1 -0
  67. package/cjs/drivers/postgres/postgres-query-parser.js +706 -0
  68. package/cjs/drivers/postgres/postgres-query-parser.js.map +1 -0
  69. package/cjs/drivers/postgres/postgres-sync-adapter.d.ts +83 -0
  70. package/cjs/drivers/postgres/postgres-sync-adapter.d.ts.map +1 -0
  71. package/cjs/drivers/postgres/postgres-sync-adapter.js +197 -0
  72. package/cjs/drivers/postgres/postgres-sync-adapter.js.map +1 -0
  73. package/cjs/drivers/postgres/types.d.ts +142 -0
  74. package/cjs/drivers/postgres/types.d.ts.map +1 -0
  75. package/cjs/drivers/sql/index.d.ts +10 -0
  76. package/cjs/drivers/sql/index.d.ts.map +1 -0
  77. package/cjs/drivers/sql/sql-dialect.contract.d.ts +203 -0
  78. package/cjs/drivers/sql/sql-dialect.contract.d.ts.map +1 -0
  79. package/cjs/drivers/sql/sql-types.d.ts +202 -0
  80. package/cjs/drivers/sql/sql-types.d.ts.map +1 -0
  81. package/cjs/index.d.ts +9 -6
  82. package/cjs/index.d.ts.map +1 -1
  83. package/cjs/index.js +1 -1
  84. package/cjs/migration/migration-runner.d.ts.map +1 -1
  85. package/cjs/migration/migration-runner.js +3 -0
  86. package/cjs/migration/migration-runner.js.map +1 -1
  87. package/cjs/model/model.d.ts +236 -1
  88. package/cjs/model/model.d.ts.map +1 -1
  89. package/cjs/model/model.js +203 -4
  90. package/cjs/model/model.js.map +1 -1
  91. package/cjs/relations/helpers.d.ts +156 -0
  92. package/cjs/relations/helpers.d.ts.map +1 -0
  93. package/cjs/relations/helpers.js +197 -0
  94. package/cjs/relations/helpers.js.map +1 -0
  95. package/cjs/relations/index.d.ts +33 -0
  96. package/cjs/relations/index.d.ts.map +1 -0
  97. package/cjs/relations/pivot-operations.d.ts +160 -0
  98. package/cjs/relations/pivot-operations.d.ts.map +1 -0
  99. package/cjs/relations/pivot-operations.js +293 -0
  100. package/cjs/relations/pivot-operations.js.map +1 -0
  101. package/cjs/relations/relation-loader.d.ts +194 -0
  102. package/cjs/relations/relation-loader.d.ts.map +1 -0
  103. package/cjs/relations/relation-loader.js +466 -0
  104. package/cjs/relations/relation-loader.js.map +1 -0
  105. package/cjs/relations/types.d.ts +280 -0
  106. package/cjs/relations/types.d.ts.map +1 -0
  107. package/cjs/sync/model-sync-operation.js +1 -1
  108. package/cjs/sync/model-sync-operation.js.map +1 -1
  109. package/cjs/utils/connect-to-database.d.ts.map +1 -1
  110. package/cjs/utils/connect-to-database.js +15 -3
  111. package/cjs/utils/connect-to-database.js.map +1 -1
  112. package/cjs/utils/define-model.d.ts +51 -29
  113. package/cjs/utils/define-model.d.ts.map +1 -1
  114. package/cjs/validation/rules/database-model-rule.js +1 -1
  115. package/cjs/validation/rules/database-model-rule.js.map +1 -1
  116. package/esm/contracts/database-driver.contract.d.ts +118 -0
  117. package/esm/contracts/database-driver.contract.d.ts.map +1 -1
  118. package/esm/contracts/migration-driver.contract.d.ts +14 -0
  119. package/esm/contracts/migration-driver.contract.d.ts.map +1 -1
  120. package/esm/contracts/query-builder.contract.d.ts +410 -1
  121. package/esm/contracts/query-builder.contract.d.ts.map +1 -1
  122. package/esm/data-source/data-source-registry.d.ts +4 -0
  123. package/esm/data-source/data-source-registry.d.ts.map +1 -1
  124. package/esm/data-source/data-source-registry.js +7 -0
  125. package/esm/data-source/data-source-registry.js.map +1 -1
  126. package/esm/drivers/mongodb/mongodb-blueprint.d.ts.map +1 -0
  127. package/esm/drivers/mongodb/mongodb-blueprint.js.map +1 -0
  128. package/{cjs/drivers/mongo → esm/drivers/mongodb}/mongodb-driver.d.ts +49 -0
  129. package/esm/drivers/mongodb/mongodb-driver.d.ts.map +1 -0
  130. package/esm/drivers/{mongo → mongodb}/mongodb-driver.js +121 -4
  131. package/esm/drivers/mongodb/mongodb-driver.js.map +1 -0
  132. package/esm/drivers/{mongo/mongo-id-generator.d.ts → mongodb/mongodb-id-generator.d.ts} +1 -1
  133. package/esm/drivers/mongodb/mongodb-id-generator.d.ts.map +1 -0
  134. package/esm/drivers/{mongo/mongo-id-generator.js → mongodb/mongodb-id-generator.js} +1 -1
  135. package/esm/drivers/mongodb/mongodb-id-generator.js.map +1 -0
  136. package/esm/drivers/{mongo/mongo-migration-driver.d.ts → mongodb/mongodb-migration-driver.d.ts} +10 -1
  137. package/esm/drivers/mongodb/mongodb-migration-driver.d.ts.map +1 -0
  138. package/esm/drivers/{mongo/mongo-migration-driver.js → mongodb/mongodb-migration-driver.js} +18 -1
  139. package/esm/drivers/mongodb/mongodb-migration-driver.js.map +1 -0
  140. package/esm/drivers/{mongo/mongo-query-builder.d.ts → mongodb/mongodb-query-builder.d.ts} +172 -4
  141. package/esm/drivers/mongodb/mongodb-query-builder.d.ts.map +1 -0
  142. package/esm/drivers/{mongo/mongo-query-builder.js → mongodb/mongodb-query-builder.js} +218 -12
  143. package/esm/drivers/mongodb/mongodb-query-builder.js.map +1 -0
  144. package/{cjs/drivers/mongo/mongo-query-operations.d.ts → esm/drivers/mongodb/mongodb-query-operations.d.ts} +16 -16
  145. package/esm/drivers/mongodb/mongodb-query-operations.d.ts.map +1 -0
  146. package/esm/drivers/{mongo/mongo-query-operations.js → mongodb/mongodb-query-operations.js} +22 -22
  147. package/esm/drivers/mongodb/mongodb-query-operations.js.map +1 -0
  148. package/esm/drivers/{mongo/mongo-query-parser.d.ts → mongodb/mongodb-query-parser.d.ts} +2 -2
  149. package/esm/drivers/mongodb/mongodb-query-parser.d.ts.map +1 -0
  150. package/esm/drivers/{mongo/mongo-query-parser.js → mongodb/mongodb-query-parser.js} +87 -87
  151. package/esm/drivers/mongodb/mongodb-query-parser.js.map +1 -0
  152. package/esm/drivers/{mongo/mongo-sync-adapter.d.ts → mongodb/mongodb-sync-adapter.d.ts} +2 -2
  153. package/esm/drivers/mongodb/mongodb-sync-adapter.d.ts.map +1 -0
  154. package/esm/drivers/{mongo/mongo-sync-adapter.js → mongodb/mongodb-sync-adapter.js} +2 -2
  155. package/esm/drivers/mongodb/mongodb-sync-adapter.js.map +1 -0
  156. package/{cjs/drivers/mongo → esm/drivers/mongodb}/types.d.ts +2 -2
  157. package/esm/drivers/mongodb/types.d.ts.map +1 -0
  158. package/esm/drivers/postgres/index.d.ts +16 -0
  159. package/esm/drivers/postgres/index.d.ts.map +1 -0
  160. package/esm/drivers/postgres/postgres-blueprint.d.ts +64 -0
  161. package/esm/drivers/postgres/postgres-blueprint.d.ts.map +1 -0
  162. package/esm/drivers/postgres/postgres-blueprint.js +121 -0
  163. package/esm/drivers/postgres/postgres-blueprint.js.map +1 -0
  164. package/esm/drivers/postgres/postgres-dialect.d.ts +135 -0
  165. package/esm/drivers/postgres/postgres-dialect.d.ts.map +1 -0
  166. package/esm/drivers/postgres/postgres-dialect.js +245 -0
  167. package/esm/drivers/postgres/postgres-dialect.js.map +1 -0
  168. package/esm/drivers/postgres/postgres-driver.d.ts +360 -0
  169. package/esm/drivers/postgres/postgres-driver.d.ts.map +1 -0
  170. package/esm/drivers/postgres/postgres-driver.js +763 -0
  171. package/esm/drivers/postgres/postgres-driver.js.map +1 -0
  172. package/esm/drivers/postgres/postgres-migration-driver.d.ts +297 -0
  173. package/esm/drivers/postgres/postgres-migration-driver.d.ts.map +1 -0
  174. package/esm/drivers/postgres/postgres-migration-driver.js +578 -0
  175. package/esm/drivers/postgres/postgres-migration-driver.js.map +1 -0
  176. package/esm/drivers/postgres/postgres-query-builder.d.ts +824 -0
  177. package/esm/drivers/postgres/postgres-query-builder.d.ts.map +1 -0
  178. package/esm/drivers/postgres/postgres-query-builder.js +1800 -0
  179. package/esm/drivers/postgres/postgres-query-builder.js.map +1 -0
  180. package/esm/drivers/postgres/postgres-query-parser.d.ts +308 -0
  181. package/esm/drivers/postgres/postgres-query-parser.d.ts.map +1 -0
  182. package/esm/drivers/postgres/postgres-query-parser.js +706 -0
  183. package/esm/drivers/postgres/postgres-query-parser.js.map +1 -0
  184. package/esm/drivers/postgres/postgres-sync-adapter.d.ts +83 -0
  185. package/esm/drivers/postgres/postgres-sync-adapter.d.ts.map +1 -0
  186. package/esm/drivers/postgres/postgres-sync-adapter.js +197 -0
  187. package/esm/drivers/postgres/postgres-sync-adapter.js.map +1 -0
  188. package/esm/drivers/postgres/types.d.ts +142 -0
  189. package/esm/drivers/postgres/types.d.ts.map +1 -0
  190. package/esm/drivers/sql/index.d.ts +10 -0
  191. package/esm/drivers/sql/index.d.ts.map +1 -0
  192. package/esm/drivers/sql/sql-dialect.contract.d.ts +203 -0
  193. package/esm/drivers/sql/sql-dialect.contract.d.ts.map +1 -0
  194. package/esm/drivers/sql/sql-types.d.ts +202 -0
  195. package/esm/drivers/sql/sql-types.d.ts.map +1 -0
  196. package/esm/index.d.ts +9 -6
  197. package/esm/index.d.ts.map +1 -1
  198. package/esm/index.js +1 -1
  199. package/esm/migration/migration-runner.d.ts.map +1 -1
  200. package/esm/migration/migration-runner.js +3 -0
  201. package/esm/migration/migration-runner.js.map +1 -1
  202. package/esm/model/model.d.ts +236 -1
  203. package/esm/model/model.d.ts.map +1 -1
  204. package/esm/model/model.js +203 -4
  205. package/esm/model/model.js.map +1 -1
  206. package/esm/relations/helpers.d.ts +156 -0
  207. package/esm/relations/helpers.d.ts.map +1 -0
  208. package/esm/relations/helpers.js +197 -0
  209. package/esm/relations/helpers.js.map +1 -0
  210. package/esm/relations/index.d.ts +33 -0
  211. package/esm/relations/index.d.ts.map +1 -0
  212. package/esm/relations/pivot-operations.d.ts +160 -0
  213. package/esm/relations/pivot-operations.d.ts.map +1 -0
  214. package/esm/relations/pivot-operations.js +293 -0
  215. package/esm/relations/pivot-operations.js.map +1 -0
  216. package/esm/relations/relation-loader.d.ts +194 -0
  217. package/esm/relations/relation-loader.d.ts.map +1 -0
  218. package/esm/relations/relation-loader.js +466 -0
  219. package/esm/relations/relation-loader.js.map +1 -0
  220. package/esm/relations/types.d.ts +280 -0
  221. package/esm/relations/types.d.ts.map +1 -0
  222. package/esm/sync/model-sync-operation.js +1 -1
  223. package/esm/sync/model-sync-operation.js.map +1 -1
  224. package/esm/utils/connect-to-database.d.ts.map +1 -1
  225. package/esm/utils/connect-to-database.js +15 -3
  226. package/esm/utils/connect-to-database.js.map +1 -1
  227. package/esm/utils/define-model.d.ts +51 -29
  228. package/esm/utils/define-model.d.ts.map +1 -1
  229. package/esm/validation/rules/database-model-rule.js +1 -1
  230. package/esm/validation/rules/database-model-rule.js.map +1 -1
  231. package/package.json +4 -4
  232. package/cjs/drivers/mongo/mongo-id-generator.d.ts.map +0 -1
  233. package/cjs/drivers/mongo/mongo-id-generator.js.map +0 -1
  234. package/cjs/drivers/mongo/mongo-migration-driver.d.ts.map +0 -1
  235. package/cjs/drivers/mongo/mongo-migration-driver.js.map +0 -1
  236. package/cjs/drivers/mongo/mongo-query-builder.d.ts.map +0 -1
  237. package/cjs/drivers/mongo/mongo-query-builder.js.map +0 -1
  238. package/cjs/drivers/mongo/mongo-query-operations.d.ts.map +0 -1
  239. package/cjs/drivers/mongo/mongo-query-operations.js.map +0 -1
  240. package/cjs/drivers/mongo/mongo-query-parser.d.ts.map +0 -1
  241. package/cjs/drivers/mongo/mongo-query-parser.js.map +0 -1
  242. package/cjs/drivers/mongo/mongo-sync-adapter.d.ts.map +0 -1
  243. package/cjs/drivers/mongo/mongo-sync-adapter.js.map +0 -1
  244. package/cjs/drivers/mongo/mongodb-blueprint.d.ts.map +0 -1
  245. package/cjs/drivers/mongo/mongodb-blueprint.js.map +0 -1
  246. package/cjs/drivers/mongo/mongodb-driver.d.ts.map +0 -1
  247. package/cjs/drivers/mongo/mongodb-driver.js.map +0 -1
  248. package/cjs/drivers/mongo/types.d.ts.map +0 -1
  249. package/esm/drivers/mongo/mongo-id-generator.d.ts.map +0 -1
  250. package/esm/drivers/mongo/mongo-id-generator.js.map +0 -1
  251. package/esm/drivers/mongo/mongo-migration-driver.d.ts.map +0 -1
  252. package/esm/drivers/mongo/mongo-migration-driver.js.map +0 -1
  253. package/esm/drivers/mongo/mongo-query-builder.d.ts.map +0 -1
  254. package/esm/drivers/mongo/mongo-query-builder.js.map +0 -1
  255. package/esm/drivers/mongo/mongo-query-operations.d.ts.map +0 -1
  256. package/esm/drivers/mongo/mongo-query-operations.js.map +0 -1
  257. package/esm/drivers/mongo/mongo-query-parser.d.ts.map +0 -1
  258. package/esm/drivers/mongo/mongo-query-parser.js.map +0 -1
  259. package/esm/drivers/mongo/mongo-sync-adapter.d.ts.map +0 -1
  260. package/esm/drivers/mongo/mongo-sync-adapter.js.map +0 -1
  261. package/esm/drivers/mongo/mongodb-blueprint.d.ts.map +0 -1
  262. package/esm/drivers/mongo/mongodb-blueprint.js.map +0 -1
  263. package/esm/drivers/mongo/mongodb-driver.d.ts.map +0 -1
  264. package/esm/drivers/mongo/mongodb-driver.js.map +0 -1
  265. package/esm/drivers/mongo/types.d.ts.map +0 -1
  266. /package/cjs/drivers/{mongo → mongodb}/mongodb-blueprint.d.ts +0 -0
  267. /package/cjs/drivers/{mongo → mongodb}/mongodb-blueprint.js +0 -0
  268. /package/esm/drivers/{mongo → mongodb}/mongodb-blueprint.d.ts +0 -0
  269. /package/esm/drivers/{mongo → mongodb}/mongodb-blueprint.js +0 -0
@@ -0,0 +1,466 @@
1
+ import {getModelFromRegistry}from'../model/register-model.js';/**
2
+ * @fileoverview Core relation loading logic for the Cascade ORM.
3
+ *
4
+ * The RelationLoader is responsible for efficiently loading related models
5
+ * while preventing N+1 query problems through batch loading strategies.
6
+ *
7
+ * @module @warlock.js/cascade/relations/relation-loader
8
+ */
9
+ // ============================================================================
10
+ // RELATION LOADER CLASS
11
+ // ============================================================================
12
+ /**
13
+ * Efficiently loads relationships for one or more model instances.
14
+ *
15
+ * The RelationLoader handles:
16
+ * - Batch loading to prevent N+1 query problems
17
+ * - Nested relation loading via dot notation
18
+ * - Constrained loading with query callbacks
19
+ * - All relation types (hasOne, hasMany, belongsTo, belongsToMany)
20
+ *
21
+ * @template TModel - The type of model being loaded
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const users = await User.query().get();
26
+ * const loader = new RelationLoader(users, User);
27
+ *
28
+ * // Load single relation
29
+ * await loader.load("posts");
30
+ *
31
+ * // Load multiple relations
32
+ * await loader.load(["posts", "organization"]);
33
+ *
34
+ * // Load nested relations
35
+ * await loader.load("posts.comments.author");
36
+ *
37
+ * // Load with constraints
38
+ * await loader.load("posts", {
39
+ * posts: (query) => query.where("isPublished", true),
40
+ * });
41
+ * ```
42
+ */
43
+ class RelationLoader {
44
+ // ==========================================================================
45
+ // PRIVATE PROPERTIES
46
+ // ==========================================================================
47
+ /**
48
+ * The model instances to load relations for.
49
+ */
50
+ models;
51
+ /**
52
+ * The model class constructor.
53
+ */
54
+ modelClass;
55
+ // ==========================================================================
56
+ // CONSTRUCTOR
57
+ // ==========================================================================
58
+ /**
59
+ * Creates a new RelationLoader instance.
60
+ *
61
+ * @param models - The model instances to load relations for
62
+ * @param modelClass - The model class constructor
63
+ */
64
+ constructor(models, modelClass) {
65
+ this.models = models;
66
+ this.modelClass = modelClass;
67
+ }
68
+ // ==========================================================================
69
+ // PUBLIC METHODS
70
+ // ==========================================================================
71
+ /**
72
+ * Loads one or more relations for all model instances.
73
+ *
74
+ * @param relations - A single relation name, array of names, or constraints object
75
+ * @param constraints - Optional constraints to apply to the loading query
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * // Single relation
80
+ * await loader.load("posts");
81
+ *
82
+ * // Multiple relations
83
+ * await loader.load(["posts", "organization"]);
84
+ *
85
+ * // With constraints
86
+ * await loader.load("posts", {
87
+ * posts: (query) => query.where("status", "active"),
88
+ * });
89
+ * ```
90
+ */
91
+ async load(relations, constraints) {
92
+ // If no models, nothing to load
93
+ if (this.models.length === 0) {
94
+ return;
95
+ }
96
+ // Normalize to array
97
+ const relationNames = Array.isArray(relations) ? relations : [relations];
98
+ // Load each relation
99
+ for (const relationName of relationNames) {
100
+ const constraint = constraints?.[relationName];
101
+ const callbackConstraint = typeof constraint === "function" ? constraint : undefined;
102
+ await this.loadRelation(relationName, callbackConstraint);
103
+ }
104
+ }
105
+ // ==========================================================================
106
+ // PRIVATE METHODS - RELATION LOADING
107
+ // ==========================================================================
108
+ /**
109
+ * Loads a single relation, handling nested relations via dot notation.
110
+ *
111
+ * @param name - The relation name, possibly with dot notation for nesting
112
+ * @param constraint - Optional constraint callback
113
+ */
114
+ async loadRelation(name, constraint) {
115
+ const path = this.parseNestedRelation(name);
116
+ const rootRelation = path[0];
117
+ // Get the relation definition from the model class
118
+ const definition = this.getRelationDefinition(rootRelation);
119
+ if (!definition) {
120
+ throw new Error(`Relation "${rootRelation}" is not defined on model "${this.modelClass.name}". ` +
121
+ `Make sure to define it in the static 'relations' property.`);
122
+ }
123
+ // Load based on relation type
124
+ switch (definition.type) {
125
+ case "hasMany":
126
+ await this.loadHasMany(rootRelation, definition, constraint);
127
+ break;
128
+ case "hasOne":
129
+ await this.loadHasOne(rootRelation, definition, constraint);
130
+ break;
131
+ case "belongsTo":
132
+ await this.loadBelongsTo(rootRelation, definition, constraint);
133
+ break;
134
+ case "belongsToMany":
135
+ await this.loadBelongsToMany(rootRelation, definition, constraint);
136
+ break;
137
+ }
138
+ // If there are nested relations, load them recursively
139
+ if (path.length > 1) {
140
+ await this.loadNestedRelations(rootRelation, path.slice(1), constraint);
141
+ }
142
+ }
143
+ /**
144
+ * Loads a hasMany relation for all models.
145
+ *
146
+ * @param name - The relation name
147
+ * @param definition - The relation definition
148
+ * @param constraint - Optional constraint callback
149
+ */
150
+ async loadHasMany(name, definition, constraint) {
151
+ const RelatedModel = this.resolveModelClass(definition.model);
152
+ const localKey = definition.localKey ?? "id";
153
+ const foreignKey = definition.foreignKey ?? this.inferForeignKey(this.modelClass.name);
154
+ // Collect all local key values
155
+ const localKeyValues = this.collectKeyValues(localKey);
156
+ if (localKeyValues.length === 0) {
157
+ // No values to query, set empty arrays
158
+ this.setRelationOnModels(name, () => []);
159
+ return;
160
+ }
161
+ // Build and execute query
162
+ const query = RelatedModel.query().whereIn(foreignKey, localKeyValues);
163
+ if (constraint) {
164
+ constraint(query);
165
+ }
166
+ const relatedRecords = await query.get();
167
+ // Group by foreign key and assign to models
168
+ const recordsByForeignKey = this.groupBy(relatedRecords, foreignKey);
169
+ this.setRelationOnModels(name, (model) => {
170
+ const keyValue = model.get(localKey);
171
+ return recordsByForeignKey.get(keyValue) ?? [];
172
+ });
173
+ }
174
+ /**
175
+ * Loads a hasOne relation for all models.
176
+ *
177
+ * @param name - The relation name
178
+ * @param definition - The relation definition
179
+ * @param constraint - Optional constraint callback
180
+ */
181
+ async loadHasOne(name, definition, constraint) {
182
+ const RelatedModel = this.resolveModelClass(definition.model);
183
+ const localKey = definition.localKey ?? "id";
184
+ const foreignKey = definition.foreignKey ?? this.inferForeignKey(this.modelClass.name);
185
+ // Collect all local key values
186
+ const localKeyValues = this.collectKeyValues(localKey);
187
+ if (localKeyValues.length === 0) {
188
+ this.setRelationOnModels(name, () => null);
189
+ return;
190
+ }
191
+ // Build and execute query
192
+ const query = RelatedModel.query().whereIn(foreignKey, localKeyValues);
193
+ if (constraint) {
194
+ constraint(query);
195
+ }
196
+ const relatedRecords = await query.get();
197
+ // Index by foreign key
198
+ const recordsByForeignKey = new Map();
199
+ for (const record of relatedRecords) {
200
+ const fkValue = record.get(foreignKey);
201
+ // For hasOne, take the first match only
202
+ if (!recordsByForeignKey.has(fkValue)) {
203
+ recordsByForeignKey.set(fkValue, record);
204
+ }
205
+ }
206
+ this.setRelationOnModels(name, (model) => {
207
+ const keyValue = model.get(localKey);
208
+ return recordsByForeignKey.get(keyValue) ?? null;
209
+ });
210
+ }
211
+ /**
212
+ * Loads a belongsTo relation for all models.
213
+ *
214
+ * @param name - The relation name
215
+ * @param definition - The relation definition
216
+ * @param constraint - Optional constraint callback
217
+ */
218
+ async loadBelongsTo(name, definition, constraint) {
219
+ const RelatedModel = this.resolveModelClass(definition.model);
220
+ const foreignKey = definition.foreignKey ?? `${name}Id`;
221
+ const ownerKey = definition.localKey ?? "id";
222
+ // Collect all foreign key values from the models
223
+ const foreignKeyValues = this.collectKeyValues(foreignKey);
224
+ if (foreignKeyValues.length === 0) {
225
+ this.setRelationOnModels(name, () => null);
226
+ return;
227
+ }
228
+ // Build and execute query
229
+ const query = RelatedModel.query().whereIn(ownerKey, foreignKeyValues);
230
+ if (constraint) {
231
+ constraint(query);
232
+ }
233
+ const relatedRecords = await query.get();
234
+ // Index by owner key
235
+ const recordsByOwnerKey = new Map();
236
+ for (const record of relatedRecords) {
237
+ const keyValue = record.get(ownerKey);
238
+ recordsByOwnerKey.set(keyValue, record);
239
+ }
240
+ this.setRelationOnModels(name, (model) => {
241
+ const fkValue = model.get(foreignKey);
242
+ return recordsByOwnerKey.get(fkValue) ?? null;
243
+ });
244
+ }
245
+ /**
246
+ * Loads a belongsToMany relation for all models.
247
+ *
248
+ * @param name - The relation name
249
+ * @param definition - The relation definition
250
+ * @param constraint - Optional constraint callback
251
+ */
252
+ async loadBelongsToMany(name, definition, constraint) {
253
+ if (!definition.pivot) {
254
+ throw new Error(`belongsToMany relation "${name}" requires a pivot table. ` +
255
+ `Make sure to specify the 'pivot' option.`);
256
+ }
257
+ const RelatedModel = this.resolveModelClass(definition.model);
258
+ const pivotTable = definition.pivot;
259
+ const localKey = definition.pivotLocalKey ?? "id";
260
+ const pivotLocalKey = definition.localKey ?? this.inferForeignKey(this.modelClass.name);
261
+ const pivotForeignKey = definition.foreignKey ?? this.inferForeignKey(definition.model);
262
+ const relatedKey = definition.pivotForeignKey ?? "id";
263
+ // Collect all local key values
264
+ const localKeyValues = this.collectKeyValues(localKey);
265
+ if (localKeyValues.length === 0) {
266
+ this.setRelationOnModels(name, () => []);
267
+ return;
268
+ }
269
+ // Step 1: Query the pivot table to get the relationships
270
+ const dataSource = this.modelClass.getDataSource();
271
+ const pivotQuery = dataSource.driver
272
+ .queryBuilder(pivotTable)
273
+ .whereIn(pivotLocalKey, localKeyValues);
274
+ const pivotRecords = (await pivotQuery.get());
275
+ if (pivotRecords.length === 0) {
276
+ this.setRelationOnModels(name, () => []);
277
+ return;
278
+ }
279
+ // Step 2: Collect related model IDs from pivot
280
+ const relatedIds = [...new Set(pivotRecords.map((p) => p[pivotForeignKey]))];
281
+ // Step 3: Query the related model
282
+ const relatedQuery = RelatedModel.query().whereIn(relatedKey, relatedIds);
283
+ if (constraint) {
284
+ constraint(relatedQuery);
285
+ }
286
+ const relatedRecords = await relatedQuery.get();
287
+ // Step 4: Index related records by their key
288
+ const relatedById = new Map();
289
+ for (const record of relatedRecords) {
290
+ relatedById.set(record.get(relatedKey), record);
291
+ }
292
+ // Step 5: Build the relationship map from pivot data
293
+ const relationshipMap = new Map();
294
+ for (const pivot of pivotRecords) {
295
+ const localValue = pivot[pivotLocalKey];
296
+ const foreignValue = pivot[pivotForeignKey];
297
+ const relatedRecord = relatedById.get(foreignValue);
298
+ if (relatedRecord) {
299
+ if (!relationshipMap.has(localValue)) {
300
+ relationshipMap.set(localValue, []);
301
+ }
302
+ relationshipMap.get(localValue).push(relatedRecord);
303
+ }
304
+ }
305
+ this.setRelationOnModels(name, (model) => {
306
+ const keyValue = model.get(localKey);
307
+ return relationshipMap.get(keyValue) ?? [];
308
+ });
309
+ }
310
+ // ==========================================================================
311
+ // PRIVATE METHODS - NESTED RELATIONS
312
+ // ==========================================================================
313
+ /**
314
+ * Loads nested relations recursively.
315
+ *
316
+ * @param parentRelation - The name of the parent relation
317
+ * @param remainingPath - The remaining path segments to load
318
+ * @param constraint - Optional constraint callback
319
+ */
320
+ async loadNestedRelations(parentRelation, remainingPath, constraint) {
321
+ // Collect all loaded related models from the parent relation
322
+ const relatedModels = [];
323
+ for (const model of this.models) {
324
+ const loaded = this.getLoadedRelation(model, parentRelation);
325
+ if (Array.isArray(loaded)) {
326
+ relatedModels.push(...loaded);
327
+ }
328
+ else if (loaded) {
329
+ relatedModels.push(loaded);
330
+ }
331
+ }
332
+ if (relatedModels.length === 0) {
333
+ return;
334
+ }
335
+ // Get the related model class
336
+ const parentDefinition = this.getRelationDefinition(parentRelation);
337
+ if (!parentDefinition)
338
+ return;
339
+ const RelatedModelClass = this.resolveModelClass(parentDefinition.model);
340
+ // Create a new loader for the nested relation
341
+ const nestedLoader = new RelationLoader(relatedModels, RelatedModelClass);
342
+ // Load the next level
343
+ const nextRelation = remainingPath.join(".");
344
+ await nestedLoader.load(nextRelation, constraint ? { [nextRelation]: constraint } : undefined);
345
+ }
346
+ // ==========================================================================
347
+ // PRIVATE METHODS - UTILITIES
348
+ // ==========================================================================
349
+ /**
350
+ * Parses a dot-notation relation path into segments.
351
+ *
352
+ * @param path - The relation path (e.g., "posts.comments.author")
353
+ * @returns An array of relation names
354
+ */
355
+ parseNestedRelation(path) {
356
+ return path.split(".");
357
+ }
358
+ /**
359
+ * Resolves a model class from the registry by name.
360
+ *
361
+ * @param name - The registered model name
362
+ * @returns The model class constructor
363
+ * @throws Error if the model is not found in the registry
364
+ */
365
+ resolveModelClass(name) {
366
+ const ModelClass = getModelFromRegistry(name);
367
+ if (!ModelClass) {
368
+ throw new Error(`Model "${name}" not found in registry. ` +
369
+ `Make sure it is decorated with @RegisterModel() and imported.`);
370
+ }
371
+ return ModelClass;
372
+ }
373
+ /**
374
+ * Gets the relation definition from the model class.
375
+ *
376
+ * @param name - The relation name
377
+ * @returns The relation definition or undefined
378
+ */
379
+ getRelationDefinition(name) {
380
+ const relations = this.modelClass.relations;
381
+ return relations?.[name];
382
+ }
383
+ /**
384
+ * Collects unique key values from all models.
385
+ *
386
+ * @param key - The key to collect values for
387
+ * @returns An array of unique key values
388
+ */
389
+ collectKeyValues(key) {
390
+ const values = new Set();
391
+ for (const model of this.models) {
392
+ const value = model.get(key);
393
+ if (value !== undefined && value !== null) {
394
+ values.add(value);
395
+ }
396
+ }
397
+ return [...values];
398
+ }
399
+ /**
400
+ * Groups records by a key value.
401
+ *
402
+ * @param records - The records to group
403
+ * @param key - The key to group by
404
+ * @returns A map of key values to records
405
+ */
406
+ groupBy(records, key) {
407
+ const groups = new Map();
408
+ for (const record of records) {
409
+ const keyValue = record.get(key);
410
+ if (!groups.has(keyValue)) {
411
+ groups.set(keyValue, []);
412
+ }
413
+ groups.get(keyValue).push(record);
414
+ }
415
+ return groups;
416
+ }
417
+ /**
418
+ * Infers a foreign key name from a model name.
419
+ *
420
+ * @param modelName - The model class name
421
+ * @returns The inferred foreign key (e.g., "User" -> "userId")
422
+ */
423
+ inferForeignKey(modelName) {
424
+ return `${modelName.charAt(0).toLowerCase()}${modelName.slice(1)}Id`;
425
+ }
426
+ /**
427
+ * Sets a relation value on all models using a getter function.
428
+ *
429
+ * @param name - The relation name
430
+ * @param getter - Function that returns the relation value for each model
431
+ */
432
+ setRelationOnModels(name, getter) {
433
+ for (const model of this.models) {
434
+ const value = getter(model);
435
+ this.setLoadedRelation(model, name, value);
436
+ }
437
+ }
438
+ /**
439
+ * Gets a loaded relation from a model instance.
440
+ *
441
+ * @param model - The model instance
442
+ * @param name - The relation name
443
+ * @returns The loaded relation value or undefined
444
+ */
445
+ getLoadedRelation(model, name) {
446
+ const loadedRelations = model.loadedRelations;
447
+ return loadedRelations?.get(name);
448
+ }
449
+ /**
450
+ * Sets a loaded relation on a model instance.
451
+ *
452
+ * @param model - The model instance
453
+ * @param name - The relation name
454
+ * @param value - The relation value
455
+ */
456
+ setLoadedRelation(model, name, value) {
457
+ // Ensure the model has a loadedRelations map
458
+ const modelWithRelations = model;
459
+ if (!modelWithRelations.loadedRelations) {
460
+ modelWithRelations.loadedRelations = new Map();
461
+ }
462
+ modelWithRelations.loadedRelations.set(name, value);
463
+ // Also set as a property for convenient access
464
+ model[name] = value;
465
+ }
466
+ }export{RelationLoader};//# sourceMappingURL=relation-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-loader.js","sources":["../../src/relations/relation-loader.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}