@woltz/rich-domain 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/dist/aggregate-changes.d.ts +164 -0
- package/dist/aggregate-changes.d.ts.map +1 -0
- package/dist/aggregate-changes.js +281 -0
- package/dist/aggregate-changes.js.map +1 -0
- package/dist/base-entity.d.ts +32 -8
- package/dist/base-entity.d.ts.map +1 -1
- package/dist/base-entity.js +86 -93
- package/dist/base-entity.js.map +1 -1
- package/dist/change-tracker.d.ts +97 -0
- package/dist/change-tracker.d.ts.map +1 -0
- package/dist/change-tracker.js +758 -0
- 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 +3 -3
- package/dist/criteria.d.ts.map +1 -1
- package/dist/criteria.js +6 -4
- package/dist/criteria.js.map +1 -1
- package/dist/crypto.d.ts +3 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +29 -0
- package/dist/crypto.js.map +1 -0
- 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 +84 -0
- package/dist/entity-changes.d.ts.map +1 -0
- package/dist/entity-changes.js +131 -0
- package/dist/entity-changes.js.map +1 -0
- package/dist/entity-schema-registry.d.ts +148 -0
- package/dist/entity-schema-registry.d.ts.map +1 -0
- package/dist/entity-schema-registry.js +213 -0
- package/dist/entity-schema-registry.js.map +1 -0
- 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/id.d.ts +11 -10
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +4 -28
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -11
- package/dist/index.js.map +1 -1
- package/dist/mapper.d.ts +1 -1
- package/dist/mapper.d.ts.map +1 -1
- package/dist/mapper.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 +7 -33
- package/dist/repository/base-repository.d.ts.map +1 -1
- package/dist/repository/base-repository.js +0 -27
- package/dist/repository/base-repository.js.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 +0 -25
- package/dist/repository/unit-of-work.d.ts.map +1 -1
- package/dist/repository/unit-of-work.js +0 -28
- package/dist/repository/unit-of-work.js.map +1 -1
- package/dist/types/change-tracker.d.ts +196 -0
- package/dist/types/change-tracker.d.ts.map +1 -0
- package/dist/types/change-tracker.js +2 -0
- package/dist/types/change-tracker.js.map +1 -0
- package/dist/types/criteria.d.ts +5 -1
- package/dist/types/criteria.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/types/utils.d.ts +0 -1
- package/dist/types/utils.d.ts.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 -6
- package/dist/validation-error.js.map +1 -1
- package/dist/value-object.d.ts +57 -8
- package/dist/value-object.d.ts.map +1 -1
- package/dist/value-object.js +49 -22
- package/dist/value-object.js.map +1 -1
- package/package.json +2 -1
- package/src/aggregate-changes.ts +335 -0
- package/src/base-entity.ts +102 -109
- package/src/change-tracker.ts +1062 -0
- package/src/constants.ts +75 -1
- package/src/criteria.ts +11 -4
- package/src/crypto.ts +31 -0
- package/src/domain-event.ts +0 -4
- package/src/entity-changes.ts +146 -0
- package/src/entity-schema-registry.ts +255 -0
- package/src/entity.ts +0 -11
- package/src/id.ts +17 -26
- package/src/index.ts +15 -19
- package/src/mapper.ts +4 -1
- package/src/paginated-result.ts +0 -21
- package/src/repository/base-repository.ts +7 -38
- package/src/repository/index.ts +0 -9
- package/src/repository/unit-of-work.ts +0 -29
- package/src/types/change-tracker.ts +233 -0
- package/src/types/criteria.ts +6 -1
- package/src/types/domain.ts +4 -8
- package/src/types/index.ts +1 -1
- package/src/types/utils.ts +0 -9
- package/src/utils/criteria-operator-validation.ts +57 -19
- package/src/validation-error.ts +1 -7
- package/src/value-object.ts +84 -24
- package/tests/aggregate-changes.test.ts +284 -0
- package/tests/criteria.test.ts +122 -161
- package/tests/entity-equality.test.ts +38 -61
- package/tests/entity-schema-registry.test.ts +382 -0
- package/tests/entity-validation.test.ts +7 -94
- package/tests/history-tracker.spec.ts +349 -617
- package/tests/id.test.ts +41 -44
- package/tests/load-test/data.json +346041 -0
- package/tests/load-test/entities.ts +97 -0
- package/tests/load-test/generate-data.ts +81 -0
- package/tests/load-test/lead-to-domain.mapper.ts +24 -0
- package/tests/load-test/load.test.ts +38 -0
- package/tests/repository.test.ts +30 -54
- package/tests/to-json.test.ts +14 -18
- package/tests/utils.ts +138 -102
- package/tests/value-objects.test.ts +57 -29
- package/dist/deep-proxy.d.ts +0 -36
- package/dist/deep-proxy.d.ts.map +0 -1
- package/dist/deep-proxy.js +0 -384
- package/dist/deep-proxy.js.map +0 -1
- package/dist/types/history-tracker.d.ts +0 -36
- 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/deep-proxy.ts +0 -447
- package/src/types/history-tracker.ts +0 -45
- package/tests/entity.test.ts +0 -33
package/dist/base-entity.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Base Entity Class with Standard Schema Validation
|
|
3
|
-
// ============================================================================
|
|
4
1
|
import { Id } from "./id";
|
|
5
|
-
import { DeepProxy } from "./deep-proxy";
|
|
6
2
|
import { ValidationError } from "./validation-error";
|
|
7
3
|
import { DEFAULT_VALIDATION_CONFIG } from "./constants";
|
|
8
4
|
import { DomainError } from "./exceptions";
|
|
9
|
-
|
|
5
|
+
import { ChangeTracker } from "./change-tracker";
|
|
10
6
|
function getStaticProperty(instance, propertyName) {
|
|
11
7
|
return instance.constructor[propertyName];
|
|
12
8
|
}
|
|
@@ -14,7 +10,6 @@ export class BaseEntity {
|
|
|
14
10
|
constructor(props) {
|
|
15
11
|
this.snapshot = null;
|
|
16
12
|
this.domainEvents = [];
|
|
17
|
-
// Get static configuration from subclass
|
|
18
13
|
const validation = getStaticProperty(this, "validation");
|
|
19
14
|
const hooks = getStaticProperty(this, "hooks");
|
|
20
15
|
this.entityHooks = hooks;
|
|
@@ -26,30 +21,24 @@ export class BaseEntity {
|
|
|
26
21
|
...validation?.config,
|
|
27
22
|
};
|
|
28
23
|
let finalProps = { ...props };
|
|
29
|
-
// Generate ID if not provided
|
|
30
24
|
if (!finalProps.id) {
|
|
31
25
|
finalProps.id = new Id();
|
|
32
26
|
}
|
|
33
|
-
// Validate schema on creation
|
|
34
27
|
if (this.entitySchema && this.validationConfig.onCreate) {
|
|
35
28
|
this.validateProps(finalProps);
|
|
36
29
|
}
|
|
37
30
|
this._props = finalProps;
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
this.tracker = new ChangeTracker(this._props, this.constructor.name);
|
|
32
|
+
if (this.validationConfig.onUpdate) {
|
|
33
|
+
this.setupUpdateValidation();
|
|
34
|
+
}
|
|
35
|
+
this.proxiedProps = this.tracker.createProxy();
|
|
41
36
|
if (hooks?.rules) {
|
|
42
37
|
hooks.rules(this);
|
|
43
38
|
}
|
|
44
|
-
// Hook onCreate
|
|
45
39
|
if (hooks?.onCreate) {
|
|
46
40
|
hooks.onCreate(this);
|
|
47
41
|
}
|
|
48
|
-
// Setup update validation
|
|
49
|
-
if (this.entitySchema && this.validationConfig.onUpdate) {
|
|
50
|
-
this.setupUpdateValidation();
|
|
51
|
-
}
|
|
52
|
-
// Take initial snapshot for onBeforeUpdate
|
|
53
42
|
this.takeSnapshot();
|
|
54
43
|
}
|
|
55
44
|
validateProps(props) {
|
|
@@ -67,7 +56,6 @@ export class BaseEntity {
|
|
|
67
56
|
if (this.validationConfig.throwOnError) {
|
|
68
57
|
throw validationError;
|
|
69
58
|
}
|
|
70
|
-
// If not throwing, store error for later retrieval
|
|
71
59
|
this._validationError = validationError;
|
|
72
60
|
}
|
|
73
61
|
}
|
|
@@ -75,75 +63,75 @@ export class BaseEntity {
|
|
|
75
63
|
if (pathSegment === null || pathSegment === undefined) {
|
|
76
64
|
return "";
|
|
77
65
|
}
|
|
78
|
-
// Handle PropertyKey (string | number | symbol)
|
|
79
66
|
if (typeof pathSegment === "string" || typeof pathSegment === "number") {
|
|
80
67
|
return String(pathSegment);
|
|
81
68
|
}
|
|
82
69
|
if (typeof pathSegment === "symbol") {
|
|
83
70
|
return pathSegment.toString();
|
|
84
71
|
}
|
|
85
|
-
// Handle object with 'key' property (Zod's PathSegment)
|
|
86
72
|
if (typeof pathSegment === "object" && "key" in pathSegment) {
|
|
87
73
|
return String(pathSegment.key);
|
|
88
74
|
}
|
|
89
|
-
// Fallback
|
|
90
75
|
return String(pathSegment);
|
|
91
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Setup validation that runs on every property change.
|
|
79
|
+
* Uses the ChangeTracker's onChangeValidator callback.
|
|
80
|
+
*/
|
|
92
81
|
setupUpdateValidation() {
|
|
93
82
|
const self = this;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
// Validate with schema
|
|
105
|
-
if (self.entitySchema) {
|
|
106
|
-
const result = self.entitySchema["~standard"].validate(self._props);
|
|
107
|
-
if (result instanceof Promise) {
|
|
108
|
-
console.warn("Async validation on update not supported. Consider using sync validation.");
|
|
109
|
-
return;
|
|
83
|
+
this.tracker.setOnChangeValidator((path, oldValue, newValue) => {
|
|
84
|
+
const originalValue = self._props[path];
|
|
85
|
+
self._props[path] = newValue;
|
|
86
|
+
try {
|
|
87
|
+
if (self.entityHooks?.onBeforeUpdate && self.snapshot) {
|
|
88
|
+
const shouldContinue = self.entityHooks.onBeforeUpdate(self, self.snapshot);
|
|
89
|
+
if (!shouldContinue) {
|
|
90
|
+
self._props[path] = originalValue;
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
110
93
|
}
|
|
111
|
-
if (
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
94
|
+
if (self.entitySchema) {
|
|
95
|
+
const result = self.entitySchema["~standard"].validate(self._props);
|
|
96
|
+
if (result instanceof Promise) {
|
|
97
|
+
console.warn("Async validation on update not supported. Consider using sync validation.");
|
|
98
|
+
self._props[path] = originalValue;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
if (result.issues && result.issues.length > 0) {
|
|
102
|
+
const validationError = new ValidationError(result.issues.map((issue) => ({
|
|
103
|
+
path: issue.path?.map((p) => self.extractPathKey(p)) || [],
|
|
104
|
+
message: issue.message,
|
|
105
|
+
})));
|
|
106
|
+
self._props[path] = originalValue;
|
|
107
|
+
if (self.validationConfig.throwOnError) {
|
|
108
|
+
throw validationError;
|
|
120
109
|
}
|
|
121
|
-
|
|
110
|
+
console.error("Validation failed on update:", validationError);
|
|
111
|
+
return false;
|
|
122
112
|
}
|
|
123
|
-
console.error("Validation failed on update:", validationError);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
// Execute rules after schema validation
|
|
127
|
-
if (self.entityHooks?.rules) {
|
|
128
|
-
try {
|
|
129
|
-
self.entityHooks.rules(self);
|
|
130
113
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
114
|
+
if (self.entityHooks?.rules) {
|
|
115
|
+
try {
|
|
116
|
+
self.entityHooks.rules(self);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
self._props[path] = originalValue;
|
|
120
|
+
if (self.validationConfig.throwOnError) {
|
|
121
|
+
throw error;
|
|
136
122
|
}
|
|
137
|
-
|
|
123
|
+
console.error("Rules validation failed on update:", error);
|
|
124
|
+
return false;
|
|
138
125
|
}
|
|
139
|
-
console.error("Rules validation failed on update:", error);
|
|
140
126
|
}
|
|
127
|
+
self._props[path] = originalValue;
|
|
128
|
+
return true;
|
|
141
129
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
130
|
+
catch (error) {
|
|
131
|
+
self._props[path] = originalValue;
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
147
135
|
}
|
|
148
136
|
takeSnapshot() {
|
|
149
137
|
this.snapshot = this.deepCloneProps(this._props);
|
|
@@ -151,37 +139,30 @@ export class BaseEntity {
|
|
|
151
139
|
deepCloneProps(obj, seen = new WeakSet()) {
|
|
152
140
|
if (obj === null || obj === undefined)
|
|
153
141
|
return obj;
|
|
154
|
-
// Primitives
|
|
155
142
|
if (typeof obj !== "object")
|
|
156
143
|
return obj;
|
|
157
|
-
// Special cases - don't clone these, just return the reference
|
|
158
144
|
if (obj instanceof Id)
|
|
159
145
|
return obj;
|
|
160
146
|
if (obj instanceof Date)
|
|
161
147
|
return new Date(obj.getTime());
|
|
162
|
-
// Check for circular references
|
|
163
148
|
if (seen.has(obj)) {
|
|
164
|
-
return obj;
|
|
149
|
+
return obj;
|
|
165
150
|
}
|
|
166
|
-
// Handle BaseEntity instances - just keep the reference
|
|
167
151
|
if (obj instanceof BaseEntity) {
|
|
168
152
|
return obj;
|
|
169
153
|
}
|
|
170
|
-
// Handle ValueObject instances - just keep the reference (they're immutable)
|
|
171
154
|
if (obj.constructor &&
|
|
172
155
|
obj.constructor.name !== "Object" &&
|
|
173
156
|
obj.constructor.name !== "Array") {
|
|
174
|
-
// Check if it has toJson method (likely a ValueObject or similar)
|
|
175
157
|
if (typeof obj.toJson === "function" &&
|
|
176
158
|
typeof obj.equals === "function") {
|
|
177
|
-
return obj;
|
|
159
|
+
return obj;
|
|
178
160
|
}
|
|
179
161
|
}
|
|
180
162
|
seen.add(obj);
|
|
181
163
|
if (Array.isArray(obj)) {
|
|
182
164
|
return obj.map((item) => this.deepCloneProps(item, seen));
|
|
183
165
|
}
|
|
184
|
-
// Plain objects only
|
|
185
166
|
if (obj.constructor === Object) {
|
|
186
167
|
const cloned = {};
|
|
187
168
|
for (const key in obj) {
|
|
@@ -191,7 +172,6 @@ export class BaseEntity {
|
|
|
191
172
|
}
|
|
192
173
|
return cloned;
|
|
193
174
|
}
|
|
194
|
-
// For other object types (custom classes), just keep the reference
|
|
195
175
|
return obj;
|
|
196
176
|
}
|
|
197
177
|
get id() {
|
|
@@ -202,24 +182,17 @@ export class BaseEntity {
|
|
|
202
182
|
}
|
|
203
183
|
/**
|
|
204
184
|
* Check equality with another entity by comparing IDs
|
|
205
|
-
* Entities are equal if they have the same ID, regardless of other properties
|
|
206
|
-
*
|
|
207
|
-
* @param other - Another entity or an ID to compare with
|
|
208
|
-
* @returns true if entities have the same ID
|
|
209
185
|
*/
|
|
210
186
|
equals(other) {
|
|
211
187
|
if (!other) {
|
|
212
188
|
return false;
|
|
213
189
|
}
|
|
214
|
-
// Compare with another entity
|
|
215
190
|
if (other instanceof BaseEntity) {
|
|
216
191
|
return this.id.equals(other.id);
|
|
217
192
|
}
|
|
218
|
-
// Compare with an ID
|
|
219
193
|
if (other instanceof Id) {
|
|
220
194
|
return this.id.equals(other);
|
|
221
195
|
}
|
|
222
|
-
// Compare with a string ID
|
|
223
196
|
if (typeof other === "string") {
|
|
224
197
|
return this.id.equals(other);
|
|
225
198
|
}
|
|
@@ -240,19 +213,35 @@ export class BaseEntity {
|
|
|
240
213
|
get validationErrors() {
|
|
241
214
|
return this._validationError;
|
|
242
215
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
216
|
+
/**
|
|
217
|
+
* Returns all detected changes as AggregateChanges.
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```typescript
|
|
221
|
+
* const changes = user.getChanges();
|
|
222
|
+
* const batch = changes.toBatchOperations();
|
|
223
|
+
*
|
|
224
|
+
* for (const del of batch.deletes) { ... }
|
|
225
|
+
* for (const create of batch.creates) { ... }
|
|
226
|
+
* for (const upd of batch.updates) { ... }
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
getChanges() {
|
|
230
|
+
return this.tracker.getChanges();
|
|
250
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Returns the change history (for debugging).
|
|
234
|
+
*/
|
|
251
235
|
getHistory() {
|
|
252
|
-
return this.
|
|
236
|
+
return this.tracker.getHistory();
|
|
253
237
|
}
|
|
254
|
-
|
|
255
|
-
|
|
238
|
+
/**
|
|
239
|
+
* Clears history and marks entity as "clean".
|
|
240
|
+
* Call this after successfully persisting to the database.
|
|
241
|
+
*/
|
|
242
|
+
markAsClean() {
|
|
243
|
+
this.tracker.markAsClean();
|
|
244
|
+
this.takeSnapshot();
|
|
256
245
|
}
|
|
257
246
|
/**
|
|
258
247
|
* Add a domain event to this entity
|
|
@@ -260,8 +249,12 @@ export class BaseEntity {
|
|
|
260
249
|
addDomainEvent(event) {
|
|
261
250
|
this.domainEvents.push(event);
|
|
262
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Dispatch all events through the event bus
|
|
254
|
+
*/
|
|
263
255
|
async dispatchAll(bus) {
|
|
264
256
|
await bus.publishAll(this.getUncommittedEvents());
|
|
257
|
+
this.clearEvents();
|
|
265
258
|
}
|
|
266
259
|
/**
|
|
267
260
|
* Get all uncommitted domain events
|
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
|
|
1
|
+
{"version":3,"file":"base-entity.js","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { HistoryEntry } from "./types";
|
|
2
|
+
import { AggregateChanges } from "./aggregate-changes";
|
|
3
|
+
/**
|
|
4
|
+
* Callback for validation on property change.
|
|
5
|
+
* Return false to reject the change, or throw an error.
|
|
6
|
+
*/
|
|
7
|
+
export type OnChangeValidator = (path: string, oldValue: any, newValue: any) => boolean | void;
|
|
8
|
+
/**
|
|
9
|
+
* Tracks changes in Aggregates using Proxy.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Tracks changes in primitive properties
|
|
13
|
+
* - Tracks changes in nested entities (1:1)
|
|
14
|
+
* - Tracks changes in collections (1:N)
|
|
15
|
+
* - Supports Value Objects with identityKey
|
|
16
|
+
* - Calculates depth automatically
|
|
17
|
+
* - Generates AggregateChanges for persistence
|
|
18
|
+
* - Supports validation on change via onChangeValidator
|
|
19
|
+
*/
|
|
20
|
+
export declare class ChangeTracker {
|
|
21
|
+
private target;
|
|
22
|
+
private rootEntityName;
|
|
23
|
+
private path;
|
|
24
|
+
private depth;
|
|
25
|
+
private parentId?;
|
|
26
|
+
private parentEntity?;
|
|
27
|
+
private rootTracker?;
|
|
28
|
+
private history;
|
|
29
|
+
private originalValues;
|
|
30
|
+
private trackedArrays;
|
|
31
|
+
private trackedEntities;
|
|
32
|
+
private onChangeValidator?;
|
|
33
|
+
constructor(target: any, rootEntityName: string, path?: string, depth?: number, parentId?: string | undefined, parentEntity?: string | undefined, rootTracker?: ChangeTracker | undefined);
|
|
34
|
+
/**
|
|
35
|
+
* Sets a validator callback that will be called on every property change.
|
|
36
|
+
* The validator can:
|
|
37
|
+
* - Return false to reject the change (value will be reverted)
|
|
38
|
+
* - Throw an error to reject the change with an error
|
|
39
|
+
* - Return true/undefined to accept the change
|
|
40
|
+
*/
|
|
41
|
+
setOnChangeValidator(validator: OnChangeValidator): void;
|
|
42
|
+
private captureInitialState;
|
|
43
|
+
private captureEntityState;
|
|
44
|
+
private captureArrayState;
|
|
45
|
+
createProxy(): any;
|
|
46
|
+
private createArrayProxy;
|
|
47
|
+
/**
|
|
48
|
+
* Returns all detected changes as AggregateChanges.
|
|
49
|
+
*/
|
|
50
|
+
getChanges<TEntityMap = Record<string, any>>(): AggregateChanges<TEntityMap>;
|
|
51
|
+
private analyzeRootChanges;
|
|
52
|
+
private analyzeCollectionChanges;
|
|
53
|
+
/**
|
|
54
|
+
* Recursively marks all nested items as created when a parent is created.
|
|
55
|
+
*/
|
|
56
|
+
private markNestedItemsAsCreated;
|
|
57
|
+
/**
|
|
58
|
+
* Recursively marks all nested items as deleted when a parent is deleted.
|
|
59
|
+
* Uses the original captured state to find nested items.
|
|
60
|
+
*/
|
|
61
|
+
private markNestedItemsAsDeleted;
|
|
62
|
+
/**
|
|
63
|
+
* Recursively marks nested items as deleted from a JSON object.
|
|
64
|
+
* This is used when processing cloned (JSON) state.
|
|
65
|
+
*/
|
|
66
|
+
private markNestedJsonItemAsDeleted;
|
|
67
|
+
/**
|
|
68
|
+
* Extracts identity key from a JSON object by looking at the original ValueObject instances.
|
|
69
|
+
*/
|
|
70
|
+
private extractIdentityKeyFromJson;
|
|
71
|
+
private collectNestedArrays;
|
|
72
|
+
private analyzeEntityChanges;
|
|
73
|
+
private detectEntityChangeState;
|
|
74
|
+
private detectArrayChanges;
|
|
75
|
+
private detectChangedFields;
|
|
76
|
+
private handleArrayAssignment;
|
|
77
|
+
private handleEntityChange;
|
|
78
|
+
private getRootTracker;
|
|
79
|
+
private buildPath;
|
|
80
|
+
private shouldSkipProperty;
|
|
81
|
+
private getValueAtPath;
|
|
82
|
+
private getItemKey;
|
|
83
|
+
private getEntityId;
|
|
84
|
+
private getEntityName;
|
|
85
|
+
private isEntityOrVO;
|
|
86
|
+
private isEqual;
|
|
87
|
+
private deepEqual;
|
|
88
|
+
private hasChanged;
|
|
89
|
+
private cloneArray;
|
|
90
|
+
private deepClone;
|
|
91
|
+
private normalizeAndStringify;
|
|
92
|
+
getHistory(): HistoryEntry[];
|
|
93
|
+
clearHistory(): void;
|
|
94
|
+
markAsClean(): void;
|
|
95
|
+
getTarget(): any;
|
|
96
|
+
}
|
|
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;IActB,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"}
|