@woltz/rich-domain 1.8.1 → 1.8.3
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 +8 -31
- package/dist/cjs/core/base-entity.d.ts.map +1 -1
- package/dist/cjs/core/base-entity.js +21 -43
- package/dist/cjs/core/base-entity.js.map +1 -1
- package/dist/cjs/core/change-tracker.d.ts +16 -1
- package/dist/cjs/core/change-tracker.d.ts.map +1 -1
- package/dist/cjs/core/change-tracker.js +69 -14
- package/dist/cjs/core/change-tracker.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/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/cjs/repository/base-repository.d.ts +2 -0
- package/dist/cjs/repository/base-repository.d.ts.map +1 -1
- package/dist/cjs/repository/base-repository.js.map +1 -1
- package/dist/cjs/types/change-tracker.d.ts +2 -0
- package/dist/cjs/types/change-tracker.d.ts.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 +8 -31
- package/dist/esm/core/base-entity.d.ts.map +1 -1
- package/dist/esm/core/base-entity.js +21 -43
- package/dist/esm/core/base-entity.js.map +1 -1
- package/dist/esm/core/change-tracker.d.ts +16 -1
- package/dist/esm/core/change-tracker.d.ts.map +1 -1
- package/dist/esm/core/change-tracker.js +69 -14
- package/dist/esm/core/change-tracker.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/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/esm/repository/base-repository.d.ts +2 -0
- package/dist/esm/repository/base-repository.d.ts.map +1 -1
- package/dist/esm/repository/base-repository.js.map +1 -1
- package/dist/esm/types/change-tracker.d.ts +2 -0
- package/dist/esm/types/change-tracker.d.ts.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 +8 -31
- package/dist/types/core/base-entity.d.ts.map +1 -1
- package/dist/types/core/change-tracker.d.ts +16 -1
- package/dist/types/core/change-tracker.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/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/dist/types/repository/base-repository.d.ts +2 -0
- package/dist/types/repository/base-repository.d.ts.map +1 -1
- package/dist/types/types/change-tracker.d.ts +2 -0
- package/dist/types/types/change-tracker.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
package/README.md
CHANGED
|
@@ -35,15 +35,13 @@ import { Aggregate, Entity, Id } from "@woltz/rich-domain";
|
|
|
35
35
|
import { z } from "zod";
|
|
36
36
|
|
|
37
37
|
// Value Object
|
|
38
|
-
class Email extends ValueObject<
|
|
38
|
+
class Email extends ValueObject<string> {
|
|
39
39
|
protected static validation = {
|
|
40
|
-
schema: z.
|
|
41
|
-
value: z.string().email("Invalid email format"),
|
|
42
|
-
}),
|
|
40
|
+
schema: z.string().email("Invalid email format"),
|
|
43
41
|
};
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
return this.
|
|
43
|
+
getDomain(): string {
|
|
44
|
+
return this.value.split("@")[1];
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
|
|
@@ -109,7 +107,7 @@ Changes are tracked automatically - no manual tracking needed:
|
|
|
109
107
|
// Load existing user
|
|
110
108
|
const user = new User({
|
|
111
109
|
id: Id.from("user-123"),
|
|
112
|
-
email: new Email(
|
|
110
|
+
email: new Email("john@example.com"),
|
|
113
111
|
name: "John Doe",
|
|
114
112
|
posts: [
|
|
115
113
|
new Post({
|
|
@@ -240,30 +238,87 @@ Add validation and side effects at key points:
|
|
|
240
238
|
class Product extends Aggregate<ProductProps> {
|
|
241
239
|
protected static validation = {
|
|
242
240
|
schema: ProductSchema,
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
protected static hooks = {
|
|
244
|
+
onBeforeCreate: (props) => {
|
|
245
|
+
// Set default values before validation
|
|
246
|
+
if (!props.createdAt) {
|
|
247
|
+
props.createdAt = new Date();
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
onCreate: (entity) => {
|
|
252
|
+
console.log(`Product created: ${entity.name}`);
|
|
253
|
+
},
|
|
254
|
+
|
|
255
|
+
onBeforeUpdate: (entity, snapshot) => {
|
|
256
|
+
// Prevent price changes on inactive products
|
|
257
|
+
if (snapshot.status === "inactive" && entity.price !== snapshot.price) {
|
|
258
|
+
return false; // Reject the change
|
|
259
|
+
}
|
|
260
|
+
return true;
|
|
253
261
|
},
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
"stock",
|
|
259
|
-
"Premium products must have stock available"
|
|
260
|
-
);
|
|
262
|
+
|
|
263
|
+
rules: (entity) => {
|
|
264
|
+
if (entity.price > 1000 && entity.stock === 0) {
|
|
265
|
+
throw new ValidationError([{
|
|
266
|
+
path: ["stock"],
|
|
267
|
+
message: "Premium products must have stock available"
|
|
268
|
+
}]);
|
|
261
269
|
}
|
|
262
270
|
},
|
|
263
271
|
};
|
|
264
272
|
}
|
|
265
273
|
```
|
|
266
274
|
|
|
275
|
+
### Optional Input Properties
|
|
276
|
+
|
|
277
|
+
Make properties optional at construction but required in the entity:
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
const userSchema = z.object({
|
|
281
|
+
id: z.custom<Id>(),
|
|
282
|
+
email: z.string().email(),
|
|
283
|
+
password: z.string().min(8), // Required in entity
|
|
284
|
+
createdAt: z.date(), // Required in entity
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
type UserProps = z.infer<typeof userSchema>;
|
|
288
|
+
|
|
289
|
+
// Second generic makes 'password' and 'createdAt' optional at input
|
|
290
|
+
class User extends Aggregate<UserProps, "password" | "createdAt"> {
|
|
291
|
+
protected static validation = { schema: userSchema };
|
|
292
|
+
|
|
293
|
+
protected static hooks = {
|
|
294
|
+
onBeforeCreate: (props) => {
|
|
295
|
+
// Generate values before validation
|
|
296
|
+
if (!props.password) {
|
|
297
|
+
props.password = generateEncryptedPassword();
|
|
298
|
+
}
|
|
299
|
+
if (!props.createdAt) {
|
|
300
|
+
props.createdAt = new Date();
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
get email() {
|
|
306
|
+
return this.props.email;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// ✅ Works without password and createdAt
|
|
311
|
+
const user = new User({
|
|
312
|
+
email: "user@example.com",
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// ✅ Also works with explicit values
|
|
316
|
+
const customUser = new User({
|
|
317
|
+
email: "user@example.com",
|
|
318
|
+
password: "custom-pass-12345678",
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
267
322
|
### Domain Events
|
|
268
323
|
|
|
269
324
|
Communicate across aggregate boundaries:
|
|
@@ -308,43 +363,47 @@ order.clearEvents();
|
|
|
308
363
|
|
|
309
364
|
### Value Objects
|
|
310
365
|
|
|
311
|
-
Immutable
|
|
366
|
+
Immutable wrappers for primitive values with domain behavior:
|
|
312
367
|
|
|
313
368
|
```typescript
|
|
314
|
-
import { ValueObject } from "@woltz/rich-domain";
|
|
369
|
+
import { ValueObject, VOHooks, throwValidationError } from "@woltz/rich-domain";
|
|
315
370
|
|
|
316
|
-
class
|
|
371
|
+
class Price extends ValueObject<number> {
|
|
317
372
|
protected static validation = {
|
|
318
|
-
schema: z.
|
|
319
|
-
amount: z.number().positive(),
|
|
320
|
-
currency: z.enum(["USD", "EUR", "BRL"]),
|
|
321
|
-
}),
|
|
373
|
+
schema: z.number().positive("Price must be positive"),
|
|
322
374
|
};
|
|
323
375
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
376
|
+
protected static hooks: VOHooks<number, Price> = {
|
|
377
|
+
rules: (price) => {
|
|
378
|
+
if (price.value > 1000000) {
|
|
379
|
+
throwValidationError("value", "Price cannot exceed 1,000,000");
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
addTax(taxRate: number): Price {
|
|
385
|
+
return this.clone(this.value * (1 + taxRate));
|
|
332
386
|
}
|
|
333
387
|
|
|
334
|
-
|
|
335
|
-
return this.
|
|
388
|
+
discount(percentage: number): Price {
|
|
389
|
+
return this.clone(this.value * (1 - percentage / 100));
|
|
336
390
|
}
|
|
337
391
|
|
|
338
|
-
|
|
339
|
-
return
|
|
392
|
+
format(currency: string = "USD"): string {
|
|
393
|
+
return new Intl.NumberFormat("en-US", {
|
|
394
|
+
style: "currency",
|
|
395
|
+
currency,
|
|
396
|
+
}).format(this.value);
|
|
340
397
|
}
|
|
341
398
|
}
|
|
342
399
|
|
|
343
|
-
const
|
|
344
|
-
const
|
|
345
|
-
const
|
|
400
|
+
const price = new Price(99.99);
|
|
401
|
+
const withTax = price.addTax(0.08);
|
|
402
|
+
const discounted = price.discount(10);
|
|
346
403
|
|
|
347
|
-
console.log(
|
|
404
|
+
console.log(price.format()); // "$99.99"
|
|
405
|
+
console.log(withTax.format()); // "$107.99"
|
|
406
|
+
console.log(discounted.format()); // "$89.99"
|
|
348
407
|
```
|
|
349
408
|
|
|
350
409
|
## Integration with ORMs
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BaseEntity } from "./base-entity.js";
|
|
2
|
+
import { BaseProps, IDomainEvent, IDomainEventBus } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Base class for Aggregates that adds domain event management capabilities.
|
|
5
|
+
* In Domain-Driven Design (DDD), only Aggregates (aggregate roots) should emit domain events.
|
|
6
|
+
* Regular Entities and Value Objects should NOT manage domain events.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class BaseAggregate<T extends BaseProps, TOptionalInput extends keyof T = never> extends BaseEntity<T, TOptionalInput> {
|
|
9
|
+
private domainEvents;
|
|
10
|
+
/**
|
|
11
|
+
* Add a domain event to this aggregate
|
|
12
|
+
*/
|
|
13
|
+
protected addDomainEvent(event: IDomainEvent): void;
|
|
14
|
+
/**
|
|
15
|
+
* Dispatch all events through the event bus
|
|
16
|
+
*/
|
|
17
|
+
dispatchAll(bus: IDomainEventBus): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Get all uncommitted domain events
|
|
20
|
+
*/
|
|
21
|
+
getUncommittedEvents(): IDomainEvent[];
|
|
22
|
+
/**
|
|
23
|
+
* Clear all domain events (call after publishing)
|
|
24
|
+
*/
|
|
25
|
+
clearEvents(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Check if aggregate has uncommitted events
|
|
28
|
+
*/
|
|
29
|
+
hasUncommittedEvents(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get a domain event by name
|
|
32
|
+
*/
|
|
33
|
+
getEvent(eventName: string): IDomainEvent | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Check if an event has been added to the aggregate
|
|
36
|
+
*/
|
|
37
|
+
hasEvent(eventName: string): boolean;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=base-aggregate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-aggregate.d.ts","sourceRoot":"","sources":["../../../src/core/base-aggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE7E;;;;GAIG;AACH,8BAAsB,aAAa,CACjC,CAAC,SAAS,SAAS,EACnB,cAAc,SAAS,MAAM,CAAC,GAAG,KAAK,CACtC,SAAQ,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC;IACrC,OAAO,CAAC,YAAY,CAAsB;IAE1C;;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;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIrD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAGrC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseAggregate = void 0;
|
|
4
|
+
const base_entity_js_1 = require("./base-entity.js");
|
|
5
|
+
/**
|
|
6
|
+
* Base class for Aggregates that adds domain event management capabilities.
|
|
7
|
+
* In Domain-Driven Design (DDD), only Aggregates (aggregate roots) should emit domain events.
|
|
8
|
+
* Regular Entities and Value Objects should NOT manage domain events.
|
|
9
|
+
*/
|
|
10
|
+
class BaseAggregate extends base_entity_js_1.BaseEntity {
|
|
11
|
+
domainEvents = [];
|
|
12
|
+
/**
|
|
13
|
+
* Add a domain event to this aggregate
|
|
14
|
+
*/
|
|
15
|
+
addDomainEvent(event) {
|
|
16
|
+
this.domainEvents.push(event);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Dispatch all events through the event bus
|
|
20
|
+
*/
|
|
21
|
+
async dispatchAll(bus) {
|
|
22
|
+
await bus.publishAll(this.getUncommittedEvents());
|
|
23
|
+
this.clearEvents();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get all uncommitted domain events
|
|
27
|
+
*/
|
|
28
|
+
getUncommittedEvents() {
|
|
29
|
+
return [...this.domainEvents];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Clear all domain events (call after publishing)
|
|
33
|
+
*/
|
|
34
|
+
clearEvents() {
|
|
35
|
+
this.domainEvents = [];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if aggregate has uncommitted events
|
|
39
|
+
*/
|
|
40
|
+
hasUncommittedEvents() {
|
|
41
|
+
return this.domainEvents.length > 0;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get a domain event by name
|
|
45
|
+
*/
|
|
46
|
+
getEvent(eventName) {
|
|
47
|
+
return this.domainEvents.find((event) => event.eventName === eventName);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if an event has been added to the aggregate
|
|
51
|
+
*/
|
|
52
|
+
hasEvent(eventName) {
|
|
53
|
+
return this.domainEvents.some((event) => event.eventName === eventName);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.BaseAggregate = BaseAggregate;
|
|
57
|
+
//# sourceMappingURL=base-aggregate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-aggregate.js","sourceRoot":"","sources":["../../../src/core/base-aggregate.ts"],"names":[],"mappings":";;;AAAA,qDAA8C;AAG9C;;;;GAIG;AACH,MAAsB,aAGpB,SAAQ,2BAA6B;IAC7B,YAAY,GAAmB,EAAE,CAAC;IAE1C;;OAEG;IACO,cAAc,CAAC,KAAmB;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,CAAC,GAAoB;QAC3C,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAC1E,CAAC;CACF;AAvDD,sCAuDC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ValidationError } from "../validation-error.js";
|
|
2
|
-
import { BaseProps, HistoryEntry, DeepJsonResult, EntityHooks, EntityValidation
|
|
2
|
+
import { BaseProps, HistoryEntry, DeepJsonResult, EntityHooks, EntityValidation } from "../types/index.js";
|
|
3
3
|
import { AggregateChanges, Id } from "./index";
|
|
4
|
-
export declare abstract class BaseEntity<T extends BaseProps> {
|
|
4
|
+
export declare abstract class BaseEntity<T extends BaseProps, TOptionalInput extends keyof T = never> {
|
|
5
5
|
private _props;
|
|
6
6
|
private tracker;
|
|
7
7
|
private proxiedProps;
|
|
@@ -9,10 +9,9 @@ export declare abstract class BaseEntity<T extends BaseProps> {
|
|
|
9
9
|
private validationConfig;
|
|
10
10
|
private entityHooks?;
|
|
11
11
|
private entitySchema?;
|
|
12
|
-
private domainEvents;
|
|
13
12
|
protected static validation?: EntityValidation<any>;
|
|
14
13
|
protected static hooks?: EntityHooks<any, any>;
|
|
15
|
-
constructor(props: Omit<T, "id"> & {
|
|
14
|
+
constructor(props: Omit<T, TOptionalInput | "id"> & Partial<Pick<T, TOptionalInput>> & {
|
|
16
15
|
id?: Id;
|
|
17
16
|
});
|
|
18
17
|
private validateProps;
|
|
@@ -53,48 +52,26 @@ export declare abstract class BaseEntity<T extends BaseProps> {
|
|
|
53
52
|
* ```
|
|
54
53
|
*/
|
|
55
54
|
getChanges<TEntityMap = Record<string, any>>(): AggregateChanges<TEntityMap>;
|
|
56
|
-
/**
|
|
57
|
-
* Get a domain event by name
|
|
58
|
-
*/
|
|
59
|
-
getEvent(eventName: string): IDomainEvent | undefined;
|
|
60
|
-
/**
|
|
61
|
-
* Check if an event has been added to the entity
|
|
62
|
-
*/
|
|
63
|
-
hasEvent(eventName: string): boolean;
|
|
64
55
|
/**
|
|
65
56
|
* Returns the change history (for debugging).
|
|
66
57
|
*/
|
|
67
58
|
getHistory(): HistoryEntry[];
|
|
68
59
|
/**
|
|
69
60
|
* Clears history and marks entity as "clean".
|
|
70
|
-
*
|
|
61
|
+
* Recursively marks all nested entities as clean.
|
|
71
62
|
*/
|
|
72
63
|
markAsClean(): void;
|
|
73
64
|
/**
|
|
74
65
|
* Clears history, marks entity as "clean" and marks the Id as not new.
|
|
66
|
+
* Recursively marks all nested entities as persisted.
|
|
75
67
|
* Call this after successfully persisting to the database.
|
|
76
68
|
*/
|
|
77
69
|
markAsPersisted(): void;
|
|
78
70
|
/**
|
|
79
|
-
*
|
|
80
|
-
|
|
81
|
-
protected addDomainEvent(event: IDomainEvent): void;
|
|
82
|
-
/**
|
|
83
|
-
* Dispatch all events through the event bus
|
|
84
|
-
*/
|
|
85
|
-
dispatchAll(bus: IDomainEventBus): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* Get all uncommitted domain events
|
|
88
|
-
*/
|
|
89
|
-
getUncommittedEvents(): IDomainEvent[];
|
|
90
|
-
/**
|
|
91
|
-
* Clear all domain events (call after publishing)
|
|
92
|
-
*/
|
|
93
|
-
clearEvents(): void;
|
|
94
|
-
/**
|
|
95
|
-
* Check if entity has uncommitted events
|
|
71
|
+
* Iterates over all nested entities (direct children only) and executes a callback.
|
|
72
|
+
* This includes entities in arrays and single entity properties.
|
|
96
73
|
*/
|
|
97
|
-
|
|
74
|
+
private forEachNestedEntity;
|
|
98
75
|
toJSON(): DeepJsonResult<T>;
|
|
99
76
|
private deepToJson;
|
|
100
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../../../src/core/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,
|
|
1
|
+
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../../../src/core/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAiB,gBAAgB,EAAE,EAAE,EAAe,MAAM,SAAS,CAAC;AAS3E,8BAAsB,UAAU,CAC9B,CAAC,SAAS,SAAS,EACnB,cAAc,SAAS,MAAM,CAAC,GAAG,KAAK;IAEtC,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;IAEzC,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;gBAG7C,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,GAChC;QAAE,EAAE,CAAC,EAAE,EAAE,CAAA;KAAE;IAsDf,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;IAK5E;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;;OAGG;IACH,WAAW,IAAI,IAAI;IAMnB;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAOvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgB3B,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;IAI3B,OAAO,CAAC,UAAU;CAiBnB"}
|
|
@@ -16,7 +16,6 @@ class BaseEntity {
|
|
|
16
16
|
validationConfig;
|
|
17
17
|
entityHooks;
|
|
18
18
|
entitySchema;
|
|
19
|
-
domainEvents = [];
|
|
20
19
|
static validation;
|
|
21
20
|
static hooks;
|
|
22
21
|
constructor(props) {
|
|
@@ -251,18 +250,6 @@ class BaseEntity {
|
|
|
251
250
|
getChanges() {
|
|
252
251
|
return this.tracker.getChanges();
|
|
253
252
|
}
|
|
254
|
-
/**
|
|
255
|
-
* Get a domain event by name
|
|
256
|
-
*/
|
|
257
|
-
getEvent(eventName) {
|
|
258
|
-
return this.domainEvents.find((event) => event.eventName === eventName);
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Check if an event has been added to the entity
|
|
262
|
-
*/
|
|
263
|
-
hasEvent(eventName) {
|
|
264
|
-
return this.domainEvents.some((event) => event.eventName === eventName);
|
|
265
|
-
}
|
|
266
253
|
/**
|
|
267
254
|
* Returns the change history (for debugging).
|
|
268
255
|
*/
|
|
@@ -271,50 +258,41 @@ class BaseEntity {
|
|
|
271
258
|
}
|
|
272
259
|
/**
|
|
273
260
|
* Clears history and marks entity as "clean".
|
|
274
|
-
*
|
|
261
|
+
* Recursively marks all nested entities as clean.
|
|
275
262
|
*/
|
|
276
263
|
markAsClean() {
|
|
277
264
|
this.tracker.markAsClean();
|
|
278
265
|
this.takeSnapshot();
|
|
266
|
+
this.forEachNestedEntity((entity) => entity.markAsClean());
|
|
279
267
|
}
|
|
280
268
|
/**
|
|
281
269
|
* Clears history, marks entity as "clean" and marks the Id as not new.
|
|
270
|
+
* Recursively marks all nested entities as persisted.
|
|
282
271
|
* Call this after successfully persisting to the database.
|
|
283
272
|
*/
|
|
284
273
|
markAsPersisted() {
|
|
285
|
-
this.markAsClean();
|
|
274
|
+
this.tracker.markAsClean();
|
|
275
|
+
this.takeSnapshot();
|
|
286
276
|
this.id.markAsNotNew();
|
|
277
|
+
this.forEachNestedEntity((entity) => entity.markAsPersisted());
|
|
287
278
|
}
|
|
288
279
|
/**
|
|
289
|
-
*
|
|
290
|
-
|
|
291
|
-
addDomainEvent(event) {
|
|
292
|
-
this.domainEvents.push(event);
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Dispatch all events through the event bus
|
|
296
|
-
*/
|
|
297
|
-
async dispatchAll(bus) {
|
|
298
|
-
await bus.publishAll(this.getUncommittedEvents());
|
|
299
|
-
this.clearEvents();
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Get all uncommitted domain events
|
|
280
|
+
* Iterates over all nested entities (direct children only) and executes a callback.
|
|
281
|
+
* This includes entities in arrays and single entity properties.
|
|
303
282
|
*/
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
return this.domainEvents.length > 0;
|
|
283
|
+
forEachNestedEntity(callback) {
|
|
284
|
+
for (const value of Object.values(this._props)) {
|
|
285
|
+
if (value instanceof BaseEntity) {
|
|
286
|
+
callback(value);
|
|
287
|
+
}
|
|
288
|
+
else if (Array.isArray(value)) {
|
|
289
|
+
for (const item of value) {
|
|
290
|
+
if (item instanceof BaseEntity) {
|
|
291
|
+
callback(item);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
318
296
|
}
|
|
319
297
|
toJSON() {
|
|
320
298
|
return this.deepToJson(this._props);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-entity.js","sourceRoot":"","sources":["../../../src/core/base-entity.ts"],"names":[],"mappings":";;;AAAA,gEAAyD;
|
|
1
|
+
{"version":3,"file":"base-entity.js","sourceRoot":"","sources":["../../../src/core/base-entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,7 +47,14 @@ export declare class ChangeTracker {
|
|
|
47
47
|
* Returns all detected changes as AggregateChanges.
|
|
48
48
|
*/
|
|
49
49
|
getChanges<TEntityMap = Record<string, any>>(): AggregateChanges<TEntityMap>;
|
|
50
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Collects all root-level changes: primitive properties and primitive arrays.
|
|
52
|
+
*/
|
|
53
|
+
private collectRootChanges;
|
|
54
|
+
/**
|
|
55
|
+
* Compares two arrays for equality (shallow comparison for primitives).
|
|
56
|
+
*/
|
|
57
|
+
private arraysEqual;
|
|
51
58
|
private analyzeCollectionChanges;
|
|
52
59
|
/**
|
|
53
60
|
* Recursively marks all nested items as created when a parent is created.
|
|
@@ -82,6 +89,14 @@ export declare class ChangeTracker {
|
|
|
82
89
|
private getItemKey;
|
|
83
90
|
private getEntityId;
|
|
84
91
|
private getEntityName;
|
|
92
|
+
/**
|
|
93
|
+
* Checks if a value is a primitive (string, number, boolean, null, undefined, symbol, bigint).
|
|
94
|
+
*/
|
|
95
|
+
private isPrimitiveValue;
|
|
96
|
+
/**
|
|
97
|
+
* Checks if an array contains only primitive values.
|
|
98
|
+
*/
|
|
99
|
+
private isPrimitiveArray;
|
|
85
100
|
private isEqual;
|
|
86
101
|
private deepEqual;
|
|
87
102
|
private hasChanged;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-tracker.d.ts","sourceRoot":"","sources":["../../../src/core/change-tracker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,IAAI,CAAC;AAEhF;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IAQtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,QAAQ,CAAC;IAEjB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,WAAW,CAAC;IAftB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAGpC,MAAM,EAAE,GAAG,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,MAAW,EACjB,KAAK,GAAE,MAAU,EAEjB,QAAQ,CAAC,EAAE,MAAM,YAAA,EAEjB,YAAY,CAAC,EAAE,MAAM,YAAA,EACrB,WAAW,CAAC,EAAE,aAAa,YAAA;IAQrC;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAIxD,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAgD1B,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"change-tracker.d.ts","sourceRoot":"","sources":["../../../src/core/change-tracker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,GAAG,IAAI,CAAC;AAEhF;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IAQtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,KAAK;IAEb,OAAO,CAAC,QAAQ,CAAC;IAEjB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,WAAW,CAAC;IAftB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAGpC,MAAM,EAAE,GAAG,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,MAAW,EACjB,KAAK,GAAE,MAAU,EAEjB,QAAQ,CAAC,EAAE,MAAM,YAAA,EAEjB,YAAY,CAAC,EAAE,MAAM,YAAA,EACrB,WAAW,CAAC,EAAE,aAAa,YAAA;IAQrC;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAIxD,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAgD1B,OAAO,CAAC,iBAAiB;IAyCzB,WAAW,IAAI,GAAG;IAmFlB,OAAO,CAAC,gBAAgB;IA+GxB;;OAEG;IACH,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,gBAAgB,CAAC,UAAU,CAAC;IA0B5E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmC1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,wBAAwB;IAyFhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA8ChC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA8ChC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IA0DnC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,oBAAoB;IA0F5B,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,SAAS;IA4CjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAsCjB,OAAO,CAAC,qBAAqB;IAkB7B,UAAU,IAAI,YAAY,EAAE;IAI5B,YAAY,IAAI,IAAI;IASpB,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,GAAG;CAGjB"}
|