@rtpaulino/entity 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/entity-utils.d.ts +134 -4
- package/dist/lib/entity-utils.d.ts.map +1 -1
- package/dist/lib/entity-utils.js +268 -98
- package/dist/lib/entity-utils.js.map +1 -1
- package/dist/lib/entity.d.ts +57 -1
- package/dist/lib/entity.d.ts.map +1 -1
- package/dist/lib/entity.js +52 -2
- package/dist/lib/entity.js.map +1 -1
- package/dist/lib/property.d.ts.map +1 -1
- package/dist/lib/property.js +0 -14
- package/dist/lib/property.js.map +1 -1
- package/dist/lib/types.d.ts +4 -10
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/collection-property.d.ts +0 -38
- package/dist/lib/collection-property.d.ts.map +0 -1
- package/dist/lib/collection-property.js +0 -47
- package/dist/lib/collection-property.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export * from './lib/entity-utils.js';
|
|
|
4
4
|
export * from './lib/entity-di.js';
|
|
5
5
|
export * from './lib/types.js';
|
|
6
6
|
export * from './lib/property.js';
|
|
7
|
-
export * from './lib/collection-property.js';
|
|
8
7
|
export * from './lib/validation-error.js';
|
|
9
8
|
export * from './lib/problem.js';
|
|
10
9
|
export * from './lib/validation-utils.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,6 @@ export * from './lib/entity-utils.js';
|
|
|
4
4
|
export * from './lib/entity-di.js';
|
|
5
5
|
export * from './lib/types.js';
|
|
6
6
|
export * from './lib/property.js';
|
|
7
|
-
export * from './lib/collection-property.js';
|
|
8
7
|
export * from './lib/validation-error.js';
|
|
9
8
|
export * from './lib/problem.js';
|
|
10
9
|
export * from './lib/validation-utils.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import 'reflect-metadata';\n\nexport * from './lib/entity.js';\nexport * from './lib/entity-utils.js';\nexport * from './lib/entity-di.js';\nexport * from './lib/types.js';\nexport * from './lib/property.js';\nexport * from './lib/
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import 'reflect-metadata';\n\nexport * from './lib/entity.js';\nexport * from './lib/entity-utils.js';\nexport * from './lib/entity-di.js';\nexport * from './lib/types.js';\nexport * from './lib/property.js';\nexport * from './lib/validation-error.js';\nexport * from './lib/problem.js';\nexport * from './lib/validation-utils.js';\nexport * from './lib/primitive-deserializers.js';\nexport * from './lib/validators.js';\nexport * from './lib/zod-property.js';\nexport * from './lib/injected-property.js';\n"],"names":[],"mappings":"AAAA,OAAO,mBAAmB;AAE1B,cAAc,kBAAkB;AAChC,cAAc,wBAAwB;AACtC,cAAc,qBAAqB;AACnC,cAAc,iBAAiB;AAC/B,cAAc,oBAAoB;AAClC,cAAc,4BAA4B;AAC1C,cAAc,mBAAmB;AACjC,cAAc,4BAA4B;AAC1C,cAAc,mCAAmC;AACjD,cAAc,sBAAsB;AACpC,cAAc,wBAAwB;AACtC,cAAc,6BAA6B"}
|
|
@@ -22,6 +22,34 @@ export declare class EntityUtils {
|
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
static isEntity(obj: unknown): obj is object;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the entity options for a given constructor
|
|
27
|
+
*
|
|
28
|
+
* @param entityOrClass - The entity class constructor or instance
|
|
29
|
+
* @returns EntityOptions object (empty object if no options are defined)
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
private static getEntityOptions;
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a given entity is marked as a collection entity
|
|
35
|
+
*
|
|
36
|
+
* @param entityOrClass - The entity instance or class to check
|
|
37
|
+
* @returns true if the entity is a collection entity, false otherwise
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* @CollectionEntity()
|
|
42
|
+
* class Tags {
|
|
43
|
+
* @ArrayProperty(() => String)
|
|
44
|
+
* collection: string[];
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* const tags = new Tags({ collection: ['a', 'b'] });
|
|
48
|
+
* console.log(EntityUtils.isCollectionEntity(tags)); // true
|
|
49
|
+
* console.log(EntityUtils.isCollectionEntity(Tags)); // true
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
static isCollectionEntity(entityOrClass: unknown): boolean;
|
|
25
53
|
static sameEntity(a: object, b: object): boolean;
|
|
26
54
|
static getPropertyKeys(target: object): string[];
|
|
27
55
|
static getPropertyOptions(target: object, propertyKey: string): PropertyOptions | undefined;
|
|
@@ -36,7 +64,7 @@ export declare class EntityUtils {
|
|
|
36
64
|
* Serializes an entity to a plain object, converting only properties decorated with @Property()
|
|
37
65
|
*
|
|
38
66
|
* @param entity - The entity instance to serialize
|
|
39
|
-
* @returns A plain object containing only the serialized decorated properties
|
|
67
|
+
* @returns A plain object containing only the serialized decorated properties, or an array for collection entities
|
|
40
68
|
*
|
|
41
69
|
* @remarks
|
|
42
70
|
* Serialization rules:
|
|
@@ -49,6 +77,7 @@ export declare class EntityUtils {
|
|
|
49
77
|
* - undefined values are excluded from the output
|
|
50
78
|
* - null values are included in the output
|
|
51
79
|
* - Circular references are not supported (will cause stack overflow)
|
|
80
|
+
* - Collection entities (@CollectionEntity) are unwrapped to just their array
|
|
52
81
|
*
|
|
53
82
|
* @example
|
|
54
83
|
* ```typescript
|
|
@@ -80,14 +109,29 @@ export declare class EntityUtils {
|
|
|
80
109
|
* // address: { street: '123 Main St', city: 'Boston' },
|
|
81
110
|
* // createdAt: '2024-01-01T00:00:00.000Z'
|
|
82
111
|
* // }
|
|
112
|
+
*
|
|
113
|
+
* @CollectionEntity()
|
|
114
|
+
* class Tags {
|
|
115
|
+
* @ArrayProperty(() => String)
|
|
116
|
+
* collection: string[];
|
|
117
|
+
* }
|
|
118
|
+
*
|
|
119
|
+
* const tags = new Tags({ collection: ['a', 'b'] });
|
|
120
|
+
* const json = EntityUtils.toJSON(tags);
|
|
121
|
+
* // ['a', 'b'] - unwrapped to array
|
|
83
122
|
* ```
|
|
84
123
|
*/
|
|
85
|
-
static toJSON<T extends object>(entity: T):
|
|
124
|
+
static toJSON<T extends object>(entity: T): unknown;
|
|
86
125
|
/**
|
|
87
126
|
* Serializes a single value according to the toJSON rules
|
|
88
127
|
* @private
|
|
89
128
|
*/
|
|
90
129
|
private static serializeValue;
|
|
130
|
+
/**
|
|
131
|
+
* Internal parse implementation with extended options
|
|
132
|
+
* @private
|
|
133
|
+
*/
|
|
134
|
+
private static _parseInternal;
|
|
91
135
|
/**
|
|
92
136
|
* Deserializes a plain object to an entity instance
|
|
93
137
|
*
|
|
@@ -132,7 +176,7 @@ export declare class EntityUtils {
|
|
|
132
176
|
* const userStrict = await EntityUtils.parse(User, json, { strict: true });
|
|
133
177
|
* ```
|
|
134
178
|
*/
|
|
135
|
-
static parse<T extends object>(entityClass: new (data: any) => T, plainObject: unknown, parseOptions?: ParseOptions
|
|
179
|
+
static parse<T extends object>(entityClass: new (data: any) => T, plainObject: unknown, parseOptions?: ParseOptions): Promise<T>;
|
|
136
180
|
/**
|
|
137
181
|
* Safely deserializes a plain object to an entity instance without throwing errors
|
|
138
182
|
*
|
|
@@ -172,6 +216,87 @@ export declare class EntityUtils {
|
|
|
172
216
|
* ```
|
|
173
217
|
*/
|
|
174
218
|
static safeParse<T extends object>(entityClass: new (data: any) => T, plainObject: unknown, parseOptions?: ParseOptions): SafeOperationResult<T>;
|
|
219
|
+
/**
|
|
220
|
+
* Partially deserializes a plain object, returning a plain object with only present properties
|
|
221
|
+
*
|
|
222
|
+
* @param entityClass - The entity class constructor
|
|
223
|
+
* @param plainObject - The plain object to deserialize
|
|
224
|
+
* @param options - Options with strict mode
|
|
225
|
+
* @returns Promise resolving to a plain object with deserialized properties (Partial<T>)
|
|
226
|
+
*
|
|
227
|
+
* @remarks
|
|
228
|
+
* Differences from parse():
|
|
229
|
+
* - Returns a plain object, not an entity instance
|
|
230
|
+
* - Ignores missing properties (does not include them in result)
|
|
231
|
+
* - Does NOT apply default values to missing properties
|
|
232
|
+
* - When strict: false (default), properties with HARD problems are excluded from result but problems are tracked
|
|
233
|
+
* - When strict: true, any HARD problem throws ValidationError
|
|
234
|
+
* - Nested entities/arrays are still fully deserialized and validated as normal
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* @Entity()
|
|
239
|
+
* class User {
|
|
240
|
+
* @Property({ type: () => String }) name!: string;
|
|
241
|
+
* @Property({ type: () => Number, default: 0 }) age!: number;
|
|
242
|
+
*
|
|
243
|
+
* constructor(data: Partial<User>) {
|
|
244
|
+
* Object.assign(this, data);
|
|
245
|
+
* }
|
|
246
|
+
* }
|
|
247
|
+
*
|
|
248
|
+
* const partial = await EntityUtils.partialParse(User, { name: 'John' });
|
|
249
|
+
* // partial = { name: 'John' } (age is not included, default not applied)
|
|
250
|
+
*
|
|
251
|
+
* const partialWithError = await EntityUtils.partialParse(User, { name: 'John', age: 'invalid' });
|
|
252
|
+
* // partialWithError = { name: 'John' } (age excluded due to HARD problem)
|
|
253
|
+
* // Access problems via second return value
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
static partialParse<T extends object>(entityClass: new (data: any) => T, plainObject: unknown, options?: {
|
|
257
|
+
strict?: boolean;
|
|
258
|
+
}): Promise<Partial<T>>;
|
|
259
|
+
/**
|
|
260
|
+
* Safely performs partial deserialization without throwing errors
|
|
261
|
+
*
|
|
262
|
+
* @param entityClass - The entity class constructor
|
|
263
|
+
* @param plainObject - The plain object to deserialize
|
|
264
|
+
* @param options - Options with strict mode
|
|
265
|
+
* @returns Promise resolving to a result object with success flag, partial data, and problems
|
|
266
|
+
*
|
|
267
|
+
* @remarks
|
|
268
|
+
* Similar to partialParse() but returns a result object instead of throwing errors:
|
|
269
|
+
* - On success with strict: true - returns { success: true, data: Partial<T>, problems: [] }
|
|
270
|
+
* - On success with strict: false - returns { success: true, data: Partial<T>, problems: [...] } (includes hard problems for excluded properties)
|
|
271
|
+
* - On failure (strict mode only) - returns { success: false, data: undefined, problems: [...] }
|
|
272
|
+
*
|
|
273
|
+
* All partial deserialization rules from partialParse() apply.
|
|
274
|
+
* See partialParse() documentation for detailed behavior.
|
|
275
|
+
*
|
|
276
|
+
* @example
|
|
277
|
+
* ```typescript
|
|
278
|
+
* @Entity()
|
|
279
|
+
* class User {
|
|
280
|
+
* @Property({ type: () => String }) name!: string;
|
|
281
|
+
* @Property({ type: () => Number }) age!: number;
|
|
282
|
+
*
|
|
283
|
+
* constructor(data: Partial<User>) {
|
|
284
|
+
* Object.assign(this, data);
|
|
285
|
+
* }
|
|
286
|
+
* }
|
|
287
|
+
*
|
|
288
|
+
* const result = await EntityUtils.safePartialParse(User, { name: 'John', age: 'invalid' });
|
|
289
|
+
* if (result.success) {
|
|
290
|
+
* console.log(result.data); // { name: 'John' }
|
|
291
|
+
* console.log(result.problems); // [Problem for age property]
|
|
292
|
+
* } else {
|
|
293
|
+
* console.log(result.problems); // Hard problems (only in strict mode)
|
|
294
|
+
* }
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
static safePartialParse<T extends object>(entityClass: new (data: any) => T, plainObject: unknown, options?: {
|
|
298
|
+
strict?: boolean;
|
|
299
|
+
}): Promise<SafeOperationResult<Partial<T>>>;
|
|
175
300
|
/**
|
|
176
301
|
* Updates an entity instance with new values, respecting preventUpdates flags on properties
|
|
177
302
|
*
|
|
@@ -273,6 +398,11 @@ export declare class EntityUtils {
|
|
|
273
398
|
* @private
|
|
274
399
|
*/
|
|
275
400
|
private static runPropertyValidators;
|
|
401
|
+
/**
|
|
402
|
+
* Validates all properties on an object (entity instance or plain object)
|
|
403
|
+
* @private
|
|
404
|
+
*/
|
|
405
|
+
private static validateProperties;
|
|
276
406
|
private static addInjectedDependencies;
|
|
277
407
|
/**
|
|
278
408
|
* Validates an entity instance by running all property and entity validators
|
|
@@ -292,7 +422,7 @@ export declare class EntityUtils {
|
|
|
292
422
|
* console.log(problems); // [Problem, Problem, ...]
|
|
293
423
|
* ```
|
|
294
424
|
*/
|
|
295
|
-
static validate<T extends object>(instance: T
|
|
425
|
+
static validate<T extends object>(instance: T): Promise<Problem[]>;
|
|
296
426
|
/**
|
|
297
427
|
* Gets the validation problems for an entity instance
|
|
298
428
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-utils.d.ts","sourceRoot":"","sources":["../../src/lib/entity-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entity-utils.d.ts","sourceRoot":"","sources":["../../src/lib/entity-utils.ts"],"names":[],"mappings":"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"}
|