@woltz/rich-domain 1.8.0 → 1.8.2

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 (185) hide show
  1. package/README.md +106 -47
  2. package/dist/cjs/core/base-aggregate.d.ts +39 -0
  3. package/dist/cjs/core/base-aggregate.d.ts.map +1 -0
  4. package/dist/cjs/core/base-aggregate.js +57 -0
  5. package/dist/cjs/core/base-aggregate.js.map +1 -0
  6. package/dist/cjs/core/base-entity.d.ts +6 -22
  7. package/dist/cjs/core/base-entity.d.ts.map +1 -1
  8. package/dist/cjs/core/base-entity.js +5 -29
  9. package/dist/cjs/core/base-entity.js.map +1 -1
  10. package/dist/cjs/core/entity.d.ts +3 -2
  11. package/dist/cjs/core/entity.d.ts.map +1 -1
  12. package/dist/cjs/core/entity.js +2 -1
  13. package/dist/cjs/core/entity.js.map +1 -1
  14. package/dist/cjs/core/id.d.ts +9 -1
  15. package/dist/cjs/core/id.d.ts.map +1 -1
  16. package/dist/cjs/core/id.js +12 -0
  17. package/dist/cjs/core/id.js.map +1 -1
  18. package/dist/cjs/core/index.d.ts +1 -0
  19. package/dist/cjs/core/index.d.ts.map +1 -1
  20. package/dist/cjs/core/index.js +1 -0
  21. package/dist/cjs/core/index.js.map +1 -1
  22. package/dist/cjs/core/value-object.d.ts +0 -18
  23. package/dist/cjs/core/value-object.d.ts.map +1 -1
  24. package/dist/cjs/core/value-object.js +0 -25
  25. package/dist/cjs/core/value-object.js.map +1 -1
  26. package/dist/esm/core/base-aggregate.d.ts +39 -0
  27. package/dist/esm/core/base-aggregate.d.ts.map +1 -0
  28. package/dist/esm/core/base-aggregate.js +53 -0
  29. package/dist/esm/core/base-aggregate.js.map +1 -0
  30. package/dist/esm/core/base-entity.d.ts +6 -22
  31. package/dist/esm/core/base-entity.d.ts.map +1 -1
  32. package/dist/esm/core/base-entity.js +5 -29
  33. package/dist/esm/core/base-entity.js.map +1 -1
  34. package/dist/esm/core/entity.d.ts +3 -2
  35. package/dist/esm/core/entity.d.ts.map +1 -1
  36. package/dist/esm/core/entity.js +2 -1
  37. package/dist/esm/core/entity.js.map +1 -1
  38. package/dist/esm/core/id.d.ts +9 -1
  39. package/dist/esm/core/id.d.ts.map +1 -1
  40. package/dist/esm/core/id.js +12 -0
  41. package/dist/esm/core/id.js.map +1 -1
  42. package/dist/esm/core/index.d.ts +1 -0
  43. package/dist/esm/core/index.d.ts.map +1 -1
  44. package/dist/esm/core/index.js +1 -0
  45. package/dist/esm/core/index.js.map +1 -1
  46. package/dist/esm/core/value-object.d.ts +0 -18
  47. package/dist/esm/core/value-object.d.ts.map +1 -1
  48. package/dist/esm/core/value-object.js +0 -25
  49. package/dist/esm/core/value-object.js.map +1 -1
  50. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  51. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  52. package/dist/tsconfig.types.tsbuildinfo +1 -1
  53. package/dist/types/core/base-aggregate.d.ts +39 -0
  54. package/dist/types/core/base-aggregate.d.ts.map +1 -0
  55. package/dist/types/core/base-entity.d.ts +6 -22
  56. package/dist/types/core/base-entity.d.ts.map +1 -1
  57. package/dist/types/core/entity.d.ts +3 -2
  58. package/dist/types/core/entity.d.ts.map +1 -1
  59. package/dist/types/core/id.d.ts +9 -1
  60. package/dist/types/core/id.d.ts.map +1 -1
  61. package/dist/types/core/index.d.ts +1 -0
  62. package/dist/types/core/index.d.ts.map +1 -1
  63. package/dist/types/core/value-object.d.ts +0 -18
  64. package/dist/types/core/value-object.d.ts.map +1 -1
  65. package/package.json +1 -1
  66. package/dist/cjs/aggregate-changes.d.ts +0 -206
  67. package/dist/cjs/aggregate-changes.d.ts.map +0 -1
  68. package/dist/cjs/aggregate-changes.js +0 -365
  69. package/dist/cjs/aggregate-changes.js.map +0 -1
  70. package/dist/cjs/base-entity.d.ts +0 -90
  71. package/dist/cjs/base-entity.d.ts.map +0 -1
  72. package/dist/cjs/base-entity.js +0 -331
  73. package/dist/cjs/base-entity.js.map +0 -1
  74. package/dist/cjs/change-tracker.d.ts +0 -96
  75. package/dist/cjs/change-tracker.d.ts.map +0 -1
  76. package/dist/cjs/change-tracker.js +0 -789
  77. package/dist/cjs/change-tracker.js.map +0 -1
  78. package/dist/cjs/crypto.d.ts +0 -3
  79. package/dist/cjs/crypto.d.ts.map +0 -1
  80. package/dist/cjs/crypto.js +0 -32
  81. package/dist/cjs/crypto.js.map +0 -1
  82. package/dist/cjs/domain-event.d.ts +0 -23
  83. package/dist/cjs/domain-event.d.ts.map +0 -1
  84. package/dist/cjs/domain-event.js +0 -36
  85. package/dist/cjs/domain-event.js.map +0 -1
  86. package/dist/cjs/entity-changes.d.ts +0 -84
  87. package/dist/cjs/entity-changes.d.ts.map +0 -1
  88. package/dist/cjs/entity-changes.js +0 -136
  89. package/dist/cjs/entity-changes.js.map +0 -1
  90. package/dist/cjs/entity-schema-registry.d.ts +0 -282
  91. package/dist/cjs/entity-schema-registry.d.ts.map +0 -1
  92. package/dist/cjs/entity-schema-registry.js +0 -372
  93. package/dist/cjs/entity-schema-registry.js.map +0 -1
  94. package/dist/cjs/entity.d.ts +0 -7
  95. package/dist/cjs/entity.d.ts.map +0 -1
  96. package/dist/cjs/entity.js +0 -11
  97. package/dist/cjs/entity.js.map +0 -1
  98. package/dist/cjs/id.d.ts +0 -59
  99. package/dist/cjs/id.d.ts.map +0 -1
  100. package/dist/cjs/id.js +0 -92
  101. package/dist/cjs/id.js.map +0 -1
  102. package/dist/cjs/mapper.d.ts +0 -4
  103. package/dist/cjs/mapper.d.ts.map +0 -1
  104. package/dist/cjs/mapper.js +0 -7
  105. package/dist/cjs/mapper.js.map +0 -1
  106. package/dist/cjs/paginated-result.d.ts +0 -54
  107. package/dist/cjs/paginated-result.d.ts.map +0 -1
  108. package/dist/cjs/paginated-result.js +0 -197
  109. package/dist/cjs/paginated-result.js.map +0 -1
  110. package/dist/cjs/value-object.d.ts +0 -49
  111. package/dist/cjs/value-object.d.ts.map +0 -1
  112. package/dist/cjs/value-object.js +0 -129
  113. package/dist/cjs/value-object.js.map +0 -1
  114. package/dist/esm/aggregate-changes.d.ts +0 -206
  115. package/dist/esm/aggregate-changes.d.ts.map +0 -1
  116. package/dist/esm/aggregate-changes.js +0 -361
  117. package/dist/esm/aggregate-changes.js.map +0 -1
  118. package/dist/esm/base-entity.d.ts +0 -90
  119. package/dist/esm/base-entity.d.ts.map +0 -1
  120. package/dist/esm/base-entity.js +0 -327
  121. package/dist/esm/base-entity.js.map +0 -1
  122. package/dist/esm/change-tracker.d.ts +0 -96
  123. package/dist/esm/change-tracker.d.ts.map +0 -1
  124. package/dist/esm/change-tracker.js +0 -785
  125. package/dist/esm/change-tracker.js.map +0 -1
  126. package/dist/esm/crypto.d.ts +0 -3
  127. package/dist/esm/crypto.d.ts.map +0 -1
  128. package/dist/esm/crypto.js +0 -29
  129. package/dist/esm/crypto.js.map +0 -1
  130. package/dist/esm/domain-event.d.ts +0 -23
  131. package/dist/esm/domain-event.d.ts.map +0 -1
  132. package/dist/esm/domain-event.js +0 -32
  133. package/dist/esm/domain-event.js.map +0 -1
  134. package/dist/esm/entity-changes.d.ts +0 -84
  135. package/dist/esm/entity-changes.d.ts.map +0 -1
  136. package/dist/esm/entity-changes.js +0 -132
  137. package/dist/esm/entity-changes.js.map +0 -1
  138. package/dist/esm/entity-schema-registry.d.ts +0 -282
  139. package/dist/esm/entity-schema-registry.d.ts.map +0 -1
  140. package/dist/esm/entity-schema-registry.js +0 -368
  141. package/dist/esm/entity-schema-registry.js.map +0 -1
  142. package/dist/esm/entity.d.ts +0 -7
  143. package/dist/esm/entity.d.ts.map +0 -1
  144. package/dist/esm/entity.js +0 -6
  145. package/dist/esm/entity.js.map +0 -1
  146. package/dist/esm/id.d.ts +0 -59
  147. package/dist/esm/id.d.ts.map +0 -1
  148. package/dist/esm/id.js +0 -85
  149. package/dist/esm/id.js.map +0 -1
  150. package/dist/esm/mapper.d.ts +0 -4
  151. package/dist/esm/mapper.d.ts.map +0 -1
  152. package/dist/esm/mapper.js +0 -3
  153. package/dist/esm/mapper.js.map +0 -1
  154. package/dist/esm/paginated-result.d.ts +0 -54
  155. package/dist/esm/paginated-result.d.ts.map +0 -1
  156. package/dist/esm/paginated-result.js +0 -193
  157. package/dist/esm/paginated-result.js.map +0 -1
  158. package/dist/esm/value-object.d.ts +0 -49
  159. package/dist/esm/value-object.d.ts.map +0 -1
  160. package/dist/esm/value-object.js +0 -125
  161. package/dist/esm/value-object.js.map +0 -1
  162. package/dist/types/aggregate-changes.d.ts +0 -206
  163. package/dist/types/aggregate-changes.d.ts.map +0 -1
  164. package/dist/types/base-entity.d.ts +0 -90
  165. package/dist/types/base-entity.d.ts.map +0 -1
  166. package/dist/types/change-tracker.d.ts +0 -96
  167. package/dist/types/change-tracker.d.ts.map +0 -1
  168. package/dist/types/crypto.d.ts +0 -3
  169. package/dist/types/crypto.d.ts.map +0 -1
  170. package/dist/types/domain-event.d.ts +0 -23
  171. package/dist/types/domain-event.d.ts.map +0 -1
  172. package/dist/types/entity-changes.d.ts +0 -84
  173. package/dist/types/entity-changes.d.ts.map +0 -1
  174. package/dist/types/entity-schema-registry.d.ts +0 -282
  175. package/dist/types/entity-schema-registry.d.ts.map +0 -1
  176. package/dist/types/entity.d.ts +0 -7
  177. package/dist/types/entity.d.ts.map +0 -1
  178. package/dist/types/id.d.ts +0 -59
  179. package/dist/types/id.d.ts.map +0 -1
  180. package/dist/types/mapper.d.ts +0 -4
  181. package/dist/types/mapper.d.ts.map +0 -1
  182. package/dist/types/paginated-result.d.ts +0 -62
  183. package/dist/types/paginated-result.d.ts.map +0 -1
  184. package/dist/types/value-object.d.ts +0 -49
  185. package/dist/types/value-object.d.ts.map +0 -1
