@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 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
@@ -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,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA"}
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":"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"}
@@ -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 {};