@archtx/core 1.1.10 → 1.1.12
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/exports.d.ts +2 -1
- package/dist/exports.js +2 -1
- package/dist/exports.js.map +1 -1
- package/dist/src/Entity/Entity.benchmark.test.d.ts +1 -0
- package/dist/src/Entity/Entity.benchmark.test.js +283 -0
- package/dist/src/Entity/Entity.benchmark.test.js.map +1 -0
- package/dist/src/Entity/Entity.d.ts +21 -0
- package/dist/src/Entity/Entity.js +229 -0
- package/dist/src/Entity/Entity.js.map +1 -0
- package/dist/src/Entity/Entity.test.d.ts +1 -0
- package/dist/src/Entity/Entity.test.js +238 -0
- package/dist/src/Entity/Entity.test.js.map +1 -0
- package/dist/src/Entity/utils.d.ts +6 -0
- package/dist/src/Entity/utils.js +12 -0
- package/dist/src/Entity/utils.js.map +1 -0
- package/dist/src/errors/AuthError.d.ts +2 -2
- package/dist/src/errors/AuthError.js.map +1 -1
- package/dist/src/errors/RootError.d.ts +2 -2
- package/dist/src/errors/RootError.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/exports.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export * from './src/Entity/Entity.js';
|
|
2
|
+
export * from './src/Entity/utils.js';
|
|
1
3
|
export * from './src/errors/AuthError.js';
|
|
2
4
|
export * from './src/errors/EntityError.js';
|
|
3
5
|
export * from './src/errors/ExpiredError.js';
|
|
@@ -7,5 +9,4 @@ export * from './src/errors/RootError.js';
|
|
|
7
9
|
export * from './src/errors/UseCaseError.js';
|
|
8
10
|
export * from './src/errors/ValidationError.js';
|
|
9
11
|
export * from './src/common-types.js';
|
|
10
|
-
export * from './src/Entity.js';
|
|
11
12
|
export * from './src/UseCase.js';
|
package/dist/exports.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export * from './src/Entity/Entity.js';
|
|
2
|
+
export * from './src/Entity/utils.js';
|
|
1
3
|
export * from './src/errors/AuthError.js';
|
|
2
4
|
export * from './src/errors/EntityError.js';
|
|
3
5
|
export * from './src/errors/ExpiredError.js';
|
|
@@ -7,6 +9,5 @@ export * from './src/errors/RootError.js';
|
|
|
7
9
|
export * from './src/errors/UseCaseError.js';
|
|
8
10
|
export * from './src/errors/ValidationError.js';
|
|
9
11
|
export * from './src/common-types.js';
|
|
10
|
-
export * from './src/Entity.js';
|
|
11
12
|
export * from './src/UseCase.js';
|
|
12
13
|
//# sourceMappingURL=exports.js.map
|
package/dist/exports.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../exports.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAE/C,cAAc,uBAAuB,CAAA;AAErC,cAAc,
|
|
1
|
+
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../exports.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AAErC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iCAAiC,CAAA;AAE/C,cAAc,uBAAuB,CAAA;AAErC,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { describe, it } from 'vitest';
|
|
2
|
+
import { performance } from 'perf_hooks';
|
|
3
|
+
import { Entity } from './Entity.js'; // Update with your actual import path
|
|
4
|
+
// Create a concrete implementation of the abstract Entity class for testing
|
|
5
|
+
class TestEntity extends Entity {
|
|
6
|
+
validate(props) {
|
|
7
|
+
// Simple validation
|
|
8
|
+
if (!props.id)
|
|
9
|
+
throw new Error('ID is required');
|
|
10
|
+
if (!props.name)
|
|
11
|
+
throw new Error('Name is required');
|
|
12
|
+
if (props.age < 0)
|
|
13
|
+
throw new Error('Age cannot be negative');
|
|
14
|
+
}
|
|
15
|
+
static create(props) {
|
|
16
|
+
return new TestEntity(props);
|
|
17
|
+
}
|
|
18
|
+
// Expose private methods for benchmarking
|
|
19
|
+
benchmarkCloneProps(obj) {
|
|
20
|
+
return this._cloneProps(obj);
|
|
21
|
+
}
|
|
22
|
+
benchmarkDeepFreeze(obj) {
|
|
23
|
+
return this._deepFreeze(obj);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Utility to create sample entities of different sizes
|
|
27
|
+
function createEntityProps(size) {
|
|
28
|
+
const base = {
|
|
29
|
+
id: `test-id-${Math.random()}`,
|
|
30
|
+
name: `Test User ${size}`,
|
|
31
|
+
age: 30,
|
|
32
|
+
email: `test-${size}@example.com`,
|
|
33
|
+
address: {
|
|
34
|
+
street: '123 Main St',
|
|
35
|
+
city: 'Test City',
|
|
36
|
+
country: 'Test Country',
|
|
37
|
+
},
|
|
38
|
+
tags: ['tag1', 'tag2', 'tag3'],
|
|
39
|
+
};
|
|
40
|
+
// Add additional complexity based on size
|
|
41
|
+
if (size === 'medium' || size === 'large') {
|
|
42
|
+
base.metadata = {
|
|
43
|
+
createdAt: new Date(),
|
|
44
|
+
updatedAt: new Date(),
|
|
45
|
+
visits: 100,
|
|
46
|
+
preferences: {
|
|
47
|
+
theme: 'dark',
|
|
48
|
+
notifications: true,
|
|
49
|
+
language: 'en',
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (size === 'large') {
|
|
54
|
+
base.metadata = {
|
|
55
|
+
...base.metadata,
|
|
56
|
+
history: Array(50)
|
|
57
|
+
.fill(0)
|
|
58
|
+
.map((_, i) => ({
|
|
59
|
+
action: `action-${i}`,
|
|
60
|
+
timestamp: new Date(),
|
|
61
|
+
details: {
|
|
62
|
+
ip: `192.168.1.${i}`,
|
|
63
|
+
device: `device-${i}`,
|
|
64
|
+
browser: `browser-${i}`,
|
|
65
|
+
location: {
|
|
66
|
+
lat: Math.random() * 180 - 90,
|
|
67
|
+
lng: Math.random() * 360 - 180,
|
|
68
|
+
country: 'Country',
|
|
69
|
+
city: 'City',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return base;
|
|
76
|
+
}
|
|
77
|
+
// Benchmark function
|
|
78
|
+
function runBenchmark(name, fn, iterations) {
|
|
79
|
+
// Warm-up phase to avoid JIT compilation overhead
|
|
80
|
+
for (let i = 0; i < Math.min(iterations / 10, 1000); i++) {
|
|
81
|
+
fn();
|
|
82
|
+
}
|
|
83
|
+
// Measurement phase
|
|
84
|
+
const start = performance.now();
|
|
85
|
+
for (let i = 0; i < iterations; i++) {
|
|
86
|
+
fn();
|
|
87
|
+
}
|
|
88
|
+
const end = performance.now();
|
|
89
|
+
const totalTimeMs = end - start;
|
|
90
|
+
const timePerOperationMs = totalTimeMs / iterations;
|
|
91
|
+
const operationsPerSecond = 1000 / timePerOperationMs;
|
|
92
|
+
console.log(`${name}:`);
|
|
93
|
+
console.log(` Total time: ${totalTimeMs.toFixed(2)} ms`);
|
|
94
|
+
console.log(` Iterations: ${iterations}`);
|
|
95
|
+
console.log(` Time per operation: ${timePerOperationMs.toFixed(6)} ms`);
|
|
96
|
+
console.log(` Operations per second: ${operationsPerSecond.toFixed(2)}`);
|
|
97
|
+
return {
|
|
98
|
+
name,
|
|
99
|
+
opsPerSecond: operationsPerSecond,
|
|
100
|
+
timePerOp: timePerOperationMs,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
describe('Entity Performance Benchmarks', () => {
|
|
104
|
+
// Adjust iterations based on operation complexity
|
|
105
|
+
const iterations = {
|
|
106
|
+
small: 10000,
|
|
107
|
+
medium: 5000,
|
|
108
|
+
large: 1000,
|
|
109
|
+
};
|
|
110
|
+
it('should benchmark entity instantiation with different sizes', () => {
|
|
111
|
+
const results = [];
|
|
112
|
+
// Small entity
|
|
113
|
+
const smallProps = createEntityProps('small');
|
|
114
|
+
results.push(runBenchmark('Entity instantiation (small)', () => TestEntity.create({ ...smallProps, id: `small-${Math.random()}` }), iterations.small));
|
|
115
|
+
// Medium entity
|
|
116
|
+
const mediumProps = createEntityProps('medium');
|
|
117
|
+
results.push(runBenchmark('Entity instantiation (medium)', () => TestEntity.create({ ...mediumProps, id: `medium-${Math.random()}` }), iterations.medium));
|
|
118
|
+
// Large entity
|
|
119
|
+
const largeProps = createEntityProps('large');
|
|
120
|
+
results.push(runBenchmark('Entity instantiation (large)', () => TestEntity.create({ ...largeProps, id: `large-${Math.random()}` }), iterations.large));
|
|
121
|
+
console.log('\nEntity instantiation comparison:');
|
|
122
|
+
results.forEach((r) => {
|
|
123
|
+
console.log(` ${r.name}: ${r.opsPerSecond.toFixed(2)} ops/sec (${r.timePerOp.toFixed(3)} ms per op)`);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
it('should benchmark property setting with different property types', () => {
|
|
127
|
+
const results = [];
|
|
128
|
+
// Create entities of different sizes
|
|
129
|
+
const smallEntity = TestEntity.create(createEntityProps('small'));
|
|
130
|
+
const mediumEntity = TestEntity.create(createEntityProps('medium'));
|
|
131
|
+
const largeEntity = TestEntity.create(createEntityProps('large'));
|
|
132
|
+
// Simple property settings
|
|
133
|
+
results.push(runBenchmark('Set simple property (string)', () => smallEntity.set('name', `User-${Math.random()}`), iterations.small));
|
|
134
|
+
results.push(runBenchmark('Set simple property (number)', () => smallEntity.set('age', Math.floor(Math.random() * 100)), iterations.small));
|
|
135
|
+
// Nested property settings
|
|
136
|
+
results.push(runBenchmark('Set nested property (object)', () => smallEntity.set('address', {
|
|
137
|
+
street: `${Math.random()} Main St`,
|
|
138
|
+
city: 'Updated City',
|
|
139
|
+
country: 'Updated Country',
|
|
140
|
+
}), iterations.small));
|
|
141
|
+
results.push(runBenchmark('Set array property', () => smallEntity.set('tags', Array(3)
|
|
142
|
+
.fill(0)
|
|
143
|
+
.map((_, i) => `tag-${Math.random()}`)), iterations.small));
|
|
144
|
+
// Settings on larger entities
|
|
145
|
+
results.push(runBenchmark('Set property on medium entity', () => mediumEntity.set('name', `Medium-${Math.random()}`), iterations.medium));
|
|
146
|
+
if (mediumEntity.props.metadata) {
|
|
147
|
+
results.push(runBenchmark('Set nested property on medium entity', () => {
|
|
148
|
+
const metadata = { ...mediumEntity.props.metadata };
|
|
149
|
+
if (metadata.preferences) {
|
|
150
|
+
metadata.preferences = {
|
|
151
|
+
...metadata.preferences,
|
|
152
|
+
theme: Math.random() > 0.5 ? 'dark' : 'light',
|
|
153
|
+
};
|
|
154
|
+
mediumEntity.set('metadata', metadata);
|
|
155
|
+
}
|
|
156
|
+
}, iterations.medium));
|
|
157
|
+
}
|
|
158
|
+
results.push(runBenchmark('Set property on large entity', () => largeEntity.set('name', `Large-${Math.random()}`), iterations.large));
|
|
159
|
+
console.log('\nProperty setting comparison:');
|
|
160
|
+
results.forEach((r) => {
|
|
161
|
+
console.log(` ${r.name}: ${r.opsPerSecond.toFixed(2)} ops/sec (${r.timePerOp.toFixed(3)} ms per op)`);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
it('should benchmark _cloneProps with different object complexities', () => {
|
|
165
|
+
const results = [];
|
|
166
|
+
const entity = TestEntity.create(createEntityProps('small'));
|
|
167
|
+
// Simple object cloning
|
|
168
|
+
const simpleObj = { id: 'test', name: 'Simple', value: 42 };
|
|
169
|
+
results.push(runBenchmark('Clone simple object (3 properties)', () => entity.benchmarkCloneProps(simpleObj), iterations.small));
|
|
170
|
+
// Object with nested properties
|
|
171
|
+
const nestedObj = {
|
|
172
|
+
id: 'test',
|
|
173
|
+
name: 'Nested',
|
|
174
|
+
address: {
|
|
175
|
+
street: 'Main St',
|
|
176
|
+
city: 'Test City',
|
|
177
|
+
zip: '12345',
|
|
178
|
+
geo: { lat: 10, lng: 20 },
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
results.push(runBenchmark('Clone nested object (depth 3)', () => entity.benchmarkCloneProps(nestedObj), iterations.small));
|
|
182
|
+
// Object with arrays
|
|
183
|
+
const arrayObj = {
|
|
184
|
+
id: 'test',
|
|
185
|
+
name: 'Array Object',
|
|
186
|
+
items: Array(10)
|
|
187
|
+
.fill(0)
|
|
188
|
+
.map((_, i) => ({ id: `item-${i}`, value: i })),
|
|
189
|
+
};
|
|
190
|
+
results.push(runBenchmark('Clone object with array (10 items)', () => entity.benchmarkCloneProps(arrayObj), iterations.small));
|
|
191
|
+
// Object with Date instances
|
|
192
|
+
const dateObj = {
|
|
193
|
+
id: 'test',
|
|
194
|
+
name: 'Date Object',
|
|
195
|
+
created: new Date(),
|
|
196
|
+
updated: new Date(),
|
|
197
|
+
appointments: Array(5)
|
|
198
|
+
.fill(0)
|
|
199
|
+
.map((_, i) => new Date(Date.now() + i * 86400000)),
|
|
200
|
+
};
|
|
201
|
+
results.push(runBenchmark('Clone object with Date instances', () => entity.benchmarkCloneProps(dateObj), iterations.small));
|
|
202
|
+
// Complex object with arrays, nested objects, and dates
|
|
203
|
+
const complexObj = {
|
|
204
|
+
id: 'test',
|
|
205
|
+
name: 'Complex',
|
|
206
|
+
created: new Date(),
|
|
207
|
+
items: Array(20)
|
|
208
|
+
.fill(0)
|
|
209
|
+
.map((_, i) => ({
|
|
210
|
+
id: `item-${i}`,
|
|
211
|
+
value: i,
|
|
212
|
+
tags: Array(3)
|
|
213
|
+
.fill(0)
|
|
214
|
+
.map((_, j) => `tag-${j}`),
|
|
215
|
+
metadata: {
|
|
216
|
+
created: new Date(),
|
|
217
|
+
updated: new Date(),
|
|
218
|
+
status: i % 2 === 0 ? 'active' : 'inactive',
|
|
219
|
+
},
|
|
220
|
+
})),
|
|
221
|
+
};
|
|
222
|
+
results.push(runBenchmark('Clone complex object', () => entity.benchmarkCloneProps(complexObj), iterations.medium));
|
|
223
|
+
// Very large object
|
|
224
|
+
const largeObj = createEntityProps('large');
|
|
225
|
+
results.push(runBenchmark('Clone very large object', () => entity.benchmarkCloneProps(largeObj), iterations.large));
|
|
226
|
+
console.log('\nObject cloning comparison:');
|
|
227
|
+
results.forEach((r) => {
|
|
228
|
+
console.log(` ${r.name}: ${r.opsPerSecond.toFixed(2)} ops/sec (${r.timePerOp.toFixed(3)} ms per op)`);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
it('should benchmark _deepFreeze with different object complexities', () => {
|
|
232
|
+
const results = [];
|
|
233
|
+
const entity = TestEntity.create(createEntityProps('small'));
|
|
234
|
+
// Simple object freezing
|
|
235
|
+
results.push(runBenchmark('Freeze simple object', () => entity.benchmarkDeepFreeze({ ...createEntityProps('small') }), iterations.small));
|
|
236
|
+
// Medium object freezing
|
|
237
|
+
results.push(runBenchmark('Freeze medium object', () => entity.benchmarkDeepFreeze({ ...createEntityProps('medium') }), iterations.medium));
|
|
238
|
+
// Large object freezing
|
|
239
|
+
results.push(runBenchmark('Freeze large object', () => entity.benchmarkDeepFreeze({ ...createEntityProps('large') }), iterations.large));
|
|
240
|
+
console.log('\nDeep freezing comparison:');
|
|
241
|
+
results.forEach((r) => {
|
|
242
|
+
console.log(` ${r.name}: ${r.opsPerSecond.toFixed(2)} ops/sec (${r.timePerOp.toFixed(3)} ms per op)`);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
it('should benchmark complete entity operations', () => {
|
|
246
|
+
const results = [];
|
|
247
|
+
// Create an entity and perform a series of operations
|
|
248
|
+
results.push(runBenchmark('Entity lifecycle (create + 5 property updates)', () => {
|
|
249
|
+
const entity = TestEntity.create(createEntityProps('small'));
|
|
250
|
+
entity.set('name', `User-${Math.random()}`);
|
|
251
|
+
entity.set('age', Math.floor(Math.random() * 100));
|
|
252
|
+
entity.set('email', `user-${Math.random()}@example.com`);
|
|
253
|
+
entity.set('address', {
|
|
254
|
+
street: `${Math.random()} Street`,
|
|
255
|
+
city: `City-${Math.random()}`,
|
|
256
|
+
country: 'Test Country',
|
|
257
|
+
});
|
|
258
|
+
entity.set('tags', Array(3)
|
|
259
|
+
.fill(0)
|
|
260
|
+
.map((_, i) => `tag-${Math.random()}`));
|
|
261
|
+
return entity.toJSON();
|
|
262
|
+
}, iterations.medium / 5));
|
|
263
|
+
// Create, update, and serialize
|
|
264
|
+
results.push(runBenchmark('Create, update single property, and serialize', () => {
|
|
265
|
+
const entity = TestEntity.create(createEntityProps('medium'));
|
|
266
|
+
entity.set('name', `User-${Math.random()}`);
|
|
267
|
+
return entity.toJSON();
|
|
268
|
+
}, iterations.medium / 2));
|
|
269
|
+
// Multiple sequential updates to the same property
|
|
270
|
+
results.push(runBenchmark('Multiple sequential updates to the same property', () => {
|
|
271
|
+
const entity = TestEntity.create(createEntityProps('small'));
|
|
272
|
+
for (let i = 0; i < 5; i++) {
|
|
273
|
+
entity.set('name', `User-${i}-${Math.random()}`);
|
|
274
|
+
}
|
|
275
|
+
return entity.toJSON();
|
|
276
|
+
}, iterations.medium / 5));
|
|
277
|
+
console.log('\nCommon operations comparison:');
|
|
278
|
+
results.forEach((r) => {
|
|
279
|
+
console.log(` ${r.name}: ${r.opsPerSecond.toFixed(2)} ops/sec (${r.timePerOp.toFixed(3)} ms per op)`);
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
//# sourceMappingURL=Entity.benchmark.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Entity.benchmark.test.js","sourceRoot":"","sources":["../../../src/Entity/Entity.benchmark.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA,CAAC,sCAAsC;AA8B3E,4EAA4E;AAC5E,MAAM,UAAW,SAAQ,MAAkB;IACzC,QAAQ,CAAC,KAAiB;QACxB,oBAAoB;QACpB,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAChD,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACpD,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAiB;QAC7B,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IAED,0CAA0C;IACnC,mBAAmB,CAAC,GAAQ;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAEM,mBAAmB,CAAC,GAAQ;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;CACF;AAED,uDAAuD;AACvD,SAAS,iBAAiB,CAAC,IAAkC;IAC3D,MAAM,IAAI,GAAe;QACvB,EAAE,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE;QAC9B,IAAI,EAAE,aAAa,IAAI,EAAE;QACzB,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,QAAQ,IAAI,cAAc;QACjC,OAAO,EAAE;YACP,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,cAAc;SACxB;QACD,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAC/B,CAAA;IAED,0CAA0C;IAC1C,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG;YACd,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,MAAM,EAAE,GAAG;YACX,WAAW,EAAE;gBACX,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,IAAI;aACf;SACF,CAAA;IACH,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG;YACd,GAAG,IAAI,CAAC,QAAQ;YAChB,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;iBACf,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACd,MAAM,EAAE,UAAU,CAAC,EAAE;gBACrB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE;oBACP,EAAE,EAAE,aAAa,CAAC,EAAE;oBACpB,MAAM,EAAE,UAAU,CAAC,EAAE;oBACrB,OAAO,EAAE,WAAW,CAAC,EAAE;oBACvB,QAAQ,EAAE;wBACR,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE;wBAC7B,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG;wBAC9B,OAAO,EAAE,SAAS;wBAClB,IAAI,EAAE,MAAM;qBACb;iBACF;aACF,CAAC,CAAC;SACN,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,qBAAqB;AACrB,SAAS,YAAY,CACnB,IAAY,EACZ,EAAc,EACd,UAAkB;IAElB,kDAAkD;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzD,EAAE,EAAE,CAAA;IACN,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,EAAE,EAAE,CAAA;IACN,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAE7B,MAAM,WAAW,GAAG,GAAG,GAAG,KAAK,CAAA;IAC/B,MAAM,kBAAkB,GAAG,WAAW,GAAG,UAAU,CAAA;IACnD,MAAM,mBAAmB,GAAG,IAAI,GAAG,kBAAkB,CAAA;IAErD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;IACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,CAAC,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACxE,OAAO,CAAC,GAAG,CAAC,4BAA4B,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEzE,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,mBAAmB;QACjC,SAAS,EAAE,kBAAkB;KAC9B,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,kDAAkD;IAClD,MAAM,UAAU,GAAG;QACjB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;KACZ,CAAA;IAED,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,OAAO,GAAG,EAAE,CAAA;QAElB,eAAe;QACf,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CACV,YAAY,CACV,8BAA8B,EAC9B,GAAG,EAAE,CACH,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EACpE,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,gBAAgB;QAChB,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CACV,YAAY,CACV,+BAA+B,EAC/B,GAAG,EAAE,CACH,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EACtE,UAAU,CAAC,MAAM,CAClB,CACF,CAAA;QAED,eAAe;QACf,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CACV,YAAY,CACV,8BAA8B,EAC9B,GAAG,EAAE,CACH,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EACpE,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;QACjD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAC1F,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,OAAO,GAAG,EAAE,CAAA;QAElB,qCAAqC;QACrC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;QACjE,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;QACnE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;QAEjE,2BAA2B;QAC3B,OAAO,CAAC,IAAI,CACV,YAAY,CACV,8BAA8B,EAC9B,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EACtD,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,OAAO,CAAC,IAAI,CACV,YAAY,CACV,8BAA8B,EAC9B,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,EAC7D,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,2BAA2B;QAC3B,OAAO,CAAC,IAAI,CACV,YAAY,CACV,8BAA8B,EAC9B,GAAG,EAAE,CACH,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU;YAClC,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,iBAAiB;SAC3B,CAAC,EACJ,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,OAAO,CAAC,IAAI,CACV,YAAY,CACV,oBAAoB,EACpB,GAAG,EAAE,CACH,WAAW,CAAC,GAAG,CACb,MAAM,EACN,KAAK,CAAC,CAAC,CAAC;aACL,IAAI,CAAC,CAAC,CAAC;aACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CACzC,EACH,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,8BAA8B;QAC9B,OAAO,CAAC,IAAI,CACV,YAAY,CACV,+BAA+B,EAC/B,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EACzD,UAAU,CAAC,MAAM,CAClB,CACF,CAAA;QAED,IAAI,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CACV,YAAY,CACV,sCAAsC,EACtC,GAAG,EAAE;gBACH,MAAM,QAAQ,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAA;gBACnD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACzB,QAAQ,CAAC,WAAW,GAAG;wBACrB,GAAG,QAAQ,CAAC,WAAW;wBACvB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;qBAC9C,CAAA;oBACD,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC,EACD,UAAU,CAAC,MAAM,CAClB,CACF,CAAA;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CACV,YAAY,CACV,8BAA8B,EAC9B,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EACvD,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;QAC7C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAC1F,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;QAE5D,wBAAwB;QACxB,MAAM,SAAS,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;QAC3D,OAAO,CAAC,IAAI,CACV,YAAY,CACV,oCAAoC,EACpC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAC3C,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,gCAAgC;QAChC,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,OAAO;gBACZ,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;aAC1B;SACF,CAAA;QACD,OAAO,CAAC,IAAI,CACV,YAAY,CACV,+BAA+B,EAC/B,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAC3C,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;iBACb,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SAClD,CAAA;QACD,OAAO,CAAC,IAAI,CACV,YAAY,CACV,oCAAoC,EACpC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAC1C,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,6BAA6B;QAC7B,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;iBACnB,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;SACtD,CAAA;QACD,OAAO,CAAC,IAAI,CACV,YAAY,CACV,kCAAkC,EAClC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,EACzC,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,wDAAwD;QACxD,MAAM,UAAU,GAAG;YACjB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;iBACb,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACd,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;qBACX,IAAI,CAAC,CAAC,CAAC;qBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,QAAQ,EAAE;oBACR,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;iBAC5C;aACF,CAAC,CAAC;SACN,CAAA;QACD,OAAO,CAAC,IAAI,CACV,YAAY,CACV,sBAAsB,EACtB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAC5C,UAAU,CAAC,MAAM,CAClB,CACF,CAAA;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC3C,OAAO,CAAC,IAAI,CACV,YAAY,CACV,yBAAyB,EACzB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAC1C,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;QAC3C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAC1F,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;QAE5D,yBAAyB;QACzB,OAAO,CAAC,IAAI,CACV,YAAY,CACV,sBAAsB,EACtB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,EACnE,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,yBAAyB;QACzB,OAAO,CAAC,IAAI,CACV,YAAY,CACV,sBAAsB,EACtB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,EACpE,UAAU,CAAC,MAAM,CAClB,CACF,CAAA;QAED,wBAAwB;QACxB,OAAO,CAAC,IAAI,CACV,YAAY,CACV,qBAAqB,EACrB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,EACnE,UAAU,CAAC,KAAK,CACjB,CACF,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAC1F,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG,EAAE,CAAA;QAElB,sDAAsD;QACtD,OAAO,CAAC,IAAI,CACV,YAAY,CACV,gDAAgD,EAChD,GAAG,EAAE;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;YAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAC3C,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;YAClD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;YACxD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE;gBACpB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS;gBACjC,IAAI,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;gBAC7B,OAAO,EAAE,cAAc;aACxB,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CACR,MAAM,EACN,KAAK,CAAC,CAAC,CAAC;iBACL,IAAI,CAAC,CAAC,CAAC;iBACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CACzC,CAAA;YACD,OAAO,MAAM,CAAC,MAAM,EAAE,CAAA;QACxB,CAAC,EACD,UAAU,CAAC,MAAM,GAAG,CAAC,CACtB,CACF,CAAA;QAED,gCAAgC;QAChC,OAAO,CAAC,IAAI,CACV,YAAY,CACV,+CAA+C,EAC/C,GAAG,EAAE;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC7D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAC3C,OAAO,MAAM,CAAC,MAAM,EAAE,CAAA;QACxB,CAAC,EACD,UAAU,CAAC,MAAM,GAAG,CAAC,CACtB,CACF,CAAA;QAED,mDAAmD;QACnD,OAAO,CAAC,IAAI,CACV,YAAY,CACV,kDAAkD,EAClD,GAAG,EAAE;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAA;YAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAClD,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,EAAE,CAAA;QACxB,CAAC,EACD,UAAU,CAAC,MAAM,GAAG,CAAC,CACtB,CACF,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;QAC9C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAC1F,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { DeepReadonly, IWithID } from '../common-types.js';
|
|
2
|
+
export declare abstract class EntityImmutable<Schema extends IWithID> {
|
|
3
|
+
protected _props: Schema;
|
|
4
|
+
get props(): DeepReadonly<Schema>;
|
|
5
|
+
constructor(props: Schema);
|
|
6
|
+
toJSON(): DeepReadonly<Schema>;
|
|
7
|
+
}
|
|
8
|
+
export declare abstract class Entity<Schema extends IWithID, PrivateSetters extends keyof Schema = never> {
|
|
9
|
+
abstract validate(props: Schema): void;
|
|
10
|
+
get previousProps(): DeepReadonly<Schema>;
|
|
11
|
+
get props(): DeepReadonly<Schema>;
|
|
12
|
+
set(updater: (draft: Schema) => void): void;
|
|
13
|
+
set<Key extends Exclude<keyof Schema, PrivateSetters | 'id'>>(key: Key, value: Schema[Key]): void;
|
|
14
|
+
set<Key extends Exclude<keyof Schema, PrivateSetters | 'id'>>(key: Key, updater: (draft: Schema[Key]) => void | Schema[Key]): void;
|
|
15
|
+
toJSON(): Schema;
|
|
16
|
+
protected _previousProps?: Schema;
|
|
17
|
+
protected _props: Schema;
|
|
18
|
+
protected constructor(props: Schema);
|
|
19
|
+
protected _cloneProps(obj: Schema): Schema;
|
|
20
|
+
protected _deepFreeze(obj: any): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
export class EntityImmutable {
|
|
2
|
+
_props;
|
|
3
|
+
get props() {
|
|
4
|
+
return this._props;
|
|
5
|
+
}
|
|
6
|
+
constructor(props) {
|
|
7
|
+
this._props = props;
|
|
8
|
+
}
|
|
9
|
+
toJSON() {
|
|
10
|
+
return this._props;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class Entity {
|
|
14
|
+
get previousProps() {
|
|
15
|
+
return (this._previousProps || this._props);
|
|
16
|
+
}
|
|
17
|
+
get props() {
|
|
18
|
+
return this._props;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Update the entity with a new value or function updater. The updater
|
|
22
|
+
* function receives the current value and should return the new value.
|
|
23
|
+
* The updater function can also modify the draft in place and return void.
|
|
24
|
+
* The draft will be used as the new value.
|
|
25
|
+
* @param keyOrUpdater The key to update or a function to update the entire entity
|
|
26
|
+
* @param valueOrUpdater The value to set or a function to update a specific property
|
|
27
|
+
*/
|
|
28
|
+
set(keyOrUpdater, valueOrUpdater) {
|
|
29
|
+
// On the first change/set call, clone the props
|
|
30
|
+
this._previousProps ??= this._cloneProps(this._props);
|
|
31
|
+
// Clone current props
|
|
32
|
+
const newProps = this._cloneProps(this._props);
|
|
33
|
+
// Case 1: Update the entire entity with a function
|
|
34
|
+
if (typeof keyOrUpdater === 'function') {
|
|
35
|
+
const updater = keyOrUpdater;
|
|
36
|
+
// Apply the updater to the cloned props
|
|
37
|
+
updater(newProps);
|
|
38
|
+
}
|
|
39
|
+
// Case 2 & 3: Update a specific property
|
|
40
|
+
else {
|
|
41
|
+
const key = keyOrUpdater;
|
|
42
|
+
// Check if key is private
|
|
43
|
+
if (key === 'id')
|
|
44
|
+
throw new Error('Cannot set ID');
|
|
45
|
+
// Case 2: Direct value assignment
|
|
46
|
+
if (typeof valueOrUpdater !== 'function') {
|
|
47
|
+
newProps[key] = valueOrUpdater;
|
|
48
|
+
}
|
|
49
|
+
// Case 3: Function updater for a specific property
|
|
50
|
+
else {
|
|
51
|
+
const updater = valueOrUpdater;
|
|
52
|
+
const propertyClone = this._cloneProps(newProps[key]);
|
|
53
|
+
const result = updater(propertyClone);
|
|
54
|
+
// If the updater returns a value, use that value
|
|
55
|
+
if (result !== undefined) {
|
|
56
|
+
newProps[key] = result;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Otherwise use the modified draft
|
|
60
|
+
newProps[key] = propertyClone;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Validate (must be before setting _props)
|
|
65
|
+
this.validate(newProps);
|
|
66
|
+
this._props = newProps;
|
|
67
|
+
// Freeze props deeply in dev environment only
|
|
68
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
69
|
+
this._deepFreeze(this._props);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
toJSON() {
|
|
73
|
+
return this._cloneProps(this._props);
|
|
74
|
+
}
|
|
75
|
+
/* Only exists if the _props were changed */
|
|
76
|
+
_previousProps;
|
|
77
|
+
_props;
|
|
78
|
+
constructor(props) {
|
|
79
|
+
this._props = props;
|
|
80
|
+
this._deepFreeze(this._props);
|
|
81
|
+
}
|
|
82
|
+
_cloneProps(obj) {
|
|
83
|
+
// clone values only, do not clone object configuration
|
|
84
|
+
if (obj === null || typeof obj !== 'object') {
|
|
85
|
+
return obj;
|
|
86
|
+
}
|
|
87
|
+
// Handle Date objects specially
|
|
88
|
+
if (obj instanceof Date) {
|
|
89
|
+
return new Date(obj);
|
|
90
|
+
}
|
|
91
|
+
// Create a fresh object/array to avoid inheriting configurations
|
|
92
|
+
const clone = Array.isArray(obj)
|
|
93
|
+
? []
|
|
94
|
+
: {};
|
|
95
|
+
// Copy each property value
|
|
96
|
+
for (const key in obj) {
|
|
97
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
98
|
+
const val = obj[key];
|
|
99
|
+
// Recursively clone nested objects and arrays
|
|
100
|
+
clone[key] =
|
|
101
|
+
val && typeof val === 'object' ? this._cloneProps(val) : val;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return clone;
|
|
105
|
+
}
|
|
106
|
+
_deepFreeze(obj) {
|
|
107
|
+
if (obj && typeof obj === 'object') {
|
|
108
|
+
Object.freeze(obj);
|
|
109
|
+
Object.getOwnPropertyNames(obj).forEach((prop) => {
|
|
110
|
+
if (obj[prop] !== null &&
|
|
111
|
+
(typeof obj[prop] === 'object' || typeof obj[prop] === 'function') &&
|
|
112
|
+
!Object.isFrozen(obj[prop])) {
|
|
113
|
+
this._deepFreeze(obj[prop]);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// import { DeepReadonly, IWithID } from './common-types'
|
|
120
|
+
//
|
|
121
|
+
// export abstract class EntityImmutable<Schema extends IWithID> {
|
|
122
|
+
// protected _props: Schema
|
|
123
|
+
//
|
|
124
|
+
// get props(): DeepReadonly<Schema> {
|
|
125
|
+
// return this._props as DeepReadonly<Schema>
|
|
126
|
+
// }
|
|
127
|
+
//
|
|
128
|
+
// constructor(props: Schema) {
|
|
129
|
+
// this._props = props
|
|
130
|
+
// }
|
|
131
|
+
//
|
|
132
|
+
// public toJSON(): DeepReadonly<Schema> {
|
|
133
|
+
// return this._props as DeepReadonly<Schema>
|
|
134
|
+
// }
|
|
135
|
+
// }
|
|
136
|
+
//
|
|
137
|
+
// export abstract class Entity<Schema extends IWithID, PrivateSetters extends keyof Schema = never> {
|
|
138
|
+
// abstract validate(props: Schema): void
|
|
139
|
+
//
|
|
140
|
+
// get previousProps(): DeepReadonly<Schema> {
|
|
141
|
+
// return (this._previousProps || this._props) as DeepReadonly<Schema>
|
|
142
|
+
// }
|
|
143
|
+
//
|
|
144
|
+
// get props(): DeepReadonly<Schema> {
|
|
145
|
+
// return this._props as DeepReadonly<Schema>
|
|
146
|
+
// }
|
|
147
|
+
//
|
|
148
|
+
// public set<Key extends Exclude<keyof Schema, PrivateSetters | 'id'>>(key: Key, value: Schema[Key]): void {
|
|
149
|
+
// // Check if key is private
|
|
150
|
+
// if (key === 'id') throw new Error('Cannot set ID')
|
|
151
|
+
//
|
|
152
|
+
// // On the first change/set call, clone the props
|
|
153
|
+
// this._previousProps ??= this._cloneProps(this._props)
|
|
154
|
+
//
|
|
155
|
+
// // Clone current props
|
|
156
|
+
// const newProps = this._cloneProps(this._props)
|
|
157
|
+
//
|
|
158
|
+
// // Set new value
|
|
159
|
+
// newProps[key] = value
|
|
160
|
+
//
|
|
161
|
+
// // Validate (must be before setting _props)
|
|
162
|
+
// this.validate(newProps)
|
|
163
|
+
//
|
|
164
|
+
// this._props = newProps
|
|
165
|
+
//
|
|
166
|
+
// // Freeze props deeply in dev environment only
|
|
167
|
+
// if (process.env.NODE_ENV !== 'production') {
|
|
168
|
+
// this._deepFreeze(this._props)
|
|
169
|
+
// }
|
|
170
|
+
// }
|
|
171
|
+
//
|
|
172
|
+
// public toJSON(): DeepReadonly<Schema> {
|
|
173
|
+
// return this._props as DeepReadonly<Schema>
|
|
174
|
+
// }
|
|
175
|
+
//
|
|
176
|
+
// /* Only exists if the _props were changed */
|
|
177
|
+
// protected _previousProps?: Schema
|
|
178
|
+
// protected _props: Schema
|
|
179
|
+
//
|
|
180
|
+
// protected constructor(props: Schema) {
|
|
181
|
+
// this._props = props
|
|
182
|
+
// this._deepFreeze(this._props)
|
|
183
|
+
// }
|
|
184
|
+
//
|
|
185
|
+
// protected _cloneProps(obj: Schema): Schema {
|
|
186
|
+
// // clone values only, do not clone object configuration
|
|
187
|
+
// if (obj === null || typeof obj !== 'object') {
|
|
188
|
+
// return obj
|
|
189
|
+
// }
|
|
190
|
+
//
|
|
191
|
+
// // Handle Date objects specially
|
|
192
|
+
// if (obj instanceof Date) {
|
|
193
|
+
// return new Date(obj) as any
|
|
194
|
+
// }
|
|
195
|
+
//
|
|
196
|
+
// // Create a fresh object/array to avoid inheriting configurations
|
|
197
|
+
// const clone: any = Array.isArray(obj)
|
|
198
|
+
// ? ([] as any[])
|
|
199
|
+
// : ({} as Record<string, any>)
|
|
200
|
+
//
|
|
201
|
+
// // Copy each property value
|
|
202
|
+
// for (const key in obj) {
|
|
203
|
+
// if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
204
|
+
// const val = obj[key]
|
|
205
|
+
// // Recursively clone nested objects and arrays
|
|
206
|
+
// clone[key as any] =
|
|
207
|
+
// val && typeof val === 'object' ? this._cloneProps(val as any) : val
|
|
208
|
+
// }
|
|
209
|
+
// }
|
|
210
|
+
//
|
|
211
|
+
// return clone as Schema
|
|
212
|
+
// }
|
|
213
|
+
//
|
|
214
|
+
// protected _deepFreeze(obj: any): void {
|
|
215
|
+
// if (obj && typeof obj === 'object') {
|
|
216
|
+
// Object.freeze(obj)
|
|
217
|
+
// Object.getOwnPropertyNames(obj).forEach((prop) => {
|
|
218
|
+
// if (
|
|
219
|
+
// obj[prop] !== null &&
|
|
220
|
+
// (typeof obj[prop] === 'object' || typeof obj[prop] === 'function') &&
|
|
221
|
+
// !Object.isFrozen(obj[prop])
|
|
222
|
+
// ) {
|
|
223
|
+
// this._deepFreeze(obj[prop])
|
|
224
|
+
// }
|
|
225
|
+
// })
|
|
226
|
+
// }
|
|
227
|
+
// }
|
|
228
|
+
// }
|
|
229
|
+
//# sourceMappingURL=Entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Entity.js","sourceRoot":"","sources":["../../../src/Entity/Entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|