@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.
- package/README.md +106 -47
- package/dist/cjs/core/base-aggregate.d.ts +39 -0
- package/dist/cjs/core/base-aggregate.d.ts.map +1 -0
- package/dist/cjs/core/base-aggregate.js +57 -0
- package/dist/cjs/core/base-aggregate.js.map +1 -0
- package/dist/cjs/core/base-entity.d.ts +6 -22
- package/dist/cjs/core/base-entity.d.ts.map +1 -1
- package/dist/cjs/core/base-entity.js +5 -29
- package/dist/cjs/core/base-entity.js.map +1 -1
- package/dist/cjs/core/entity.d.ts +3 -2
- package/dist/cjs/core/entity.d.ts.map +1 -1
- package/dist/cjs/core/entity.js +2 -1
- package/dist/cjs/core/entity.js.map +1 -1
- package/dist/cjs/core/id.d.ts +9 -1
- package/dist/cjs/core/id.d.ts.map +1 -1
- package/dist/cjs/core/id.js +12 -0
- package/dist/cjs/core/id.js.map +1 -1
- package/dist/cjs/core/index.d.ts +1 -0
- package/dist/cjs/core/index.d.ts.map +1 -1
- package/dist/cjs/core/index.js +1 -0
- package/dist/cjs/core/index.js.map +1 -1
- package/dist/cjs/core/value-object.d.ts +0 -18
- package/dist/cjs/core/value-object.d.ts.map +1 -1
- package/dist/cjs/core/value-object.js +0 -25
- package/dist/cjs/core/value-object.js.map +1 -1
- package/dist/esm/core/base-aggregate.d.ts +39 -0
- package/dist/esm/core/base-aggregate.d.ts.map +1 -0
- package/dist/esm/core/base-aggregate.js +53 -0
- package/dist/esm/core/base-aggregate.js.map +1 -0
- package/dist/esm/core/base-entity.d.ts +6 -22
- package/dist/esm/core/base-entity.d.ts.map +1 -1
- package/dist/esm/core/base-entity.js +5 -29
- package/dist/esm/core/base-entity.js.map +1 -1
- package/dist/esm/core/entity.d.ts +3 -2
- package/dist/esm/core/entity.d.ts.map +1 -1
- package/dist/esm/core/entity.js +2 -1
- package/dist/esm/core/entity.js.map +1 -1
- package/dist/esm/core/id.d.ts +9 -1
- package/dist/esm/core/id.d.ts.map +1 -1
- package/dist/esm/core/id.js +12 -0
- package/dist/esm/core/id.js.map +1 -1
- package/dist/esm/core/index.d.ts +1 -0
- package/dist/esm/core/index.d.ts.map +1 -1
- package/dist/esm/core/index.js +1 -0
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/core/value-object.d.ts +0 -18
- package/dist/esm/core/value-object.d.ts.map +1 -1
- package/dist/esm/core/value-object.js +0 -25
- package/dist/esm/core/value-object.js.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/core/base-aggregate.d.ts +39 -0
- package/dist/types/core/base-aggregate.d.ts.map +1 -0
- package/dist/types/core/base-entity.d.ts +6 -22
- package/dist/types/core/base-entity.d.ts.map +1 -1
- package/dist/types/core/entity.d.ts +3 -2
- package/dist/types/core/entity.d.ts.map +1 -1
- package/dist/types/core/id.d.ts +9 -1
- package/dist/types/core/id.d.ts.map +1 -1
- package/dist/types/core/index.d.ts +1 -0
- package/dist/types/core/index.d.ts.map +1 -1
- package/dist/types/core/value-object.d.ts +0 -18
- package/dist/types/core/value-object.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/aggregate-changes.d.ts +0 -206
- package/dist/cjs/aggregate-changes.d.ts.map +0 -1
- package/dist/cjs/aggregate-changes.js +0 -365
- package/dist/cjs/aggregate-changes.js.map +0 -1
- package/dist/cjs/base-entity.d.ts +0 -90
- package/dist/cjs/base-entity.d.ts.map +0 -1
- package/dist/cjs/base-entity.js +0 -331
- package/dist/cjs/base-entity.js.map +0 -1
- package/dist/cjs/change-tracker.d.ts +0 -96
- package/dist/cjs/change-tracker.d.ts.map +0 -1
- package/dist/cjs/change-tracker.js +0 -789
- package/dist/cjs/change-tracker.js.map +0 -1
- package/dist/cjs/crypto.d.ts +0 -3
- package/dist/cjs/crypto.d.ts.map +0 -1
- package/dist/cjs/crypto.js +0 -32
- package/dist/cjs/crypto.js.map +0 -1
- package/dist/cjs/domain-event.d.ts +0 -23
- package/dist/cjs/domain-event.d.ts.map +0 -1
- package/dist/cjs/domain-event.js +0 -36
- package/dist/cjs/domain-event.js.map +0 -1
- package/dist/cjs/entity-changes.d.ts +0 -84
- package/dist/cjs/entity-changes.d.ts.map +0 -1
- package/dist/cjs/entity-changes.js +0 -136
- package/dist/cjs/entity-changes.js.map +0 -1
- package/dist/cjs/entity-schema-registry.d.ts +0 -282
- package/dist/cjs/entity-schema-registry.d.ts.map +0 -1
- package/dist/cjs/entity-schema-registry.js +0 -372
- package/dist/cjs/entity-schema-registry.js.map +0 -1
- package/dist/cjs/entity.d.ts +0 -7
- package/dist/cjs/entity.d.ts.map +0 -1
- package/dist/cjs/entity.js +0 -11
- package/dist/cjs/entity.js.map +0 -1
- package/dist/cjs/id.d.ts +0 -59
- package/dist/cjs/id.d.ts.map +0 -1
- package/dist/cjs/id.js +0 -92
- package/dist/cjs/id.js.map +0 -1
- package/dist/cjs/mapper.d.ts +0 -4
- package/dist/cjs/mapper.d.ts.map +0 -1
- package/dist/cjs/mapper.js +0 -7
- package/dist/cjs/mapper.js.map +0 -1
- package/dist/cjs/paginated-result.d.ts +0 -54
- package/dist/cjs/paginated-result.d.ts.map +0 -1
- package/dist/cjs/paginated-result.js +0 -197
- package/dist/cjs/paginated-result.js.map +0 -1
- package/dist/cjs/value-object.d.ts +0 -49
- package/dist/cjs/value-object.d.ts.map +0 -1
- package/dist/cjs/value-object.js +0 -129
- package/dist/cjs/value-object.js.map +0 -1
- package/dist/esm/aggregate-changes.d.ts +0 -206
- package/dist/esm/aggregate-changes.d.ts.map +0 -1
- package/dist/esm/aggregate-changes.js +0 -361
- package/dist/esm/aggregate-changes.js.map +0 -1
- package/dist/esm/base-entity.d.ts +0 -90
- package/dist/esm/base-entity.d.ts.map +0 -1
- package/dist/esm/base-entity.js +0 -327
- package/dist/esm/base-entity.js.map +0 -1
- package/dist/esm/change-tracker.d.ts +0 -96
- package/dist/esm/change-tracker.d.ts.map +0 -1
- package/dist/esm/change-tracker.js +0 -785
- package/dist/esm/change-tracker.js.map +0 -1
- package/dist/esm/crypto.d.ts +0 -3
- package/dist/esm/crypto.d.ts.map +0 -1
- package/dist/esm/crypto.js +0 -29
- package/dist/esm/crypto.js.map +0 -1
- package/dist/esm/domain-event.d.ts +0 -23
- package/dist/esm/domain-event.d.ts.map +0 -1
- package/dist/esm/domain-event.js +0 -32
- package/dist/esm/domain-event.js.map +0 -1
- package/dist/esm/entity-changes.d.ts +0 -84
- package/dist/esm/entity-changes.d.ts.map +0 -1
- package/dist/esm/entity-changes.js +0 -132
- package/dist/esm/entity-changes.js.map +0 -1
- package/dist/esm/entity-schema-registry.d.ts +0 -282
- package/dist/esm/entity-schema-registry.d.ts.map +0 -1
- package/dist/esm/entity-schema-registry.js +0 -368
- package/dist/esm/entity-schema-registry.js.map +0 -1
- package/dist/esm/entity.d.ts +0 -7
- package/dist/esm/entity.d.ts.map +0 -1
- package/dist/esm/entity.js +0 -6
- package/dist/esm/entity.js.map +0 -1
- package/dist/esm/id.d.ts +0 -59
- package/dist/esm/id.d.ts.map +0 -1
- package/dist/esm/id.js +0 -85
- package/dist/esm/id.js.map +0 -1
- package/dist/esm/mapper.d.ts +0 -4
- package/dist/esm/mapper.d.ts.map +0 -1
- package/dist/esm/mapper.js +0 -3
- package/dist/esm/mapper.js.map +0 -1
- package/dist/esm/paginated-result.d.ts +0 -54
- package/dist/esm/paginated-result.d.ts.map +0 -1
- package/dist/esm/paginated-result.js +0 -193
- package/dist/esm/paginated-result.js.map +0 -1
- package/dist/esm/value-object.d.ts +0 -49
- package/dist/esm/value-object.d.ts.map +0 -1
- package/dist/esm/value-object.js +0 -125
- package/dist/esm/value-object.js.map +0 -1
- package/dist/types/aggregate-changes.d.ts +0 -206
- package/dist/types/aggregate-changes.d.ts.map +0 -1
- package/dist/types/base-entity.d.ts +0 -90
- package/dist/types/base-entity.d.ts.map +0 -1
- package/dist/types/change-tracker.d.ts +0 -96
- package/dist/types/change-tracker.d.ts.map +0 -1
- package/dist/types/crypto.d.ts +0 -3
- package/dist/types/crypto.d.ts.map +0 -1
- package/dist/types/domain-event.d.ts +0 -23
- package/dist/types/domain-event.d.ts.map +0 -1
- package/dist/types/entity-changes.d.ts +0 -84
- package/dist/types/entity-changes.d.ts.map +0 -1
- package/dist/types/entity-schema-registry.d.ts +0 -282
- package/dist/types/entity-schema-registry.d.ts.map +0 -1
- package/dist/types/entity.d.ts +0 -7
- package/dist/types/entity.d.ts.map +0 -1
- package/dist/types/id.d.ts +0 -59
- package/dist/types/id.d.ts.map +0 -1
- package/dist/types/mapper.d.ts +0 -4
- package/dist/types/mapper.d.ts.map +0 -1
- package/dist/types/paginated-result.d.ts +0 -62
- package/dist/types/paginated-result.d.ts.map +0 -1
- package/dist/types/value-object.d.ts +0 -49
- 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"}
|