@woltz/rich-domain 1.2.1 → 1.2.4
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/CHANGELOG.md +56 -0
- package/dist/base-entity.d.ts +1 -1
- package/dist/base-entity.d.ts.map +1 -1
- package/dist/base-entity.js +13 -46
- package/dist/base-entity.js.map +1 -1
- package/dist/{history-tracker.d.ts → change-tracker.d.ts} +3 -3
- package/dist/change-tracker.d.ts.map +1 -0
- package/dist/{history-tracker.js → change-tracker.js} +11 -57
- package/dist/change-tracker.js.map +1 -0
- package/dist/constants.d.ts +7 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +65 -0
- package/dist/constants.js.map +1 -1
- package/dist/criteria.d.ts.map +1 -1
- package/dist/criteria.js +6 -4
- package/dist/criteria.js.map +1 -1
- package/dist/domain-event.d.ts.map +1 -1
- package/dist/domain-event.js +0 -3
- package/dist/domain-event.js.map +1 -1
- package/dist/entity-changes.d.ts.map +1 -1
- package/dist/entity-changes.js +0 -4
- package/dist/entity-changes.js.map +1 -1
- package/dist/entity-schema-registry.d.ts.map +1 -1
- package/dist/entity-schema-registry.js +2 -8
- package/dist/entity-schema-registry.js.map +1 -1
- package/dist/entity.d.ts +0 -6
- package/dist/entity.d.ts.map +1 -1
- package/dist/entity.js +0 -9
- package/dist/entity.js.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -12
- package/dist/index.js.map +1 -1
- package/dist/paginated-result.d.ts.map +1 -1
- package/dist/paginated-result.js +0 -15
- package/dist/paginated-result.js.map +1 -1
- package/dist/repository/base-repository.d.ts +1 -1
- package/dist/repository/base-repository.d.ts.map +1 -1
- package/dist/repository/index.d.ts.map +1 -1
- package/dist/repository/index.js +0 -6
- package/dist/repository/index.js.map +1 -1
- package/dist/repository/unit-of-work.d.ts.map +1 -1
- package/dist/repository/unit-of-work.js +0 -3
- package/dist/repository/unit-of-work.js.map +1 -1
- package/dist/types/change-tracker.d.ts +10 -0
- package/dist/types/change-tracker.d.ts.map +1 -1
- package/dist/types/domain.d.ts +4 -6
- package/dist/types/domain.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/criteria-operator-validation.d.ts +1 -0
- package/dist/utils/criteria-operator-validation.d.ts.map +1 -1
- package/dist/utils/criteria-operator-validation.js +39 -17
- package/dist/utils/criteria-operator-validation.js.map +1 -1
- package/dist/validation-error.d.ts.map +1 -1
- package/dist/validation-error.js +1 -3
- package/dist/validation-error.js.map +1 -1
- package/dist/value-object.d.ts +1 -1
- package/dist/value-object.d.ts.map +1 -1
- package/dist/value-object.js +0 -1
- package/dist/value-object.js.map +1 -1
- package/package.json +1 -1
- package/src/base-entity.ts +13 -56
- package/src/{history-tracker.ts → change-tracker.ts} +23 -73
- package/src/constants.ts +75 -1
- package/src/criteria.ts +9 -3
- package/src/domain-event.ts +0 -4
- package/src/entity-changes.ts +0 -5
- package/src/entity-schema-registry.ts +2 -22
- package/src/entity.ts +0 -11
- package/src/index.ts +15 -20
- package/src/paginated-result.ts +0 -21
- package/src/repository/base-repository.ts +1 -1
- package/src/repository/index.ts +0 -9
- package/src/repository/unit-of-work.ts +0 -4
- package/src/types/change-tracker.ts +16 -4
- package/src/types/domain.ts +4 -8
- package/src/types/index.ts +1 -1
- package/src/utils/criteria-operator-validation.ts +57 -19
- package/src/validation-error.ts +1 -3
- package/src/value-object.ts +1 -2
- package/tests/depth/deep-tracking.test.ts +554 -0
- package/tests/history-tracker.spec.ts +1 -1
- package/tests/load-test/data.json +248187 -247017
- package/dist/history-tracker.d.ts.map +0 -1
- package/dist/history-tracker.js.map +0 -1
- package/dist/types/history-tracker.d.ts +0 -47
- package/dist/types/history-tracker.d.ts.map +0 -1
- package/dist/types/history-tracker.js +0 -2
- package/dist/types/history-tracker.js.map +0 -1
- package/src/types/history-tracker.ts +0 -58
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,62 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [1.2.4](https://github.com/tarcisioandrade/rich-domain/compare/v1.2.2...v1.2.4) (2025-11-30)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* critic bug ([474a8d9](https://github.com/tarcisioandrade/rich-domain/commit/474a8d90fc9fb2810dc37018c86dce234d2ac08f))
|
|
11
|
+
* improve deep cloning logic in BaseEntity to handle structuredClone fallback ([78f8fbf](https://github.com/tarcisioandrade/rich-domain/commit/78f8fbf5846650a7e3783aa55023d94db65572f6))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Tests
|
|
15
|
+
|
|
16
|
+
* add comprehensive deep tracking tests for nested entity structures ([66b0c33](https://github.com/tarcisioandrade/rich-domain/commit/66b0c3399e825b24925a7ae3056e57a18ec6d93c))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Refactoring
|
|
20
|
+
|
|
21
|
+
* change visibility of prisma client in PrismaRepository constructor ([1cf83ed](https://github.com/tarcisioandrade/rich-domain/commit/1cf83ed97585fddd6a25125cedc1bcf72b289713))
|
|
22
|
+
|
|
23
|
+
### [1.2.3](https://github.com/tarcisioandrade/rich-domain/compare/v1.2.2...v1.2.3) (2025-11-30)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Bug Fixes
|
|
27
|
+
|
|
28
|
+
* critic bug ([474a8d9](https://github.com/tarcisioandrade/rich-domain/commit/474a8d90fc9fb2810dc37018c86dce234d2ac08f))
|
|
29
|
+
* improve deep cloning logic in BaseEntity to handle structuredClone fallback ([78f8fbf](https://github.com/tarcisioandrade/rich-domain/commit/78f8fbf5846650a7e3783aa55023d94db65572f6))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Tests
|
|
33
|
+
|
|
34
|
+
* add comprehensive deep tracking tests for nested entity structures ([66b0c33](https://github.com/tarcisioandrade/rich-domain/commit/66b0c3399e825b24925a7ae3056e57a18ec6d93c))
|
|
35
|
+
|
|
36
|
+
### [1.2.2](https://github.com/tarcisioandrade/rich-domain/compare/v0.3.0...v1.2.2) (2025-11-30)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Features
|
|
40
|
+
|
|
41
|
+
* filter component with criteria ([a6e5a66](https://github.com/tarcisioandrade/rich-domain/commit/a6e5a664e7b175f8156832b2d42821f73efec522))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Bug Fixes
|
|
45
|
+
|
|
46
|
+
* incorrect verification in criteria operator validation ([8b4da16](https://github.com/tarcisioandrade/rich-domain/commit/8b4da16ded67a55afe64adbe60d52359cd168a17))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### Chores
|
|
50
|
+
|
|
51
|
+
* update dependencies and refactor mappers to use PrismaToPersistence ([5281716](https://github.com/tarcisioandrade/rich-domain/commit/52817161667ce473ffe2f7991d55c03190d097c0))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
### Refactoring
|
|
55
|
+
|
|
56
|
+
* enhance criteria validation by adding field value sanitization ([9991a6b](https://github.com/tarcisioandrade/rich-domain/commit/9991a6b54dbfa8b5d2505ed17897b76f6b794a33))
|
|
57
|
+
* improve filter component logic and UI interactions for adding filters ([3dd8d9f](https://github.com/tarcisioandrade/rich-domain/commit/3dd8d9fb8934ca15357ad62485f74c541c01a680))
|
|
58
|
+
* migrate filter types to filter-utils for improved organization and clarity ([eeb2af4](https://github.com/tarcisioandrade/rich-domain/commit/eeb2af4f563ff7f8dc3eb1836b22392bc229f3af))
|
|
59
|
+
* update FilterDateValue component to handle string dates and improve date handling logic ([6cb0b42](https://github.com/tarcisioandrade/rich-domain/commit/6cb0b4245ce9394389ee208c16035bc49e4aa912))
|
|
60
|
+
|
|
5
61
|
### [1.2.1](https://github.com/tarcisioandrade/rich-domain/compare/v1.2.0...v1.2.1) (2025-11-29)
|
|
6
62
|
|
|
7
63
|
|
package/dist/base-entity.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export declare abstract class BaseEntity<T extends BaseProps> {
|
|
|
22
22
|
private extractPathKey;
|
|
23
23
|
/**
|
|
24
24
|
* Setup validation that runs on every property change.
|
|
25
|
-
* Uses the
|
|
25
|
+
* Uses the ChangeTracker's onChangeValidator callback.
|
|
26
26
|
*/
|
|
27
27
|
private setupUpdateValidation;
|
|
28
28
|
private takeSnapshot;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC;AACjC,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC;AACjC,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AASvD,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;IAgD9C,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAyE7B,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,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D;;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;CAgBnB"}
|
package/dist/base-entity.js
CHANGED
|
@@ -2,8 +2,7 @@ import { Id } from "./id";
|
|
|
2
2
|
import { ValidationError } from "./validation-error";
|
|
3
3
|
import { DEFAULT_VALIDATION_CONFIG } from "./constants";
|
|
4
4
|
import { DomainError } from "./exceptions";
|
|
5
|
-
import {
|
|
6
|
-
// Helper to get static properties from constructor
|
|
5
|
+
import { ChangeTracker } from "./change-tracker";
|
|
7
6
|
function getStaticProperty(instance, propertyName) {
|
|
8
7
|
return instance.constructor[propertyName];
|
|
9
8
|
}
|
|
@@ -11,7 +10,6 @@ export class BaseEntity {
|
|
|
11
10
|
constructor(props) {
|
|
12
11
|
this.snapshot = null;
|
|
13
12
|
this.domainEvents = [];
|
|
14
|
-
// Get static configuration from subclass
|
|
15
13
|
const validation = getStaticProperty(this, "validation");
|
|
16
14
|
const hooks = getStaticProperty(this, "hooks");
|
|
17
15
|
this.entityHooks = hooks;
|
|
@@ -23,36 +21,26 @@ export class BaseEntity {
|
|
|
23
21
|
...validation?.config,
|
|
24
22
|
};
|
|
25
23
|
let finalProps = { ...props };
|
|
26
|
-
// Generate ID if not provided
|
|
27
24
|
if (!finalProps.id) {
|
|
28
25
|
finalProps.id = new Id();
|
|
29
26
|
}
|
|
30
|
-
// Validate schema on creation
|
|
31
27
|
if (this.entitySchema && this.validationConfig.onCreate) {
|
|
32
28
|
this.validateProps(finalProps);
|
|
33
29
|
}
|
|
34
30
|
this._props = finalProps;
|
|
35
|
-
|
|
36
|
-
this.tracker = new HistoryTracker(this._props, this.constructor.name);
|
|
37
|
-
// Setup validation on update BEFORE creating proxy
|
|
31
|
+
this.tracker = new ChangeTracker(this._props, this.constructor.name);
|
|
38
32
|
if (this.validationConfig.onUpdate) {
|
|
39
33
|
this.setupUpdateValidation();
|
|
40
34
|
}
|
|
41
35
|
this.proxiedProps = this.tracker.createProxy();
|
|
42
|
-
// Execute rules (custom validations)
|
|
43
36
|
if (hooks?.rules) {
|
|
44
37
|
hooks.rules(this);
|
|
45
38
|
}
|
|
46
|
-
// Hook onCreate
|
|
47
39
|
if (hooks?.onCreate) {
|
|
48
40
|
hooks.onCreate(this);
|
|
49
41
|
}
|
|
50
|
-
// Take initial snapshot for onBeforeUpdate
|
|
51
42
|
this.takeSnapshot();
|
|
52
43
|
}
|
|
53
|
-
// ============================================================================
|
|
54
|
-
// Validation
|
|
55
|
-
// ============================================================================
|
|
56
44
|
validateProps(props) {
|
|
57
45
|
if (!this.entitySchema)
|
|
58
46
|
return;
|
|
@@ -88,25 +76,21 @@ export class BaseEntity {
|
|
|
88
76
|
}
|
|
89
77
|
/**
|
|
90
78
|
* Setup validation that runs on every property change.
|
|
91
|
-
* Uses the
|
|
79
|
+
* Uses the ChangeTracker's onChangeValidator callback.
|
|
92
80
|
*/
|
|
93
81
|
setupUpdateValidation() {
|
|
94
82
|
const self = this;
|
|
95
83
|
this.tracker.setOnChangeValidator((path, oldValue, newValue) => {
|
|
96
|
-
// Temporarily apply the change to validate
|
|
97
84
|
const originalValue = self._props[path];
|
|
98
85
|
self._props[path] = newValue;
|
|
99
86
|
try {
|
|
100
|
-
// Check onBeforeUpdate hook
|
|
101
87
|
if (self.entityHooks?.onBeforeUpdate && self.snapshot) {
|
|
102
88
|
const shouldContinue = self.entityHooks.onBeforeUpdate(self, self.snapshot);
|
|
103
89
|
if (!shouldContinue) {
|
|
104
|
-
// Revert change
|
|
105
90
|
self._props[path] = originalValue;
|
|
106
91
|
return false;
|
|
107
92
|
}
|
|
108
93
|
}
|
|
109
|
-
// Validate with schema
|
|
110
94
|
if (self.entitySchema) {
|
|
111
95
|
const result = self.entitySchema["~standard"].validate(self._props);
|
|
112
96
|
if (result instanceof Promise) {
|
|
@@ -119,7 +103,6 @@ export class BaseEntity {
|
|
|
119
103
|
path: issue.path?.map((p) => self.extractPathKey(p)) || [],
|
|
120
104
|
message: issue.message,
|
|
121
105
|
})));
|
|
122
|
-
// Revert change before throwing
|
|
123
106
|
self._props[path] = originalValue;
|
|
124
107
|
if (self.validationConfig.throwOnError) {
|
|
125
108
|
throw validationError;
|
|
@@ -128,13 +111,11 @@ export class BaseEntity {
|
|
|
128
111
|
return false;
|
|
129
112
|
}
|
|
130
113
|
}
|
|
131
|
-
// Execute rules after schema validation
|
|
132
114
|
if (self.entityHooks?.rules) {
|
|
133
115
|
try {
|
|
134
116
|
self.entityHooks.rules(self);
|
|
135
117
|
}
|
|
136
118
|
catch (error) {
|
|
137
|
-
// Revert change before throwing
|
|
138
119
|
self._props[path] = originalValue;
|
|
139
120
|
if (self.validationConfig.throwOnError) {
|
|
140
121
|
throw error;
|
|
@@ -143,14 +124,10 @@ export class BaseEntity {
|
|
|
143
124
|
return false;
|
|
144
125
|
}
|
|
145
126
|
}
|
|
146
|
-
// Revert for now - the actual set will happen in the proxy
|
|
147
127
|
self._props[path] = originalValue;
|
|
148
|
-
// Update snapshot after successful validation
|
|
149
|
-
// Note: snapshot is updated after the change is applied
|
|
150
128
|
return true;
|
|
151
129
|
}
|
|
152
130
|
catch (error) {
|
|
153
|
-
// Revert on any error
|
|
154
131
|
self._props[path] = originalValue;
|
|
155
132
|
throw error;
|
|
156
133
|
}
|
|
@@ -187,19 +164,21 @@ export class BaseEntity {
|
|
|
187
164
|
return obj.map((item) => this.deepCloneProps(item, seen));
|
|
188
165
|
}
|
|
189
166
|
if (obj.constructor === Object) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
167
|
+
try {
|
|
168
|
+
return structuredClone(obj);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
const cloned = {};
|
|
172
|
+
for (const key in obj) {
|
|
173
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
174
|
+
cloned[key] = this.deepCloneProps(obj[key], seen);
|
|
175
|
+
}
|
|
194
176
|
}
|
|
177
|
+
return cloned;
|
|
195
178
|
}
|
|
196
|
-
return cloned;
|
|
197
179
|
}
|
|
198
180
|
return obj;
|
|
199
181
|
}
|
|
200
|
-
// ============================================================================
|
|
201
|
-
// Identity
|
|
202
|
-
// ============================================================================
|
|
203
182
|
get id() {
|
|
204
183
|
return this._props.id;
|
|
205
184
|
}
|
|
@@ -224,9 +203,6 @@ export class BaseEntity {
|
|
|
224
203
|
}
|
|
225
204
|
return false;
|
|
226
205
|
}
|
|
227
|
-
// ============================================================================
|
|
228
|
-
// Props Access
|
|
229
|
-
// ============================================================================
|
|
230
206
|
get props() {
|
|
231
207
|
return this.proxiedProps;
|
|
232
208
|
}
|
|
@@ -242,9 +218,6 @@ export class BaseEntity {
|
|
|
242
218
|
get validationErrors() {
|
|
243
219
|
return this._validationError;
|
|
244
220
|
}
|
|
245
|
-
// ============================================================================
|
|
246
|
-
// Change Tracking
|
|
247
|
-
// ============================================================================
|
|
248
221
|
/**
|
|
249
222
|
* Returns all detected changes as AggregateChanges.
|
|
250
223
|
*
|
|
@@ -275,9 +248,6 @@ export class BaseEntity {
|
|
|
275
248
|
this.tracker.markAsClean();
|
|
276
249
|
this.takeSnapshot();
|
|
277
250
|
}
|
|
278
|
-
// ============================================================================
|
|
279
|
-
// Domain Events
|
|
280
|
-
// ============================================================================
|
|
281
251
|
/**
|
|
282
252
|
* Add a domain event to this entity
|
|
283
253
|
*/
|
|
@@ -309,9 +279,6 @@ export class BaseEntity {
|
|
|
309
279
|
hasUncommittedEvents() {
|
|
310
280
|
return this.domainEvents.length > 0;
|
|
311
281
|
}
|
|
312
|
-
// ============================================================================
|
|
313
|
-
// Serialization
|
|
314
|
-
// ============================================================================
|
|
315
282
|
toJson() {
|
|
316
283
|
return this.deepToJson(this._props);
|
|
317
284
|
}
|
package/dist/base-entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-entity.js","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAYrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"base-entity.js","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ export type OnChangeValidator = (path: string, oldValue: any, newValue: any) =>
|
|
|
17
17
|
* - Generates AggregateChanges for persistence
|
|
18
18
|
* - Supports validation on change via onChangeValidator
|
|
19
19
|
*/
|
|
20
|
-
export declare class
|
|
20
|
+
export declare class ChangeTracker {
|
|
21
21
|
private target;
|
|
22
22
|
private rootEntityName;
|
|
23
23
|
private path;
|
|
@@ -30,7 +30,7 @@ export declare class HistoryTracker {
|
|
|
30
30
|
private trackedArrays;
|
|
31
31
|
private trackedEntities;
|
|
32
32
|
private onChangeValidator?;
|
|
33
|
-
constructor(target: any, rootEntityName: string, path?: string, depth?: number, parentId?: string | undefined, parentEntity?: string | undefined, rootTracker?:
|
|
33
|
+
constructor(target: any, rootEntityName: string, path?: string, depth?: number, parentId?: string | undefined, parentEntity?: string | undefined, rootTracker?: ChangeTracker | undefined);
|
|
34
34
|
/**
|
|
35
35
|
* Sets a validator callback that will be called on every property change.
|
|
36
36
|
* The validator can:
|
|
@@ -94,4 +94,4 @@ export declare class HistoryTracker {
|
|
|
94
94
|
markAsClean(): void;
|
|
95
95
|
getTarget(): any;
|
|
96
96
|
}
|
|
97
|
-
//# sourceMappingURL=
|
|
97
|
+
//# sourceMappingURL=change-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-tracker.d.ts","sourceRoot":"","sources":["../src/change-tracker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,YAAY,EAAe,MAAM,SAAS,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,GAAG,KACV,OAAO,GAAG,IAAI,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IAQtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,WAAW,CAAC;IAbtB,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,EACjB,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,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;IAoCzB,WAAW,IAAI,GAAG;IAuFlB,OAAO,CAAC,gBAAgB;IAmHxB;;OAEG;IACH,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,gBAAgB,CAAC,UAAU,CAAC;IAW5E,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,wBAAwB;IAqEhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA0ChC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAkChC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAgDnC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,oBAAoB;IAsE5B,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,mBAAmB;IA6B3B,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,UAAU;IAWlB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,SAAS;IA4CjB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,qBAAqB;IAkB7B,UAAU,IAAI,YAAY,EAAE;IAI5B,YAAY,IAAI,IAAI;IASpB,WAAW,IAAI,IAAI;IAInB,SAAS,IAAI,GAAG;CAGjB"}
|
|
@@ -14,7 +14,7 @@ import { AggregateChanges } from "./aggregate-changes";
|
|
|
14
14
|
* - Generates AggregateChanges for persistence
|
|
15
15
|
* - Supports validation on change via onChangeValidator
|
|
16
16
|
*/
|
|
17
|
-
export class
|
|
17
|
+
export class ChangeTracker {
|
|
18
18
|
constructor(target, rootEntityName, path = "", depth = 0, parentId, parentEntity, rootTracker) {
|
|
19
19
|
this.target = target;
|
|
20
20
|
this.rootEntityName = rootEntityName;
|
|
@@ -42,9 +42,6 @@ export class HistoryTracker {
|
|
|
42
42
|
setOnChangeValidator(validator) {
|
|
43
43
|
this.getRootTracker().onChangeValidator = validator;
|
|
44
44
|
}
|
|
45
|
-
// ============================================================================
|
|
46
|
-
// Initial State Capture
|
|
47
|
-
// ============================================================================
|
|
48
45
|
captureInitialState() {
|
|
49
46
|
if (this.depth > 0)
|
|
50
47
|
return;
|
|
@@ -100,9 +97,6 @@ export class HistoryTracker {
|
|
|
100
97
|
}
|
|
101
98
|
});
|
|
102
99
|
}
|
|
103
|
-
// ============================================================================
|
|
104
|
-
// Proxy Creation
|
|
105
|
-
// ============================================================================
|
|
106
100
|
createProxy() {
|
|
107
101
|
const handler = {
|
|
108
102
|
get: (target, prop, receiver) => {
|
|
@@ -118,7 +112,7 @@ export class HistoryTracker {
|
|
|
118
112
|
return this.createArrayProxy(value, currentPath);
|
|
119
113
|
}
|
|
120
114
|
if (this.isEntityOrVO(value)) {
|
|
121
|
-
const nestedTracker = new
|
|
115
|
+
const nestedTracker = new ChangeTracker(value, this.getEntityName(value), currentPath, this.depth + 1, this.getEntityId(this.target), this.rootEntityName, this.rootTracker);
|
|
122
116
|
return nestedTracker.createProxy();
|
|
123
117
|
}
|
|
124
118
|
return value;
|
|
@@ -129,26 +123,21 @@ export class HistoryTracker {
|
|
|
129
123
|
if (!Array.isArray(newValue) && oldValue === newValue) {
|
|
130
124
|
return true;
|
|
131
125
|
}
|
|
132
|
-
// Call validator before making the change
|
|
133
126
|
const rootTracker = this.getRootTracker();
|
|
134
127
|
if (rootTracker.onChangeValidator) {
|
|
135
128
|
try {
|
|
136
129
|
const result = rootTracker.onChangeValidator(currentPath, oldValue, newValue);
|
|
137
130
|
if (result === false) {
|
|
138
|
-
|
|
139
|
-
return true; // Return true to not throw, but don't apply change
|
|
131
|
+
return true;
|
|
140
132
|
}
|
|
141
133
|
}
|
|
142
134
|
catch (error) {
|
|
143
|
-
// Validator threw an error - propagate it
|
|
144
135
|
throw error;
|
|
145
136
|
}
|
|
146
137
|
}
|
|
147
|
-
// Store original value
|
|
148
138
|
if (!rootTracker.originalValues.has(currentPath)) {
|
|
149
139
|
rootTracker.originalValues.set(currentPath, oldValue);
|
|
150
140
|
}
|
|
151
|
-
// Record in history
|
|
152
141
|
rootTracker.history.push({
|
|
153
142
|
path: currentPath,
|
|
154
143
|
previousValue: oldValue,
|
|
@@ -156,7 +145,6 @@ export class HistoryTracker {
|
|
|
156
145
|
timestamp: Date.now(),
|
|
157
146
|
});
|
|
158
147
|
const result = Reflect.set(target, prop, newValue, receiver);
|
|
159
|
-
// Handle special cases
|
|
160
148
|
if (Array.isArray(newValue)) {
|
|
161
149
|
this.handleArrayAssignment(currentPath, oldValue);
|
|
162
150
|
}
|
|
@@ -193,11 +181,12 @@ export class HistoryTracker {
|
|
|
193
181
|
if (mutatingMethods.includes(String(prop))) {
|
|
194
182
|
return function (...args) {
|
|
195
183
|
const oldArray = target.slice();
|
|
196
|
-
// Call validator before array mutation
|
|
197
184
|
if (rootTracker.onChangeValidator) {
|
|
198
185
|
try {
|
|
199
|
-
const result = rootTracker.onChangeValidator(path, oldArray, [
|
|
200
|
-
|
|
186
|
+
const result = rootTracker.onChangeValidator(path, oldArray, [
|
|
187
|
+
...oldArray,
|
|
188
|
+
...args,
|
|
189
|
+
]);
|
|
201
190
|
if (result === false) {
|
|
202
191
|
return undefined;
|
|
203
192
|
}
|
|
@@ -220,7 +209,7 @@ export class HistoryTracker {
|
|
|
220
209
|
}
|
|
221
210
|
if (!isNaN(Number(prop)) && tracker.isEntityOrVO(value)) {
|
|
222
211
|
const nestedPath = `${path}[${String(prop)}]`;
|
|
223
|
-
const nestedTracker = new
|
|
212
|
+
const nestedTracker = new ChangeTracker(value, tracker.getEntityName(value), nestedPath, tracker.depth + 1, tracker.getEntityId(tracker.target), tracker.rootEntityName, rootTracker);
|
|
224
213
|
return nestedTracker.createProxy();
|
|
225
214
|
}
|
|
226
215
|
return value;
|
|
@@ -228,7 +217,6 @@ export class HistoryTracker {
|
|
|
228
217
|
set(target, prop, newValue, receiver) {
|
|
229
218
|
if (!isNaN(Number(prop))) {
|
|
230
219
|
const oldArray = target.slice();
|
|
231
|
-
// Call validator before array item change
|
|
232
220
|
if (rootTracker.onChangeValidator) {
|
|
233
221
|
try {
|
|
234
222
|
const result = rootTracker.onChangeValidator(path, oldArray, newValue);
|
|
@@ -253,9 +241,6 @@ export class HistoryTracker {
|
|
|
253
241
|
},
|
|
254
242
|
});
|
|
255
243
|
}
|
|
256
|
-
// ============================================================================
|
|
257
|
-
// getChanges() - Main Method
|
|
258
|
-
// ============================================================================
|
|
259
244
|
/**
|
|
260
245
|
* Returns all detected changes as AggregateChanges.
|
|
261
246
|
*/
|
|
@@ -306,7 +291,6 @@ export class HistoryTracker {
|
|
|
306
291
|
for (const item of created) {
|
|
307
292
|
const itemEntityName = this.getEntityName(item);
|
|
308
293
|
changes.addCreate(itemEntityName, item, depth, parentId, parentEntity);
|
|
309
|
-
// Recursively mark nested items as created
|
|
310
294
|
this.markNestedItemsAsCreated(item, depth, changes);
|
|
311
295
|
}
|
|
312
296
|
for (const item of updated) {
|
|
@@ -327,7 +311,6 @@ export class HistoryTracker {
|
|
|
327
311
|
const itemEntityName = this.getEntityName(item);
|
|
328
312
|
const deleteId = id || key;
|
|
329
313
|
changes.addDelete(itemEntityName, deleteId, item, depth);
|
|
330
|
-
// Recursively mark nested items as deleted using ORIGINAL state
|
|
331
314
|
this.markNestedItemsAsDeleted(item, depth, changes, rootTracker);
|
|
332
315
|
}
|
|
333
316
|
}
|
|
@@ -347,7 +330,6 @@ export class HistoryTracker {
|
|
|
347
330
|
if (propName === "id")
|
|
348
331
|
continue;
|
|
349
332
|
if (Array.isArray(value)) {
|
|
350
|
-
// Process all items in the array
|
|
351
333
|
for (const nestedItem of value) {
|
|
352
334
|
if (this.isEntityOrVO(nestedItem)) {
|
|
353
335
|
const nestedId = this.getEntityId(nestedItem);
|
|
@@ -355,7 +337,6 @@ export class HistoryTracker {
|
|
|
355
337
|
if (nestedId || nestedKey) {
|
|
356
338
|
const entityName = this.getEntityName(nestedItem);
|
|
357
339
|
changes.addCreate(entityName, nestedItem, parentDepth + 1, itemId, this.getEntityName(item));
|
|
358
|
-
// Recursively process nested items
|
|
359
340
|
this.markNestedItemsAsCreated(nestedItem, parentDepth + 1, changes);
|
|
360
341
|
}
|
|
361
342
|
}
|
|
@@ -370,25 +351,18 @@ export class HistoryTracker {
|
|
|
370
351
|
markNestedItemsAsDeleted(item, parentDepth, changes, rootTracker) {
|
|
371
352
|
if (!item || typeof item !== "object")
|
|
372
353
|
return;
|
|
373
|
-
// Get the ID to look up the original state
|
|
374
354
|
const itemId = this.getEntityId(item);
|
|
375
355
|
if (!itemId)
|
|
376
356
|
return;
|
|
377
|
-
// Look through all tracked arrays to find nested items
|
|
378
357
|
for (const [, arrayState] of rootTracker.trackedArrays) {
|
|
379
|
-
// Check if this array belongs to our deleted item
|
|
380
358
|
if (arrayState.metadata.parentId === itemId) {
|
|
381
|
-
// Use the CLONED (original) state to get the items
|
|
382
|
-
// Note: cloned items are JSON objects, not Entity/VO instances
|
|
383
359
|
for (const nestedItem of arrayState.cloned) {
|
|
384
|
-
// Cloned items are JSON objects with an 'id' property
|
|
385
360
|
const id = typeof nestedItem === "object" && nestedItem !== null
|
|
386
361
|
? nestedItem.id
|
|
387
362
|
: undefined;
|
|
388
363
|
if (id) {
|
|
389
364
|
const entityName = arrayState.metadata.entityName;
|
|
390
365
|
changes.addDelete(entityName, id, nestedItem, parentDepth + 1);
|
|
391
|
-
// Recursively process this item's nested arrays
|
|
392
366
|
this.markNestedJsonItemAsDeleted(id, parentDepth + 1, changes, rootTracker);
|
|
393
367
|
}
|
|
394
368
|
}
|
|
@@ -400,10 +374,8 @@ export class HistoryTracker {
|
|
|
400
374
|
* This is used when processing cloned (JSON) state.
|
|
401
375
|
*/
|
|
402
376
|
markNestedJsonItemAsDeleted(itemId, parentDepth, changes, rootTracker) {
|
|
403
|
-
// Look through all tracked arrays to find nested items of this parent
|
|
404
377
|
for (const [, arrayState] of rootTracker.trackedArrays) {
|
|
405
378
|
if (arrayState.metadata.parentId === itemId) {
|
|
406
|
-
// Process all items in this nested array
|
|
407
379
|
for (const nestedJsonItem of arrayState.cloned) {
|
|
408
380
|
if (typeof nestedJsonItem !== "object" || nestedJsonItem === null)
|
|
409
381
|
continue;
|
|
@@ -411,11 +383,9 @@ export class HistoryTracker {
|
|
|
411
383
|
const entityName = arrayState.metadata.entityName;
|
|
412
384
|
if (nestedId) {
|
|
413
385
|
changes.addDelete(entityName, nestedId, nestedJsonItem, parentDepth + 1);
|
|
414
|
-
// Recursively process further nesting
|
|
415
386
|
this.markNestedJsonItemAsDeleted(nestedId, parentDepth + 1, changes, rootTracker);
|
|
416
387
|
}
|
|
417
388
|
else {
|
|
418
|
-
// Value object - try to extract identity key
|
|
419
389
|
const key = this.extractIdentityKeyFromJson(nestedJsonItem, arrayState.original);
|
|
420
390
|
if (key) {
|
|
421
391
|
changes.addDelete(entityName, key, nestedJsonItem, parentDepth + 1);
|
|
@@ -429,20 +399,16 @@ export class HistoryTracker {
|
|
|
429
399
|
* Extracts identity key from a JSON object by looking at the original ValueObject instances.
|
|
430
400
|
*/
|
|
431
401
|
extractIdentityKeyFromJson(jsonItem, originalArray) {
|
|
432
|
-
// Try to find the original ValueObject to get its identity key
|
|
433
402
|
for (const originalItem of originalArray) {
|
|
434
403
|
if (this.isEntityOrVO(originalItem)) {
|
|
435
404
|
const originalJson = this.deepClone(originalItem);
|
|
436
|
-
// Check if this matches our JSON item (rough comparison)
|
|
437
405
|
if (JSON.stringify(originalJson) === JSON.stringify(jsonItem)) {
|
|
438
|
-
// Found the matching original item - extract its identity key
|
|
439
406
|
const key = this.getItemKey(originalItem);
|
|
440
407
|
if (key)
|
|
441
408
|
return key;
|
|
442
409
|
}
|
|
443
410
|
}
|
|
444
411
|
}
|
|
445
|
-
// Fallback: if it has an id, use that
|
|
446
412
|
if (jsonItem.id)
|
|
447
413
|
return jsonItem.id;
|
|
448
414
|
return undefined;
|
|
@@ -484,14 +450,12 @@ export class HistoryTracker {
|
|
|
484
450
|
case "deleted":
|
|
485
451
|
const id = this.getEntityId(originalValue);
|
|
486
452
|
if (id) {
|
|
487
|
-
// Use originalEntity instead of originalValue to preserve entity instance
|
|
488
453
|
changes.addDelete(entityName, id, originalEntity, depth);
|
|
489
454
|
}
|
|
490
455
|
break;
|
|
491
456
|
case "replaced":
|
|
492
457
|
const oldId = this.getEntityId(originalValue);
|
|
493
458
|
if (oldId) {
|
|
494
|
-
// Use originalEntity instead of originalValue to preserve entity instance
|
|
495
459
|
changes.addDelete(entityName, oldId, originalEntity, depth);
|
|
496
460
|
}
|
|
497
461
|
changes.addCreate(entityName, currentValue, depth, parentId, parentEntity);
|
|
@@ -508,9 +472,6 @@ export class HistoryTracker {
|
|
|
508
472
|
}
|
|
509
473
|
}
|
|
510
474
|
}
|
|
511
|
-
// ============================================================================
|
|
512
|
-
// Change Detection Helpers
|
|
513
|
-
// ============================================================================
|
|
514
475
|
detectEntityChangeState(previous, current) {
|
|
515
476
|
if (previous === null && current !== null) {
|
|
516
477
|
return "created";
|
|
@@ -586,9 +547,6 @@ export class HistoryTracker {
|
|
|
586
547
|
}
|
|
587
548
|
return changes;
|
|
588
549
|
}
|
|
589
|
-
// ============================================================================
|
|
590
|
-
// Internal Handlers
|
|
591
|
-
// ============================================================================
|
|
592
550
|
handleArrayAssignment(path, oldValue) {
|
|
593
551
|
const rootTracker = this.getRootTracker();
|
|
594
552
|
if (!rootTracker.trackedArrays.has(path)) {
|
|
@@ -603,7 +561,6 @@ export class HistoryTracker {
|
|
|
603
561
|
: this.getEntityName(oldValue);
|
|
604
562
|
const existingTracked = rootTracker.trackedEntities.get(path);
|
|
605
563
|
rootTracker.trackedEntities.set(path, {
|
|
606
|
-
// Preserve original entity, or use oldValue if this is the first change
|
|
607
564
|
entity: existingTracked?.entity || oldValue,
|
|
608
565
|
metadata: {
|
|
609
566
|
entityName,
|
|
@@ -612,13 +569,9 @@ export class HistoryTracker {
|
|
|
612
569
|
parentEntity: this.rootEntityName,
|
|
613
570
|
path,
|
|
614
571
|
},
|
|
615
|
-
// Preserve original state
|
|
616
572
|
originalState: existingTracked?.originalState,
|
|
617
573
|
});
|
|
618
574
|
}
|
|
619
|
-
// ============================================================================
|
|
620
|
-
// Utility Methods
|
|
621
|
-
// ============================================================================
|
|
622
575
|
getRootTracker() {
|
|
623
576
|
return this.rootTracker || this;
|
|
624
577
|
}
|
|
@@ -644,7 +597,8 @@ export class HistoryTracker {
|
|
|
644
597
|
for (const part of parts) {
|
|
645
598
|
if (current === null || current === undefined)
|
|
646
599
|
return undefined;
|
|
647
|
-
|
|
600
|
+
const propsToAccess = current.props || current;
|
|
601
|
+
current = propsToAccess[part];
|
|
648
602
|
}
|
|
649
603
|
return current;
|
|
650
604
|
}
|
|
@@ -802,4 +756,4 @@ export class HistoryTracker {
|
|
|
802
756
|
return this.target;
|
|
803
757
|
}
|
|
804
758
|
}
|
|
805
|
-
//# sourceMappingURL=
|
|
759
|
+
//# sourceMappingURL=change-tracker.js.map
|