@woltz/rich-domain 1.2.4 → 1.3.0
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/dist/aggregate-changes.d.ts +56 -14
- package/dist/aggregate-changes.d.ts.map +1 -1
- package/dist/aggregate-changes.js +102 -22
- package/dist/aggregate-changes.js.map +1 -1
- package/dist/base-entity.d.ts +1 -1
- package/dist/base-entity.d.ts.map +1 -1
- package/dist/base-entity.js +11 -8
- package/dist/base-entity.js.map +1 -1
- package/dist/change-tracker.d.ts +1 -0
- package/dist/change-tracker.d.ts.map +1 -1
- package/dist/change-tracker.js +41 -27
- package/dist/change-tracker.js.map +1 -1
- package/dist/criteria.d.ts +7 -15
- package/dist/criteria.d.ts.map +1 -1
- package/dist/criteria.js +99 -76
- package/dist/criteria.js.map +1 -1
- package/dist/entity-schema-registry.d.ts +133 -3
- package/dist/entity-schema-registry.d.ts.map +1 -1
- package/dist/entity-schema-registry.js +155 -4
- package/dist/entity-schema-registry.js.map +1 -1
- package/dist/paginated-result.d.ts +4 -4
- package/dist/paginated-result.d.ts.map +1 -1
- package/dist/paginated-result.js +6 -20
- package/dist/paginated-result.js.map +1 -1
- package/dist/types/change-tracker.d.ts +30 -0
- package/dist/types/change-tracker.d.ts.map +1 -1
- package/dist/types/criteria.d.ts +1 -4
- package/dist/types/criteria.d.ts.map +1 -1
- package/dist/types/domain.d.ts +2 -0
- package/dist/types/domain.d.ts.map +1 -1
- package/dist/types/utils.d.ts +2 -2
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +23 -0
- package/dist/utils/helpers.js.map +1 -1
- package/dist/value-object.d.ts +1 -1
- package/dist/value-object.js +1 -1
- package/package.json +17 -3
- package/src/aggregate-changes.ts +133 -24
- package/src/base-entity.ts +13 -8
- package/src/change-tracker.ts +107 -38
- package/src/criteria.ts +151 -109
- package/src/entity-schema-registry.ts +253 -6
- package/src/paginated-result.ts +10 -30
- package/src/types/change-tracker.ts +31 -0
- package/src/types/criteria.ts +1 -4
- package/src/types/domain.ts +2 -0
- package/src/types/utils.ts +2 -2
- package/src/utils/helpers.ts +28 -0
- package/src/value-object.ts +1 -1
- package/.versionrc.json +0 -21
- package/CHANGELOG.md +0 -163
- package/tests/aggregate-changes.test.ts +0 -284
- package/tests/criteria.test.ts +0 -716
- package/tests/depth/deep-tracking.test.ts +0 -554
- package/tests/domain-events.test.ts +0 -431
- package/tests/entity-equality.test.ts +0 -464
- package/tests/entity-schema-registry.test.ts +0 -382
- package/tests/entity-validation.test.ts +0 -252
- package/tests/history-tracker.spec.ts +0 -439
- package/tests/id.test.ts +0 -338
- package/tests/load-test/data.json +0 -347211
- package/tests/load-test/entities.ts +0 -97
- package/tests/load-test/generate-data.ts +0 -81
- package/tests/load-test/lead-to-domain.mapper.ts +0 -24
- package/tests/load-test/load.test.ts +0 -38
- package/tests/repository.test.ts +0 -635
- package/tests/to-json.test.ts +0 -99
- package/tests/utils.ts +0 -290
- package/tests/value-object-validation.test.ts +0 -219
- package/tests/value-objects.test.ts +0 -80
- package/tsconfig.json +0 -9
|
@@ -8,6 +8,8 @@ export interface BaseOperation {
|
|
|
8
8
|
entity: string;
|
|
9
9
|
/** Depth in the aggregate tree (0 = root, 1 = direct children, etc.) */
|
|
10
10
|
depth: number;
|
|
11
|
+
/** Name of the relation field in the parent entity (e.g., 'tags', 'comments') */
|
|
12
|
+
relationField?: string;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Create operation.
|
|
@@ -42,6 +44,10 @@ export interface DeleteOperation<T = any> extends BaseOperation {
|
|
|
42
44
|
id: string;
|
|
43
45
|
/** Entity data (for reference) */
|
|
44
46
|
data: T;
|
|
47
|
+
/** Parent entity name */
|
|
48
|
+
parentEntity?: string;
|
|
49
|
+
/** Parent ID */
|
|
50
|
+
parentId?: string;
|
|
45
51
|
}
|
|
46
52
|
/**
|
|
47
53
|
* Union of all possible operations.
|
|
@@ -55,6 +61,10 @@ export interface BatchCreateItem<T = any> {
|
|
|
55
61
|
data: T;
|
|
56
62
|
/** Parent ID (for FK) */
|
|
57
63
|
parentId?: string;
|
|
64
|
+
/** Parent entity name */
|
|
65
|
+
parentEntity?: string;
|
|
66
|
+
/** Relation field name */
|
|
67
|
+
relationField?: string;
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
60
70
|
* Item for batch update.
|
|
@@ -65,6 +75,15 @@ export interface BatchUpdateItem {
|
|
|
65
75
|
/** Fields that have changed */
|
|
66
76
|
changedFields: Record<string, any>;
|
|
67
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Item for batch delete.
|
|
80
|
+
*/
|
|
81
|
+
export interface BatchDeleteItem {
|
|
82
|
+
/** Entity ID */
|
|
83
|
+
id: string;
|
|
84
|
+
/** Relation field name */
|
|
85
|
+
relationField?: string;
|
|
86
|
+
}
|
|
68
87
|
/**
|
|
69
88
|
* Grouped and ordered operations for batch execution.
|
|
70
89
|
*/
|
|
@@ -76,6 +95,13 @@ export interface BatchOperations {
|
|
|
76
95
|
entity: string;
|
|
77
96
|
depth: number;
|
|
78
97
|
ids: string[];
|
|
98
|
+
parentId?: string;
|
|
99
|
+
/** Relation field name (for determining owned vs reference) */
|
|
100
|
+
relationField?: string;
|
|
101
|
+
/** Parent entity name */
|
|
102
|
+
parentEntity?: string;
|
|
103
|
+
/** Individual items with their relation fields (when mixed) */
|
|
104
|
+
items?: BatchDeleteItem[];
|
|
79
105
|
}>;
|
|
80
106
|
/**
|
|
81
107
|
* Creates grouped by entity, ordered by depth ascending (root → leaf).
|
|
@@ -84,6 +110,10 @@ export interface BatchOperations {
|
|
|
84
110
|
entity: string;
|
|
85
111
|
depth: number;
|
|
86
112
|
items: BatchCreateItem[];
|
|
113
|
+
/** Relation field name (for determining owned vs reference) */
|
|
114
|
+
relationField?: string;
|
|
115
|
+
/** Parent entity name */
|
|
116
|
+
parentEntity?: string;
|
|
87
117
|
}>;
|
|
88
118
|
/**
|
|
89
119
|
* Updates grouped by entity.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-tracker.d.ts","sourceRoot":"","sources":["../../src/types/change-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"change-tracker.d.ts","sourceRoot":"","sources":["../../src/types/change-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa;IAC7D,IAAI,EAAE,QAAQ,CAAC;IACf,gCAAgC;IAChC,IAAI,EAAE,CAAC,CAAC;IACR,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa;IAC7D,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,CAAC,CAAC;IACR,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa;IAC7D,IAAI,EAAE,QAAQ,CAAC;IACf,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,IAAI,EAAE,CAAC,CAAC;IACR,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,GAAG,IACzB,eAAe,CAAC,CAAC,CAAC,GAClB,eAAe,CAAC,CAAC,CAAC,GAClB,eAAe,CAAC,CAAC,CAAC,CAAC;AAEvB;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,kBAAkB;IAClB,IAAI,EAAE,CAAC,CAAC;IACR,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,+DAA+D;QAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,yBAAyB;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,+DAA+D;QAC/D,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;KAC3B,CAAC,CAAC;IAEH;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,eAAe,EAAE,CAAC;QACzB,+DAA+D;QAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,yBAAyB;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IAEH;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,eAAe,EAAE,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG;IACxC,oBAAoB;IACpB,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,CAAC,CAAC;QACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,GAAG,CAAC;YAAC,EAAE,EAAE,GAAG,CAAA;SAAE,CAAC,CAAC;KACjD,CAAC,CAAC;IACH,oBAAoB;IACpB,OAAO,EAAE,CAAC,EAAE,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,0BAA0B;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,uCAAuC;IACvC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAClB,wCAAwC;IACxC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,EAAE,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,EAAE,CAAC,CAAC;CACP;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,CAAC,GACnD,CAAC,GACD,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC9B,CAAC,GACD,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;KAC5B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAChB,MAAM,CAAC,GAAG,CAAC,GACX,WAAW,CAAC,GAAG,CAAC,GAChB,KAAK,CAAC,GAAG,CAAC,GACV,SAAS,GACT,KAAK,GACL,CAAC;CACN,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAC7B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;CACpD,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;KAC/B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,GAC1E,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,GACrB,KAAK,GACL,CAAC,GACH,KAAK;CACV,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,GAAG,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,EAAE,qBAAqB,CAAC;IAChC,aAAa,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,QAAQ,EAAE,qBAAqB,CAAC;CACjC"}
|
package/dist/types/criteria.d.ts
CHANGED
|
@@ -40,10 +40,7 @@ export interface Pagination {
|
|
|
40
40
|
limit: number;
|
|
41
41
|
offset: number;
|
|
42
42
|
}
|
|
43
|
-
export
|
|
44
|
-
fields: FieldPath<T>[];
|
|
45
|
-
value: string;
|
|
46
|
-
}
|
|
43
|
+
export type Search = string;
|
|
47
44
|
export interface PaginationMeta {
|
|
48
45
|
page: number;
|
|
49
46
|
limit: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/types/criteria.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/types/criteria.ts"],"names":[],"mappings":"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"}
|
package/dist/types/domain.d.ts
CHANGED
|
@@ -10,11 +10,13 @@ interface DomainValidation<T> {
|
|
|
10
10
|
export type EntityValidation<T> = DomainValidation<T>;
|
|
11
11
|
export type VOValidation<T> = DomainValidation<T>;
|
|
12
12
|
export interface VOHooks<T, E> {
|
|
13
|
+
onBeforeCreate?: (props: T) => void;
|
|
13
14
|
onBeforeUpdate?: (entity: E, snapshot: T) => boolean;
|
|
14
15
|
onCreate?: (entity: E) => void;
|
|
15
16
|
rules?: (entity: E) => void;
|
|
16
17
|
}
|
|
17
18
|
export interface EntityHooks<T extends BaseProps, E> {
|
|
19
|
+
onBeforeCreate?: (props: T) => void;
|
|
18
20
|
onBeforeUpdate?: (entity: E, snapshot: T) => boolean;
|
|
19
21
|
onCreate?: (entity: E) => void;
|
|
20
22
|
rules?: (entity: E) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAC;CACR;AAED,UAAU,gBAAgB,CAAC,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,WAAW,OAAO,CAAC,CAAC,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/types/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAC;CACR;AAED,UAAU,gBAAgB,CAAC,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,WAAW,OAAO,CAAC,CAAC,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
|
package/dist/types/utils.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Id } from "../id";
|
|
2
2
|
export type DeepJsonResult<T> = {
|
|
3
3
|
[K in keyof T]: T[K] extends Id ? string : T[K] extends {
|
|
4
|
-
|
|
4
|
+
toJSON(): infer U;
|
|
5
5
|
} ? U : T[K] extends Array<infer U> ? U extends {
|
|
6
|
-
|
|
6
|
+
toJSON(): infer V;
|
|
7
7
|
} ? V[] : U extends Id ? string[] : U[] : T[K];
|
|
8
8
|
};
|
|
9
9
|
export type Primitive = string | number | boolean | Date | null | undefined;
|
package/dist/utils/helpers.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAKlD"}
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAKlD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BhE"}
|
package/dist/utils/helpers.js
CHANGED
|
@@ -7,4 +7,27 @@ export function parseQueryValue(value) {
|
|
|
7
7
|
return new Date(value); // Date
|
|
8
8
|
return value; // string
|
|
9
9
|
}
|
|
10
|
+
export function levenshteinDistance(a, b) {
|
|
11
|
+
const matrix = [];
|
|
12
|
+
for (let i = 0; i <= b.length; i++) {
|
|
13
|
+
matrix[i] = [i];
|
|
14
|
+
}
|
|
15
|
+
for (let j = 0; j <= a.length; j++) {
|
|
16
|
+
matrix[0][j] = j;
|
|
17
|
+
}
|
|
18
|
+
for (let i = 1; i <= b.length; i++) {
|
|
19
|
+
for (let j = 1; j <= a.length; j++) {
|
|
20
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
21
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
25
|
+
matrix[i][j - 1] + 1, // insertion
|
|
26
|
+
matrix[i - 1][j] + 1 // deletion
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return matrix[b.length][a.length];
|
|
32
|
+
}
|
|
10
33
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;IAC1D,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,UAAU;IAC9E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;IAC9D,OAAO,KAAK,CAAC,CAAC,SAAS;AACzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;IAC1D,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,UAAU;IAC9E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;IAC9D,OAAO,KAAK,CAAC,CAAC,SAAS;AACzB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACtD,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACrB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe;gBACzC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY;gBAClC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW;iBACjC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/value-object.d.ts
CHANGED
|
@@ -86,7 +86,7 @@ export declare abstract class ValueObject<T> {
|
|
|
86
86
|
* Returns true if the value object has uncommitted events.
|
|
87
87
|
*/
|
|
88
88
|
hasUncommittedEvents(): boolean;
|
|
89
|
-
|
|
89
|
+
toJSON(): T;
|
|
90
90
|
/**
|
|
91
91
|
* Creates a new ValueObject with updated properties.
|
|
92
92
|
* ValueObjects are immutable, so this returns a new instance.
|
package/dist/value-object.js
CHANGED
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@woltz/rich-domain",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Rich Domain Library with Standard Schema validation support",
|
|
5
|
-
"homepage": "https://
|
|
5
|
+
"homepage": "https://woltz.mintlify.app",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
"publishConfig": {
|
|
12
12
|
"access": "public"
|
|
13
13
|
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/tarcisioandrade/rich-domain/issues"
|
|
16
|
+
},
|
|
14
17
|
"repository": {
|
|
15
18
|
"type": "git",
|
|
16
19
|
"url": "https://github.com/tarcisioandrade/rich-domain.git",
|
|
@@ -40,9 +43,20 @@
|
|
|
40
43
|
"standard-schema",
|
|
41
44
|
"typescript"
|
|
42
45
|
],
|
|
46
|
+
"files": [
|
|
47
|
+
"dist",
|
|
48
|
+
"src",
|
|
49
|
+
"**/*.js",
|
|
50
|
+
"**/*.mjs",
|
|
51
|
+
"**/*.cjs",
|
|
52
|
+
"**/*.d.ts",
|
|
53
|
+
"**/*.d.mts",
|
|
54
|
+
"**/*.d.cts",
|
|
55
|
+
"**/package.json"
|
|
56
|
+
],
|
|
43
57
|
"devDependencies": {
|
|
44
58
|
"@faker-js/faker": "^9.9.0",
|
|
45
|
-
"zod": "^
|
|
59
|
+
"zod": "^4.1.5"
|
|
46
60
|
},
|
|
47
61
|
"peerDependencies": {
|
|
48
62
|
"typescript": ">=4.7.0"
|
package/src/aggregate-changes.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { EntityChanges } from "./entity-changes";
|
|
|
17
17
|
* - Orders operations respecting FK dependencies
|
|
18
18
|
* - Groups operations by entity for batch execution
|
|
19
19
|
* - Provides query and iteration methods
|
|
20
|
+
* - Includes relationField, parentId, parentEntity for N:N support
|
|
20
21
|
*
|
|
21
22
|
* @example
|
|
22
23
|
* ```typescript
|
|
@@ -31,9 +32,9 @@ import { EntityChanges } from "./entity-changes";
|
|
|
31
32
|
* const changes = user.getChanges<UserEntities>();
|
|
32
33
|
*
|
|
33
34
|
* // Filtering by entity with autocompletion
|
|
34
|
-
* const postChanges = changes.for('Post');
|
|
35
|
+
* const postChanges = changes.for('Post');
|
|
35
36
|
* postChanges.creates.forEach(post => {
|
|
36
|
-
* console.log(post.title);
|
|
37
|
+
* console.log(post.title);
|
|
37
38
|
* });
|
|
38
39
|
* ```
|
|
39
40
|
*/
|
|
@@ -46,13 +47,21 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
49
|
* Adds a create operation.
|
|
50
|
+
*
|
|
51
|
+
* @param entity - Entity name
|
|
52
|
+
* @param data - Entity data
|
|
53
|
+
* @param depth - Depth in the aggregate tree
|
|
54
|
+
* @param parentId - Parent entity ID (for FK)
|
|
55
|
+
* @param parentEntity - Parent entity name
|
|
56
|
+
* @param relationField - Name of the relation field in parent (e.g., 'tags', 'comments')
|
|
49
57
|
*/
|
|
50
58
|
addCreate<T>(
|
|
51
59
|
entity: string,
|
|
52
60
|
data: T,
|
|
53
61
|
depth: number,
|
|
54
62
|
parentId?: string,
|
|
55
|
-
parentEntity?: string
|
|
63
|
+
parentEntity?: string,
|
|
64
|
+
relationField?: string
|
|
56
65
|
): void {
|
|
57
66
|
this.ops.push({
|
|
58
67
|
type: "create",
|
|
@@ -61,6 +70,7 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
61
70
|
depth,
|
|
62
71
|
parentId,
|
|
63
72
|
parentEntity,
|
|
73
|
+
relationField,
|
|
64
74
|
} as CreateOperation<T>);
|
|
65
75
|
}
|
|
66
76
|
|
|
@@ -86,14 +96,33 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
86
96
|
|
|
87
97
|
/**
|
|
88
98
|
* Adds a delete operation.
|
|
99
|
+
*
|
|
100
|
+
* @param entity - Entity name
|
|
101
|
+
* @param id - Entity ID
|
|
102
|
+
* @param data - Entity data (for reference)
|
|
103
|
+
* @param depth - Depth in the aggregate tree
|
|
104
|
+
* @param relationField - Name of the relation field in parent (e.g., 'tags', 'comments')
|
|
105
|
+
* @param parentId - Parent entity ID (for N:N disconnect)
|
|
106
|
+
* @param parentEntity - Parent entity name (for N:N disconnect)
|
|
89
107
|
*/
|
|
90
|
-
addDelete<T>(
|
|
108
|
+
addDelete<T>(
|
|
109
|
+
entity: string,
|
|
110
|
+
id: string,
|
|
111
|
+
data: T,
|
|
112
|
+
depth: number,
|
|
113
|
+
relationField?: string,
|
|
114
|
+
parentId?: string,
|
|
115
|
+
parentEntity?: string
|
|
116
|
+
): void {
|
|
91
117
|
this.ops.push({
|
|
92
118
|
type: "delete",
|
|
93
119
|
entity,
|
|
94
120
|
id,
|
|
95
121
|
data,
|
|
96
122
|
depth,
|
|
123
|
+
relationField,
|
|
124
|
+
parentId,
|
|
125
|
+
parentEntity,
|
|
97
126
|
} as DeleteOperation<T>);
|
|
98
127
|
}
|
|
99
128
|
|
|
@@ -145,8 +174,8 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
145
174
|
* Converts the changes into BatchOperations for optimized execution.
|
|
146
175
|
*
|
|
147
176
|
* Groups operations by entity and sorts by depth:
|
|
148
|
-
* - Deletes: depth DESC (leaf → root)
|
|
149
|
-
* - Creates: depth ASC (root → leaf)
|
|
177
|
+
* - Deletes: depth DESC (leaf → root), grouped by entity + relationField + parentId
|
|
178
|
+
* - Creates: depth ASC (root → leaf), grouped by entity + relationField
|
|
150
179
|
* - Updates: grouped by entity
|
|
151
180
|
*
|
|
152
181
|
* @example
|
|
@@ -155,12 +184,16 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
155
184
|
*
|
|
156
185
|
* // Run deletes
|
|
157
186
|
* for (const del of batch.deletes) {
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
187
|
+
* if (registry.isReferenceCollection(del.parentEntity, del.relationField)) {
|
|
188
|
+
* // N:N - disconnect only
|
|
189
|
+
* await prisma[del.parentEntity].update({
|
|
190
|
+
* where: { id: del.parentId },
|
|
191
|
+
* data: { [del.relationField]: { disconnect: del.ids.map(id => ({ id })) } }
|
|
192
|
+
* });
|
|
193
|
+
* } else {
|
|
194
|
+
* // 1:N - delete entities
|
|
195
|
+
* await prisma[del.entity].deleteMany({ where: { id: { in: del.ids } } });
|
|
196
|
+
* }
|
|
164
197
|
* }
|
|
165
198
|
* ```
|
|
166
199
|
*/
|
|
@@ -173,46 +206,90 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
173
206
|
}
|
|
174
207
|
|
|
175
208
|
/**
|
|
176
|
-
* Groups deletes by entity, sorted by descending depth.
|
|
209
|
+
* Groups deletes by entity + relationField + parentId, sorted by descending depth.
|
|
210
|
+
*
|
|
211
|
+
* For N:N relations, we need to group by parentId because disconnect
|
|
212
|
+
* operations are performed on the parent entity.
|
|
177
213
|
*/
|
|
178
214
|
private groupDeletes(): BatchOperations["deletes"] {
|
|
179
215
|
const deleteOps = this.deletes();
|
|
180
|
-
const grouped = new Map<
|
|
216
|
+
const grouped = new Map<
|
|
217
|
+
string,
|
|
218
|
+
{
|
|
219
|
+
depth: number;
|
|
220
|
+
ids: string[];
|
|
221
|
+
relationField?: string;
|
|
222
|
+
parentEntity?: string;
|
|
223
|
+
parentId?: string;
|
|
224
|
+
}
|
|
225
|
+
>();
|
|
181
226
|
|
|
182
227
|
for (const op of deleteOps) {
|
|
183
|
-
|
|
184
|
-
|
|
228
|
+
// Group by entity + relationField + parentId
|
|
229
|
+
// This ensures N:N disconnects are grouped per parent
|
|
230
|
+
const key = `${op.entity}:${op.relationField ?? ""}:${op.parentId ?? ""}`;
|
|
231
|
+
|
|
232
|
+
if (!grouped.has(key)) {
|
|
233
|
+
grouped.set(key, {
|
|
234
|
+
depth: op.depth,
|
|
235
|
+
ids: [],
|
|
236
|
+
relationField: op.relationField,
|
|
237
|
+
parentEntity: op.parentEntity,
|
|
238
|
+
parentId: op.parentId,
|
|
239
|
+
});
|
|
185
240
|
}
|
|
186
|
-
grouped.get(
|
|
241
|
+
grouped.get(key)!.ids.push(op.id);
|
|
187
242
|
}
|
|
188
243
|
|
|
189
244
|
return Array.from(grouped.entries())
|
|
190
|
-
.map(([
|
|
245
|
+
.map(([key, { depth, ids, relationField, parentEntity, parentId }]) => {
|
|
246
|
+
const entity = key.split(":")[0];
|
|
247
|
+
return { entity, depth, ids, parentId, relationField, parentEntity };
|
|
248
|
+
})
|
|
191
249
|
.sort((a, b) => b.depth - a.depth);
|
|
192
250
|
}
|
|
193
251
|
|
|
194
252
|
/**
|
|
195
|
-
* Groups creates by entity, sorted by ascending depth.
|
|
253
|
+
* Groups creates by entity + relationField, sorted by ascending depth.
|
|
254
|
+
*
|
|
255
|
+
* Preserves parentEntity for N:N connect operations.
|
|
196
256
|
*/
|
|
197
257
|
private groupCreates(): BatchOperations["creates"] {
|
|
198
258
|
const createOps = this.creates();
|
|
199
259
|
const grouped = new Map<
|
|
200
260
|
string,
|
|
201
|
-
{
|
|
261
|
+
{
|
|
262
|
+
depth: number;
|
|
263
|
+
items: BatchCreateItem[];
|
|
264
|
+
relationField?: string;
|
|
265
|
+
parentEntity?: string;
|
|
266
|
+
}
|
|
202
267
|
>();
|
|
203
268
|
|
|
204
269
|
for (const op of createOps) {
|
|
205
|
-
|
|
206
|
-
|
|
270
|
+
const key = `${op.entity}:${op.relationField ?? ""}`;
|
|
271
|
+
|
|
272
|
+
if (!grouped.has(key)) {
|
|
273
|
+
grouped.set(key, {
|
|
274
|
+
depth: op.depth,
|
|
275
|
+
items: [],
|
|
276
|
+
relationField: op.relationField,
|
|
277
|
+
parentEntity: op.parentEntity,
|
|
278
|
+
});
|
|
207
279
|
}
|
|
208
|
-
grouped.get(
|
|
280
|
+
grouped.get(key)!.items.push({
|
|
209
281
|
data: op.data,
|
|
210
282
|
parentId: op.parentId,
|
|
283
|
+
parentEntity: op.parentEntity,
|
|
284
|
+
relationField: op.relationField,
|
|
211
285
|
});
|
|
212
286
|
}
|
|
213
287
|
|
|
214
288
|
return Array.from(grouped.entries())
|
|
215
|
-
.map(([
|
|
289
|
+
.map(([key, { depth, items, relationField, parentEntity }]) => {
|
|
290
|
+
const entity = key.split(":")[0];
|
|
291
|
+
return { entity, depth, items, relationField, parentEntity };
|
|
292
|
+
})
|
|
216
293
|
.sort((a, b) => a.depth - b.depth);
|
|
217
294
|
}
|
|
218
295
|
|
|
@@ -261,6 +338,25 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
261
338
|
return new EntityChanges<TEntityMap[K]>(filtered);
|
|
262
339
|
}
|
|
263
340
|
|
|
341
|
+
/**
|
|
342
|
+
* Filters changes by relation field.
|
|
343
|
+
*
|
|
344
|
+
* @param relationField - Name of the relation field (e.g., 'tags', 'comments')
|
|
345
|
+
* @returns New AggregateChanges containing only operations for this relation
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```typescript
|
|
349
|
+
* const tagChanges = changes.forRelation('tags');
|
|
350
|
+
* // Contains only creates/deletes for the 'tags' relation
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
forRelation(relationField: string): AggregateChanges<TEntityMap> {
|
|
354
|
+
const filtered = this.ops.filter(
|
|
355
|
+
(op) => op.relationField === relationField
|
|
356
|
+
);
|
|
357
|
+
return new AggregateChanges<TEntityMap>(filtered);
|
|
358
|
+
}
|
|
359
|
+
|
|
264
360
|
/**
|
|
265
361
|
* Checks if there are create operations.
|
|
266
362
|
*/
|
|
@@ -319,6 +415,19 @@ export class AggregateChanges<TEntityMap = Record<string, any>> {
|
|
|
319
415
|
return Array.from(entities);
|
|
320
416
|
}
|
|
321
417
|
|
|
418
|
+
/**
|
|
419
|
+
* Lists all relation fields that have changes.
|
|
420
|
+
*/
|
|
421
|
+
getAffectedRelations(): string[] {
|
|
422
|
+
const relations = new Set<string>();
|
|
423
|
+
this.ops.forEach((op) => {
|
|
424
|
+
if (op.relationField) {
|
|
425
|
+
relations.add(op.relationField);
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
return Array.from(relations);
|
|
429
|
+
}
|
|
430
|
+
|
|
322
431
|
/**
|
|
323
432
|
* Clears all operations.
|
|
324
433
|
*/
|
package/src/base-entity.ts
CHANGED
|
@@ -41,8 +41,17 @@ export abstract class BaseEntity<T extends BaseProps> {
|
|
|
41
41
|
this,
|
|
42
42
|
"validation"
|
|
43
43
|
);
|
|
44
|
+
|
|
44
45
|
const hooks = getStaticProperty<EntityHooks<T, any>>(this, "hooks");
|
|
45
46
|
|
|
47
|
+
if (!props.id) {
|
|
48
|
+
props.id = new Id();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (hooks?.onBeforeCreate) {
|
|
52
|
+
hooks.onBeforeCreate(props as T);
|
|
53
|
+
}
|
|
54
|
+
|
|
46
55
|
this.entityHooks = hooks;
|
|
47
56
|
|
|
48
57
|
if (validation?.schema) {
|
|
@@ -56,10 +65,6 @@ export abstract class BaseEntity<T extends BaseProps> {
|
|
|
56
65
|
|
|
57
66
|
let finalProps = { ...props } as T;
|
|
58
67
|
|
|
59
|
-
if (!finalProps.id) {
|
|
60
|
-
finalProps.id = new Id();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
68
|
if (this.entitySchema && this.validationConfig.onCreate) {
|
|
64
69
|
this.validateProps(finalProps);
|
|
65
70
|
}
|
|
@@ -228,7 +233,7 @@ export abstract class BaseEntity<T extends BaseProps> {
|
|
|
228
233
|
obj.constructor.name !== "Array"
|
|
229
234
|
) {
|
|
230
235
|
if (
|
|
231
|
-
typeof obj.
|
|
236
|
+
typeof obj.toJSON === "function" &&
|
|
232
237
|
typeof obj.equals === "function"
|
|
233
238
|
) {
|
|
234
239
|
return obj;
|
|
@@ -376,7 +381,7 @@ export abstract class BaseEntity<T extends BaseProps> {
|
|
|
376
381
|
return this.domainEvents.length > 0;
|
|
377
382
|
}
|
|
378
383
|
|
|
379
|
-
|
|
384
|
+
toJSON(): DeepJsonResult<T> {
|
|
380
385
|
return this.deepToJson(this._props) as DeepJsonResult<T>;
|
|
381
386
|
}
|
|
382
387
|
|
|
@@ -385,8 +390,8 @@ export abstract class BaseEntity<T extends BaseProps> {
|
|
|
385
390
|
if (obj instanceof Id) return obj.value;
|
|
386
391
|
if (obj instanceof Date) return obj.toISOString();
|
|
387
392
|
if (Array.isArray(obj)) return obj.map((item) => this.deepToJson(item));
|
|
388
|
-
if (obj instanceof BaseEntity) return obj.
|
|
389
|
-
if (obj && typeof obj.
|
|
393
|
+
if (obj instanceof BaseEntity) return obj.toJSON();
|
|
394
|
+
if (obj && typeof obj.toJSON === "function") return obj.toJSON();
|
|
390
395
|
if (typeof obj === "object") {
|
|
391
396
|
const result: any = {};
|
|
392
397
|
for (const key in obj) {
|