@@ -1,206 +0,0 @@
1
- import { Operation, CreateOperation, UpdateOperation, DeleteOperation, BatchOperations } from "./types/change-tracker.js";
2
- import { EntityChanges } from "./entity-changes.js";
3
- /**
4
- * Manages and organizes the changes of an Aggregate.
5
- *
6
- * Responsibilities:
7
- * - Stores all operations (create, update, delete)
8
- * - Orders operations respecting FK dependencies
9
- * - Groups operations by entity for batch execution
10
- * - Provides query and iteration methods
11
- * - Includes relationField, parentId, parentEntity for N:N support
12
- *
13
- * @example
14
- * ```typescript
15
- * // Define an entity map for type-safe operations
16
- * type UserEntities = {
17
- * User: User;
18
- * Post: Post;
19
- * Comment: Comment;
20
- * };
21
- *
22
- * // Getting changes with types
23
- * const changes = user.getChanges<UserEntities>();
24
- *
25
- * // Filtering by entity with autocompletion
26
- * const postChanges = changes.for('Post');
27
- * postChanges.creates.forEach(post => {
28
- * console.log(post.title);
29
- * });
30
- * ```
31
- */
32
- export declare class AggregateChanges<TEntityMap = Record<string, any>> {
33
- private ops;
34
- constructor(operations?: Operation[]);
35
- /**
36
- * Adds a create operation.
37
- *
38
- * @param entity - Entity name
39
- * @param data - Entity data
40
- * @param depth - Depth in the aggregate tree
41
- * @param parentId - Parent entity ID (for FK)
42
- * @param parentEntity - Parent entity name
43
- * @param relationField - Name of the relation field in parent (e.g., 'tags', 'comments')
44
- */
45
- addCreate<T>(entity: string, data: T, depth: number, parentId?: string, parentEntity?: string, relationField?: string): void;
46
- /**
47
- * Adds an update operation.
48
- */
49
- addUpdate<T>(entity: string, id: string, data: T, changedFields: Record<string, any>, depth: number): void;
50
- /**
51
- * Adds a delete operation.
52
- *
53
- * @param entity - Entity name
54
- * @param id - Entity ID
55
- * @param data - Entity data (for reference)
56
- * @param depth - Depth in the aggregate tree
57
- * @param relationField - Name of the relation field in parent (e.g., 'tags', 'comments')
58
- * @param parentId - Parent entity ID (for N:N disconnect)
59
- * @param parentEntity - Parent entity name (for N:N disconnect)
60
- */
61
- addDelete<T>(entity: string, id: string, data: T, depth: number, relationField?: string, parentId?: string, parentEntity?: string): void;
62
- /**
63
- * Returns all create operations, sorted by ascending depth (root → leaf).
64
- */
65
- creates(): CreateOperation[];
66
- /**
67
- * Returns all update operations.
68
- */
69
- updates(): UpdateOperation[];
70
- /**
71
- * Returns all delete operations, sorted by descending depth (leaf → root).
72
- */
73
- deletes(): DeleteOperation[];
74
- /**
75
- * Iterator that returns operations in the correct execution order:
76
- * 1. Deletes (leaf → root)
77
- * 2. Creates (root → leaf)
78
- * 3. Updates
79
- */
80
- operations(): Generator<Operation>;
81
- /**
82
- * Returns all operations as an array in execution order.
83
- */
84
- toArray(): Operation[];
85
- /**
86
- * Converts the changes into BatchOperations for optimized execution.
87
- *
88
- * Groups operations by entity and sorts by depth:
89
- * - Deletes: depth DESC (leaf → root), grouped by entity + relationField + parentId
90
- * - Creates: depth ASC (root → leaf), grouped by entity + relationField
91
- * - Updates: grouped by entity
92
- *
93
- * @example
94
- * ```typescript
95
- * const batch = changes.toBatchOperations();
96
- *
97
- * // Run deletes
98
- * for (const del of batch.deletes) {
99
- * if (registry.isReferenceCollection(del.parentEntity, del.relationField)) {
100
- * // N:N - disconnect only
101
- * await prisma[del.parentEntity].update({
102
- * where: { id: del.parentId },
103
- * data: { [del.relationField]: { disconnect: del.ids.map(id => ({ id })) } }
104
- * });
105
- * } else {
106
- * // 1:N - delete entities
107
- * await prisma[del.entity].deleteMany({ where: { id: { in: del.ids } } });
108
- * }
109
- * }
110
- * ```
111
- */
112
- toBatchOperations(): BatchOperations;
113
- /**
114
- * Groups deletes by entity + relationField + parentId, sorted by descending depth.
115
- *
116
- * For N:N relations, we need to group by parentId because disconnect
117
- * operations are performed on the parent entity.
118
- */
119
- private groupDeletes;
120
- /**
121
- * Groups creates by entity + relationField, sorted by ascending depth.
122
- *
123
- * Preserves parentEntity for N:N connect operations.
124
- */
125
- private groupCreates;
126
- /**
127
- * Groups updates by entity.
128
- */
129
- private groupUpdates;
130
- /**
131
- * Filters changes by entity name.
132
- *
133
- * @param entityName - Name of the entity (e.g., 'Post', 'Comment')
134
- * @returns EntityChanges containing only the operations for this entity
135
- *
136
- * @example
137
- * ```typescript
138
- * const postChanges = changes.for('Post');
139
- *
140
- * if (postChanges.hasCreates()) {
141
- * postChanges.creates.forEach(post => {
142
- * console.log('New post:', post.title);
143
- * });
144
- * }
145
- * ```
146
- */
147
- for<K extends keyof TEntityMap>(entityName: K): EntityChanges<TEntityMap[K]>;
148
- /**
149
- * Filters changes by relation field.
150
- *
151
- * @param relationField - Name of the relation field (e.g., 'tags', 'comments')
152
- * @returns New AggregateChanges containing only operations for this relation
153
- *
154
- * @example
155
- * ```typescript
156
- * const tagChanges = changes.forRelation('tags');
157
- * // Contains only creates/deletes for the 'tags' relation
158
- * ```
159
- */
160
- forRelation(relationField: string): AggregateChanges<TEntityMap>;
161
- /**
162
- * Checks if there are create operations.
163
- */
164
- hasCreates(): boolean;
165
- /**
166
- * Checks if there are update operations.
167
- */
168
- hasUpdates(): boolean;
169
- /**
170
- * Checks if there are delete operations.
171
- */
172
- hasDeletes(): boolean;
173
- /**
174
- * Checks if there are any operations.
175
- */
176
- hasChanges(): boolean;
177
- /**
178
- * Checks if there are no operations.
179
- */
180
- isEmpty(): boolean;
181
- /**
182
- * Returns the total number of operations.
183
- */
184
- get count(): number;
185
- /**
186
- * Returns the raw operations (for debug/testing).
187
- */
188
- get rawOperations(): Operation[];
189
- /**
190
- * Lists all entities that have changes.
191
- */
192
- getAffectedEntities(): string[];
193
- /**
194
- * Lists all relation fields that have changes.
195
- */
196
- getAffectedRelations(): string[];
197
- /**
198
- * Clears all operations.
199
- */
200
- clear(): void;
201
- /**
202
- * Creates a copy of the changes.
203
- */
204
- clone(): AggregateChanges<TEntityMap>;
205
- }
206
- //# sourceMappingURL=aggregate-changes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aggregate-changes.d.ts","sourceRoot":"","sources":["../../src/aggregate-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EAGhB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,gBAAgB,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAmB;gBAElB,UAAU,GAAE,SAAS,EAAO;IAIxC;;;;;;;;;OASG;IACH,SAAS,CAAC,CAAC,EACT,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI;IAYP;;OAEG;IACH,SAAS,CAAC,CAAC,EACT,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,EACP,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,KAAK,EAAE,MAAM,GACZ,IAAI;IAWP;;;;;;;;;;OAUG;IACH,SAAS,CAAC,CAAC,EACT,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI;IAaP;;OAEG;IACH,OAAO,IAAI,eAAe,EAAE;IAM5B;;OAEG;IACH,OAAO,IAAI,eAAe,EAAE;IAI5B;;OAEG;IACH,OAAO,IAAI,eAAe,EAAE;IAM5B;;;;;OAKG;IACF,UAAU,IAAI,SAAS,CAAC,SAAS,CAAC;IAMnC;;OAEG;IACH,OAAO,IAAI,SAAS,EAAE;IAItB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,iBAAiB,IAAI,eAAe;IAQpC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAsCpB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;;;;;;;;;;;;;;;OAgBG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,UAAU,EAAE,UAAU,EAAE,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAK5E;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC;IAOhE;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,SAAS,EAAE,CAE/B;IAED;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAM/B;;OAEG;IACH,oBAAoB,IAAI,MAAM,EAAE;IAUhC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,gBAAgB,CAAC,UAAU,CAAC;CAGtC"}
@@ -1,365 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AggregateChanges = void 0;
4
- const entity_changes_js_1 = require("./entity-changes.js");
5
- /**
6
- * Manages and organizes the changes of an Aggregate.
7
- *
8
- * Responsibilities:
9
- * - Stores all operations (create, update, delete)
10
- * - Orders operations respecting FK dependencies
11
- * - Groups operations by entity for batch execution
12
- * - Provides query and iteration methods
13
- * - Includes relationField, parentId, parentEntity for N:N support
14
- *
15
- * @example
16
- * ```typescript
17
- * // Define an entity map for type-safe operations
18
- * type UserEntities = {
19
- * User: User;
20
- * Post: Post;
21
- * Comment: Comment;
22
- * };
23
- *
24
- * // Getting changes with types
25
- * const changes = user.getChanges<UserEntities>();
26
- *
27
- * // Filtering by entity with autocompletion
28
- * const postChanges = changes.for('Post');
29
- * postChanges.creates.forEach(post => {
30
- * console.log(post.title);
31
- * });
32
- * ```
33
- */
34
- class AggregateChanges {
35
- ops = [];
36
- constructor(operations = []) {
37
- this.ops = [...operations];
38
- }
39
- /**
40
- * Adds a create operation.
41
- *
42
- * @param entity - Entity name
43
- * @param data - Entity data
44
- * @param depth - Depth in the aggregate tree
45
- * @param parentId - Parent entity ID (for FK)
46
- * @param parentEntity - Parent entity name
47
- * @param relationField - Name of the relation field in parent (e.g., 'tags', 'comments')
48
- */
49
- addCreate(entity, data, depth, parentId, parentEntity, relationField) {
50
- this.ops.push({
51
- type: "create",
52
- entity,
53
- data,
54
- depth,
55
- parentId,
56
- parentEntity,
57
- relationField,
58
- });
59
- }
60
- /**
61
- * Adds an update operation.
62
- */
63
- addUpdate(entity, id, data, changedFields, depth) {
64
- this.ops.push({
65
- type: "update",
66
- entity,
67
- id,
68
- data,
69
- changedFields,
70
- depth,
71
- });
72
- }
73
- /**
74
- * Adds a delete operation.
75
- *
76
- * @param entity - Entity name
77
- * @param id - Entity ID
78
- * @param data - Entity data (for reference)
79
- * @param depth - Depth in the aggregate tree
80
- * @param relationField - Name of the relation field in parent (e.g., 'tags', 'comments')
81
- * @param parentId - Parent entity ID (for N:N disconnect)
82
- * @param parentEntity - Parent entity name (for N:N disconnect)
83
- */
84
- addDelete(entity, id, data, depth, relationField, parentId, parentEntity) {
85
- this.ops.push({
86
- type: "delete",
87
- entity,
88
- id,
89
- data,
90
- depth,
91
- relationField,
92
- parentId,
93
- parentEntity,
94
- });
95
- }
96
- /**
97
- * Returns all create operations, sorted by ascending depth (root → leaf).
98
- */
99
- creates() {
100
- return this.ops
101
- .filter((op) => op.type === "create")
102
- .sort((a, b) => a.depth - b.depth);
103
- }
104
- /**
105
- * Returns all update operations.
106
- */
107
- updates() {
108
- return this.ops.filter((op) => op.type === "update");
109
- }
110
- /**
111
- * Returns all delete operations, sorted by descending depth (leaf → root).
112
- */
113
- deletes() {
114
- return this.ops
115
- .filter((op) => op.type === "delete")
116
- .sort((a, b) => b.depth - a.depth);
117
- }
118
- /**
119
- * Iterator that returns operations in the correct execution order:
120
- * 1. Deletes (leaf → root)
121
- * 2. Creates (root → leaf)
122
- * 3. Updates
123
- */
124
- *operations() {
125
- yield* this.deletes();
126
- yield* this.creates();
127
- yield* this.updates();
128
- }
129
- /**
130
- * Returns all operations as an array in execution order.
131
- */
132
- toArray() {
133
- return [...this.operations()];
134
- }
135
- /**
136
- * Converts the changes into BatchOperations for optimized execution.
137
- *
138
- * Groups operations by entity and sorts by depth:
139
- * - Deletes: depth DESC (leaf → root), grouped by entity + relationField + parentId
140
- * - Creates: depth ASC (root → leaf), grouped by entity + relationField
141
- * - Updates: grouped by entity
142
- *
143
- * @example
144
- * ```typescript
145
- * const batch = changes.toBatchOperations();
146
- *
147
- * // Run deletes
148
- * for (const del of batch.deletes) {
149
- * if (registry.isReferenceCollection(del.parentEntity, del.relationField)) {
150
- * // N:N - disconnect only
151
- * await prisma[del.parentEntity].update({
152
- * where: { id: del.parentId },
153
- * data: { [del.relationField]: { disconnect: del.ids.map(id => ({ id })) } }
154
- * });
155
- * } else {
156
- * // 1:N - delete entities
157
- * await prisma[del.entity].deleteMany({ where: { id: { in: del.ids } } });
158
- * }
159
- * }
160
- * ```
161
- */
162
- toBatchOperations() {
163
- return {
164
- deletes: this.groupDeletes(),
165
- creates: this.groupCreates(),
166
- updates: this.groupUpdates(),
167
- };
168
- }
169
- /**
170
- * Groups deletes by entity + relationField + parentId, sorted by descending depth.
171
- *
172
- * For N:N relations, we need to group by parentId because disconnect
173
- * operations are performed on the parent entity.
174
- */
175
- groupDeletes() {
176
- const deleteOps = this.deletes();
177
- const grouped = new Map();
178
- for (const op of deleteOps) {
179
- // Group by entity + relationField + parentId
180
- // This ensures N:N disconnects are grouped per parent
181
- const key = `${op.entity}:${op.relationField ?? ""}:${op.parentId ?? ""}`;
182
- if (!grouped.has(key)) {
183
- grouped.set(key, {
184
- depth: op.depth,
185
- ids: [],
186
- relationField: op.relationField,
187
- parentEntity: op.parentEntity,
188
- parentId: op.parentId,
189
- });
190
- }
191
- grouped.get(key).ids.push(op.id);
192
- }
193
- return Array.from(grouped.entries())
194
- .map(([key, { depth, ids, relationField, parentEntity, parentId }]) => {
195
- const entity = key.split(":")[0];
196
- return { entity, depth, ids, parentId, relationField, parentEntity };
197
- })
198
- .sort((a, b) => b.depth - a.depth);
199
- }
200
- /**
201
- * Groups creates by entity + relationField, sorted by ascending depth.
202
- *
203
- * Preserves parentEntity for N:N connect operations.
204
- */
205
- groupCreates() {
206
- const createOps = this.creates();
207
- const grouped = new Map();
208
- for (const op of createOps) {
209
- const key = `${op.entity}:${op.relationField ?? ""}`;
210
- if (!grouped.has(key)) {
211
- grouped.set(key, {
212
- depth: op.depth,
213
- items: [],
214
- relationField: op.relationField,
215
- parentEntity: op.parentEntity,
216
- });
217
- }
218
- grouped.get(key).items.push({
219
- data: op.data,
220
- parentId: op.parentId,
221
- parentEntity: op.parentEntity,
222
- relationField: op.relationField,
223
- });
224
- }
225
- return Array.from(grouped.entries())
226
- .map(([key, { depth, items, relationField, parentEntity }]) => {
227
- const entity = key.split(":")[0];
228
- return { entity, depth, items, relationField, parentEntity };
229
- })
230
- .sort((a, b) => a.depth - b.depth);
231
- }
232
- /**
233
- * Groups updates by entity.
234
- */
235
- groupUpdates() {
236
- const updateOps = this.updates();
237
- const grouped = new Map();
238
- for (const op of updateOps) {
239
- if (!grouped.has(op.entity)) {
240
- grouped.set(op.entity, []);
241
- }
242
- grouped.get(op.entity).push({
243
- id: op.id,
244
- changedFields: op.changedFields,
245
- });
246
- }
247
- return Array.from(grouped.entries()).map(([entity, items]) => ({
248
- entity,
249
- items,
250
- }));
251
- }
252
- /**
253
- * Filters changes by entity name.
254
- *
255
- * @param entityName - Name of the entity (e.g., 'Post', 'Comment')
256
- * @returns EntityChanges containing only the operations for this entity
257
- *
258
- * @example
259
- * ```typescript
260
- * const postChanges = changes.for('Post');
261
- *
262
- * if (postChanges.hasCreates()) {
263
- * postChanges.creates.forEach(post => {
264
- * console.log('New post:', post.title);
265
- * });
266
- * }
267
- * ```
268
- */
269
- for(entityName) {
270
- const filtered = this.ops.filter((op) => op.entity === entityName);
271
- return new entity_changes_js_1.EntityChanges(filtered);
272
- }
273
- /**
274
- * Filters changes by relation field.
275
- *
276
- * @param relationField - Name of the relation field (e.g., 'tags', 'comments')
277
- * @returns New AggregateChanges containing only operations for this relation
278
- *
279
- * @example
280
- * ```typescript
281
- * const tagChanges = changes.forRelation('tags');
282
- * // Contains only creates/deletes for the 'tags' relation
283
- * ```
284
- */
285
- forRelation(relationField) {
286
- const filtered = this.ops.filter((op) => op.relationField === relationField);
287
- return new AggregateChanges(filtered);
288
- }
289
- /**
290
- * Checks if there are create operations.
291
- */
292
- hasCreates() {
293
- return this.ops.some((op) => op.type === "create");
294
- }
295
- /**
296
- * Checks if there are update operations.
297
- */
298
- hasUpdates() {
299
- return this.ops.some((op) => op.type === "update");
300
- }
301
- /**
302
- * Checks if there are delete operations.
303
- */
304
- hasDeletes() {
305
- return this.ops.some((op) => op.type === "delete");
306
- }
307
- /**
308
- * Checks if there are any operations.
309
- */
310
- hasChanges() {
311
- return this.ops.length > 0;
312
- }
313
- /**
314
- * Checks if there are no operations.
315
- */
316
- isEmpty() {
317
- return this.ops.length === 0;
318
- }
319
- /**
320
- * Returns the total number of operations.
321
- */
322
- get count() {
323
- return this.ops.length;
324
- }
325
- /**
326
- * Returns the raw operations (for debug/testing).
327
- */
328
- get rawOperations() {
329
- return [...this.ops];
330
- }
331
- /**
332
- * Lists all entities that have changes.
333
- */
334
- getAffectedEntities() {
335
- const entities = new Set();
336
- this.ops.forEach((op) => entities.add(op.entity));
337
- return Array.from(entities);
338
- }
339
- /**
340
- * Lists all relation fields that have changes.
341
- */
342
- getAffectedRelations() {
343
- const relations = new Set();
344
- this.ops.forEach((op) => {
345
- if (op.relationField) {
346
- relations.add(op.relationField);
347
- }
348
- });
349
- return Array.from(relations);
350
- }
351
- /**
352
- * Clears all operations.
353
- */
354
- clear() {
355
- this.ops = [];
356
- }
357
- /**
358
- * Creates a copy of the changes.
359
- */
360
- clone() {
361
- return new AggregateChanges([...this.ops]);
362
- }
363
- }
364
- exports.AggregateChanges = AggregateChanges;
365
- //# sourceMappingURL=aggregate-changes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aggregate-changes.js","sourceRoot":"","sources":["../../src/aggregate-changes.ts"],"names":[],"mappings":"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"}
@@ -1,90 +0,0 @@
1
- import { Id } from "./id.js";
2
- import { ValidationError } from "./validation-error.js";
3
- import { IDomainEvent } from ".";
4
- import { BaseProps, HistoryEntry, DeepJsonResult, EntityHooks, EntityValidation, IDomainEventBus } from "./types/index.js";
5
- import { AggregateChanges } from "./aggregate-changes.js";
6
- export declare abstract class BaseEntity<T extends BaseProps> {
7
- private _props;
8
- private tracker;
9
- private proxiedProps;
10
- private snapshot;
11
- private validationConfig;
12
- private entityHooks?;
13
- private entitySchema?;
14
- private domainEvents;
15
- protected static validation?: EntityValidation<any>;
16
- protected static hooks?: EntityHooks<any, any>;
17
- constructor(props: Omit<T, "id"> & {
18
- id?: Id;
19
- });
20
- private validateProps;
21
- private extractPathKey;
22
- /**
23
- * Setup validation that runs on every property change.
24
- * Uses the ChangeTracker's onChangeValidator callback.
25
- */
26
- private setupUpdateValidation;
27
- private takeSnapshot;
28
- private deepCloneProps;
29
- get id(): Id;
30
- isNew(): boolean;
31
- /**
32
- * Check equality with another entity by comparing IDs
33
- */
34
- equals(other: BaseEntity<T> | Id | string): boolean;
35
- get props(): T;
36
- /**
37
- * Check if entity has validation errors (when throwOnError is false)
38
- */
39
- get hasValidationErrors(): boolean;
40
- /**
41
- * Get validation errors (when throwOnError is false)
42
- */
43
- get validationErrors(): ValidationError | undefined;
44
- /**
45
- * Returns all detected changes as AggregateChanges.
46
- *
47
- * @example
48
- * ```typescript
49
- * const changes = user.getChanges();
50
- * const batch = changes.toBatchOperations();
51
- *
52
- * for (const del of batch.deletes) { ... }
53
- * for (const create of batch.creates) { ... }
54
- * for (const upd of batch.updates) { ... }
55
- * ```
56
- */
57
- getChanges<TEntityMap = Record<string, any>>(): AggregateChanges<TEntityMap>;
58
- /**
59
- * Returns the change history (for debugging).
60
- */
61
- getHistory(): HistoryEntry[];
62
- /**
63
- * Clears history and marks entity as "clean".
64
- * Call this after successfully persisting to the database.
65
- */
66
- markAsClean(): void;
67
- /**
68
- * Add a domain event to this entity
69
- */
70
- protected addDomainEvent(event: IDomainEvent): void;
71
- /**
72
- * Dispatch all events through the event bus
73
- */
74
- dispatchAll(bus: IDomainEventBus): Promise<void>;
75
- /**
76
- * Get all uncommitted domain events
77
- */
78
- getUncommittedEvents(): IDomainEvent[];
79
- /**
80
- * Clear all domain events (call after publishing)
81
- */
82
- clearEvents(): void;
83
- /**
84
- * Check if entity has uncommitted events
85
- */
86
- hasUncommittedEvents(): boolean;
87
- toJSON(): DeepJsonResult<T>;
88
- private deepToJson;
89
- }
90
- //# sourceMappingURL=base-entity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../../src/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAe,MAAM,GAAG,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,EAChB,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1D,8BAAsB,UAAU,CAAC,CAAC,SAAS,SAAS;IAClD,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAoB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAE1C,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAEnC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,EAAE,CAAA;KAAE;IAqD9C,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA4E7B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAkDtB,IAAI,EAAE,IAAI,EAAE,CAEX;IAEM,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,OAAO;IAoBnD,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED;;OAEG;IACH,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,eAAe,GAAG,SAAS,CAElD;IAED;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,gBAAgB,CAAC,UAAU,CAAC;IAI5E;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;;OAGG;IACH,WAAW,IAAI,IAAI;IAKnB;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAInD;;OAEG;IACU,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D;;OAEG;IACH,oBAAoB,IAAI,YAAY,EAAE;IAItC;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;IAI3B,OAAO,CAAC,UAAU;CAiBnB"}