@decaf-ts/decorator-validation 1.1.1 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/decorator-validation.bundle.min.js +1 -1
  2. package/dist/esm/decorator-validation.bundle.min.esm.js +1 -1
  3. package/lib/esm/index.d.ts +1 -2
  4. package/lib/esm/index.js +2 -3
  5. package/lib/esm/model/Model.js +2 -4
  6. package/lib/esm/model/Registry.js +2 -2
  7. package/lib/esm/model/construction.js +3 -2
  8. package/lib/esm/model/index.d.ts +1 -0
  9. package/lib/esm/model/index.js +2 -1
  10. package/lib/esm/model/utils.d.ts +9 -0
  11. package/lib/esm/model/utils.js +16 -0
  12. package/lib/esm/utils/index.d.ts +0 -1
  13. package/lib/esm/utils/index.js +1 -2
  14. package/lib/esm/validation/Validators/TypeValidator.js +2 -2
  15. package/lib/esm/validation/Validators/Validator.js +2 -2
  16. package/lib/esm/validation/Validators/decorators.js +2 -2
  17. package/lib/esm/validation/decorators.d.ts +10 -10
  18. package/lib/esm/validation/decorators.js +2 -2
  19. package/lib/esm/validation/types.d.ts +2 -14
  20. package/lib/esm/validation/types.js +1 -1
  21. package/lib/index.cjs +2 -3
  22. package/lib/index.d.ts +1 -2
  23. package/lib/model/Model.cjs +5 -7
  24. package/lib/model/Registry.cjs +2 -2
  25. package/lib/model/construction.cjs +4 -3
  26. package/lib/model/index.cjs +2 -1
  27. package/lib/model/index.d.ts +1 -0
  28. package/lib/model/utils.cjs +19 -0
  29. package/lib/model/utils.d.ts +9 -0
  30. package/lib/utils/index.cjs +1 -2
  31. package/lib/utils/index.d.ts +0 -1
  32. package/lib/validation/Validators/TypeValidator.cjs +5 -5
  33. package/lib/validation/Validators/Validator.cjs +3 -3
  34. package/lib/validation/Validators/decorators.cjs +2 -2
  35. package/lib/validation/decorators.cjs +12 -12
  36. package/lib/validation/decorators.d.ts +10 -10
  37. package/lib/validation/types.cjs +1 -1
  38. package/lib/validation/types.d.ts +2 -14
  39. package/package.json +2 -1
  40. package/lib/esm/reflection/decorators.d.ts +0 -27
  41. package/lib/esm/reflection/decorators.js +0 -51
  42. package/lib/esm/reflection/index.d.ts +0 -2
  43. package/lib/esm/reflection/index.js +0 -4
  44. package/lib/esm/reflection/utils.d.ts +0 -113
  45. package/lib/esm/reflection/utils.js +0 -239
  46. package/lib/esm/utils/equality.d.ts +0 -14
  47. package/lib/esm/utils/equality.js +0 -34
  48. package/lib/reflection/decorators.cjs +0 -55
  49. package/lib/reflection/decorators.d.ts +0 -27
  50. package/lib/reflection/index.cjs +0 -20
  51. package/lib/reflection/index.d.ts +0 -2
  52. package/lib/reflection/utils.cjs +0 -251
  53. package/lib/reflection/utils.d.ts +0 -113
  54. package/lib/utils/equality.cjs +0 -37
  55. package/lib/utils/equality.d.ts +0 -14
@@ -1,251 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAllPropertyDecorators = void 0;
4
- exports.getPropertyDecorators = getPropertyDecorators;
5
- exports.getTypeFromDecorator = getTypeFromDecorator;
6
- exports.getAllProperties = getAllProperties;
7
- exports.getClassDecorators = getClassDecorators;
8
- exports.checkType = checkType;
9
- exports.checkTypes = checkTypes;
10
- exports.evaluateDesignTypes = evaluateDesignTypes;
11
- exports.isModel = isModel;
12
- const constants_1 = require("../utils/constants.cjs");
13
- const strings_1 = require("../utils/strings.cjs");
14
- const equality_1 = require("../utils/equality.cjs");
15
- require("reflect-metadata");
16
- /**
17
- * @summary Util function to retrieve the decorators for the provided Property
18
- *
19
- * @param {string} annotationPrefix
20
- * @param {any} target
21
- * @param {string | symbol} propertyName
22
- * @param {boolean} [ignoreType] defaults to false. decides if the {@link ModelKeys.TYPE} is ignored or not
23
- * @param {boolean} [recursive] defaults to true. decides if it should climb the prototypal tree searching for more decorators on that property
24
- * @param {DecoratorMetadata[]} [accumulator] used when recursive is true, to cache decorators while it climbs the prototypal tree
25
- *
26
- * @function getPropertyDecorators
27
- * @memberOf module:decorator-validation.Reflection
28
- * @category Reflection
29
- */
30
- function getPropertyDecorators(annotationPrefix, target, propertyName, ignoreType = false, recursive = true, accumulator) {
31
- const getPropertyDecoratorsForModel = function (annotationPrefix, target, propertyName, ignoreType = false, accumulator) {
32
- // get info about keys that used in current property
33
- const keys = Reflect.getMetadataKeys(target, propertyName);
34
- const decorators = keys
35
- // filter your custom decorators
36
- .filter((key) => {
37
- if (ignoreType)
38
- return key.toString().startsWith(annotationPrefix);
39
- return (key === constants_1.ModelKeys.TYPE || key.toString().startsWith(annotationPrefix));
40
- })
41
- .reduce((values, key) => {
42
- // get metadata value.
43
- const currValues = {
44
- key: key !== constants_1.ModelKeys.TYPE
45
- ? key.substring(annotationPrefix.length)
46
- : key,
47
- props: Reflect.getMetadata(key, target, propertyName),
48
- };
49
- return values.concat(currValues);
50
- }, accumulator || []);
51
- return {
52
- prop: propertyName.toString(),
53
- decorators: decorators,
54
- };
55
- };
56
- const result = getPropertyDecoratorsForModel(annotationPrefix, target, propertyName, ignoreType, accumulator);
57
- const trim = function (items) {
58
- const cache = {};
59
- return items.filter((item) => {
60
- if (item.key in cache) {
61
- if (!(0, equality_1.isEqual)(item.props, cache[item.key]))
62
- console.log((0, strings_1.sf)("Found a similar decorator for the {0} property of a {1} model but with different attributes. The original one will be kept", item.key, target.constructor.name));
63
- return false;
64
- }
65
- cache[item.key.toString()] = item.props;
66
- return true;
67
- });
68
- };
69
- if (!recursive || Object.getPrototypeOf(target) === Object.prototype) {
70
- return {
71
- prop: result.prop,
72
- decorators: trim(result.decorators),
73
- };
74
- }
75
- // We choose to ignore type here, because in inheritance the expected type is from the lowest child class
76
- return getPropertyDecorators(annotationPrefix, Object.getPrototypeOf(target.constructor), propertyName, true, recursive, result.decorators);
77
- }
78
- /**
79
- * @summary gets the prop type from the decorator
80
- * @param {any} model
81
- * @param {string | symbol} propKey
82
- * @return {string | undefined}
83
- *
84
- * @function geTypeFromDecorators
85
- *
86
- * @memberOf module:decorator-validation.Reflection
87
- */
88
- function getTypeFromDecorator(model, propKey) {
89
- const decorators = getPropertyDecorators(constants_1.ModelKeys.REFLECT, model, propKey, false);
90
- if (!decorators || !decorators.decorators)
91
- return;
92
- // TODO handle @type decorators. for now we stick with design:type
93
- const typeDecorator = decorators.decorators.shift();
94
- const name = typeDecorator.props ? typeDecorator.props.name : undefined;
95
- return name !== "Function" ? name : undefined;
96
- }
97
- /**
98
- * @summary Retrieves the decorators for an object's properties prefixed by {@param prefixes}
99
- *
100
- * @param {T} model
101
- * @param {string[]} prefixes
102
- *
103
- * @function getAllPropertyDecorators
104
- *
105
- * @memberOf module:db-decorators.Reflection
106
- */
107
- const getAllPropertyDecorators = function (model, ...prefixes) {
108
- if (!prefixes || !prefixes.length)
109
- return;
110
- const pushOrCreate = function (accum, key, decorators) {
111
- if (!decorators || !decorators.length)
112
- return;
113
- if (!accum[key])
114
- accum[key] = [];
115
- accum[key].push(...decorators);
116
- };
117
- return Object.getOwnPropertyNames(model).reduce((accum, propKey) => {
118
- prefixes.forEach((p, index) => {
119
- const decorators = getPropertyDecorators(p, model, propKey, index !== 0);
120
- if (!accum)
121
- accum = {};
122
- pushOrCreate(accum, propKey, decorators.decorators);
123
- });
124
- return accum;
125
- }, undefined);
126
- };
127
- exports.getAllPropertyDecorators = getAllPropertyDecorators;
128
- /**
129
- * @summary Retrieves all properties of an object
130
- * @description
131
- * - and of all its prototypes if {@param climbTree} until it reaches {@param stopAt} (or ends the prototype chain)
132
- *
133
- * @param obj
134
- * @param {boolean} [climbTree] default to true
135
- * @param {string} [stopAt] defaults to 'Object'
136
- *
137
- * @function getAllProperties
138
- *
139
- * @memberOf module:decorator-validation.Model
140
- */
141
- function getAllProperties(obj, climbTree = true, stopAt = "Object") {
142
- const allProps = [];
143
- let curr = obj;
144
- const keepAtIt = function () {
145
- if (!climbTree)
146
- return;
147
- const prototype = Object.getPrototypeOf(curr);
148
- if (!prototype || prototype.constructor.name === stopAt)
149
- return;
150
- curr = prototype;
151
- return curr;
152
- };
153
- do {
154
- const props = Object.getOwnPropertyNames(curr);
155
- props.forEach(function (prop) {
156
- if (allProps.indexOf(prop) === -1)
157
- allProps.push(prop);
158
- });
159
- } while (keepAtIt());
160
- return allProps;
161
- }
162
- /**
163
- * @summary Util function to retrieve the Class decorators
164
- *
165
- * @function getClassDecorators
166
- * @memberOf module:decorator-validation.Reflection
167
- * @category Reflection
168
- */
169
- function getClassDecorators(annotationPrefix, target) {
170
- const keys = Reflect.getOwnMetadataKeys(target.constructor);
171
- return keys
172
- .filter((key) => key.toString().startsWith(annotationPrefix))
173
- .reduce((values, key) => {
174
- // get metadata value
175
- const currValues = {
176
- key: key.substring(annotationPrefix.length),
177
- props: Reflect.getMetadata(key, target.constructor),
178
- };
179
- return values.concat(currValues);
180
- }, []);
181
- }
182
- /**
183
- * @summary Util function to check a type according to a typeName
184
- *
185
- * @param {any} value
186
- * @param {string} acceptedType
187
- * @return {boolean} true for a match, false otherwise
188
- *
189
- * @function checkType
190
- * @memberOf module:decorator-validation.Validation
191
- * @category Validation
192
- */
193
- function checkType(value, acceptedType) {
194
- if (typeof value === acceptedType)
195
- return true;
196
- return (value.constructor &&
197
- value.constructor.name.toLowerCase() === acceptedType.toLowerCase());
198
- }
199
- /**
200
- * @summary Util function to check a type according multiple possibilities
201
- * @param {any} value
202
- * @param {string[]} acceptedTypes
203
- * @return {boolean} true if any is a match, false otherwise
204
- *
205
- * @function checkTypes
206
- * @memberOf module:decorator-validation.Validation
207
- * @category Validation
208
- */
209
- function checkTypes(value, acceptedTypes) {
210
- return !acceptedTypes.every((t) => !checkType(value, t));
211
- }
212
- /**
213
- * @summary The model type
214
- *
215
- * @param {any} value
216
- * @param {string | string[] | {name: string}} types
217
- *
218
- * @function evaluateDesignTypes
219
- * @memberOf module:decorator-validation.Validation
220
- * @category Validation
221
- */
222
- function evaluateDesignTypes(value, types) {
223
- switch (typeof types) {
224
- case "string":
225
- return checkType(value, types);
226
- case "object":
227
- if (Array.isArray(types))
228
- return checkTypes(value, types);
229
- return true;
230
- case "function":
231
- if (types.name && types.name !== "Object")
232
- return checkType(value, types.name);
233
- return true;
234
- default:
235
- return true;
236
- }
237
- }
238
- /**
239
- * @summary For Serialization/deserialization purposes.
240
- * @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
241
- *
242
- * @function isModel
243
- * @memberOf module:decorator-validation.Validation
244
- * @category Validation
245
- */
246
- function isModel(target) {
247
- return (!!target[constants_1.ModelKeys.ANCHOR] ||
248
- !!getClassDecorators(constants_1.ModelKeys.REFLECT, target).find((dec) => dec.key === constants_1.ModelKeys.MODEL && dec.props && dec.props.class));
249
- }
250
-
251
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUksQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQ3ZDLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZDtZQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxNQUEyQjtJQUNqRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBUyxDQUFDLE1BQU0sQ0FBQztRQUMxQixDQUFDLENBQUMsa0JBQWtCLENBQUMscUJBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNsRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxxQkFBUyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUNyRSxDQUNGLENBQUM7QUFDSixDQUFDIiwiZmlsZSI6InJlZmxlY3Rpb24vdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCIuLi91dGlscy9lcXVhbGl0eVwiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEgfSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGRlY29yYXRvcnMgZm9yIHRoZSBwcm92aWRlZCBQcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbm5vdGF0aW9uUHJlZml4XG4gKiBAcGFyYW0ge2FueX0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpZ25vcmVUeXBlXSBkZWZhdWx0cyB0byBmYWxzZS4gZGVjaWRlcyBpZiB0aGUge0BsaW5rIE1vZGVsS2V5cy5UWVBFfSBpcyBpZ25vcmVkIG9yIG5vdFxuICogQHBhcmFtIHtib29sZWFufSBbcmVjdXJzaXZlXSBkZWZhdWx0cyB0byB0cnVlLiBkZWNpZGVzIGlmIGl0IHNob3VsZCBjbGltYiB0aGUgcHJvdG90eXBhbCB0cmVlIHNlYXJjaGluZyBmb3IgbW9yZSBkZWNvcmF0b3JzIG9uIHRoYXQgcHJvcGVydHlcbiAqIEBwYXJhbSB7RGVjb3JhdG9yTWV0YWRhdGFbXX0gW2FjY3VtdWxhdG9yXSB1c2VkIHdoZW4gcmVjdXJzaXZlIGlzIHRydWUsIHRvIGNhY2hlIGRlY29yYXRvcnMgd2hpbGUgaXQgY2xpbWJzIHRoZSBwcm90b3R5cGFsIHRyZWVcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0UHJvcGVydHlEZWNvcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlJlZmxlY3Rpb25cbiAqIEBjYXRlZ29yeSBSZWZsZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gIGFubm90YXRpb25QcmVmaXg6IHN0cmluZyxcbiAgdGFyZ2V0OiBhbnksXG4gIHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3ltYm9sLFxuICBpZ25vcmVUeXBlOiBib29sZWFuID0gZmFsc2UsXG4gIHJlY3Vyc2l2ZSA9IHRydWUsXG4gIGFjY3VtdWxhdG9yPzogRGVjb3JhdG9yTWV0YWRhdGFbXSxcbik6IHsgcHJvcDogc3RyaW5nOyBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdIH0ge1xuICBjb25zdCBnZXRQcm9wZXJ0eURlY29yYXRvcnNGb3JNb2RlbCA9IGZ1bmN0aW9uIChcbiAgICBhbm5vdGF0aW9uUHJlZml4OiBzdHJpbmcsXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgaWdub3JlVHlwZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFjY3VtdWxhdG9yPzogRGVjb3JhdG9yTWV0YWRhdGFbXSxcbiAgKTogeyBwcm9wOiBzdHJpbmc7IGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gfSB7XG4gICAgLy8gZ2V0IGluZm8gYWJvdXQga2V5cyB0aGF0IHVzZWQgaW4gY3VycmVudCBwcm9wZXJ0eVxuICAgIGNvbnN0IGtleXM6IGFueVtdID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eU5hbWUpO1xuICAgIGNvbnN0IGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10gPSBrZXlzXG4gICAgICAvLyBmaWx0ZXIgeW91ciBjdXN0b20gZGVjb3JhdG9yc1xuICAgICAgLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVUeXBlKSByZXR1cm4ga2V5LnRvU3RyaW5nKCkuc3RhcnRzV2l0aChhbm5vdGF0aW9uUHJlZml4KTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBrZXkgPT09IE1vZGVsS2V5cy5UWVBFIHx8IGtleS50b1N0cmluZygpLnN0YXJ0c1dpdGgoYW5ub3RhdGlvblByZWZpeClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKCh2YWx1ZXMsIGtleSkgPT4ge1xuICAgICAgICAvLyBnZXQgbWV0YWRhdGEgdmFsdWUuXG4gICAgICAgIGNvbnN0IGN1cnJWYWx1ZXMgPSB7XG4gICAgICAgICAga2V5OlxuICAgICAgICAgICAga2V5ICE9PSBNb2RlbEtleXMuVFlQRVxuICAgICAgICAgICAgICA/IGtleS5zdWJzdHJpbmcoYW5ub3RhdGlvblByZWZpeC5sZW5ndGgpXG4gICAgICAgICAgICAgIDoga2V5LFxuICAgICAgICAgIHByb3BzOiBSZWZsZWN0LmdldE1ldGFkYXRhKGtleSwgdGFyZ2V0LCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWVzLmNvbmNhdChjdXJyVmFsdWVzKTtcbiAgICAgIH0sIGFjY3VtdWxhdG9yIHx8IFtdKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9wOiBwcm9wZXJ0eU5hbWUudG9TdHJpbmcoKSxcbiAgICAgIGRlY29yYXRvcnM6IGRlY29yYXRvcnMsXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCByZXN1bHQ6IHsgcHJvcDogc3RyaW5nOyBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdIH0gPVxuICAgIGdldFByb3BlcnR5RGVjb3JhdG9yc0Zvck1vZGVsKFxuICAgICAgYW5ub3RhdGlvblByZWZpeCxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIGlnbm9yZVR5cGUsXG4gICAgICBhY2N1bXVsYXRvcixcbiAgICApO1xuXG4gIGNvbnN0IHRyaW0gPSBmdW5jdGlvbiAoaXRlbXM6IERlY29yYXRvck1ldGFkYXRhW10pIHtcbiAgICBjb25zdCBjYWNoZTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE+ID0ge307XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbTogRGVjb3JhdG9yTWV0YWRhdGEpID0+IHtcbiAgICAgIGlmIChpdGVtLmtleSBpbiBjYWNoZSkge1xuICAgICAgICBpZiAoIWlzRXF1YWwoaXRlbS5wcm9wcywgY2FjaGVbaXRlbS5rZXldKSlcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIHNmKFxuICAgICAgICAgICAgICBcIkZvdW5kIGEgc2ltaWxhciBkZWNvcmF0b3IgZm9yIHRoZSB7MH0gcHJvcGVydHkgb2YgYSB7MX0gbW9kZWwgYnV0IHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMuIFRoZSBvcmlnaW5hbCBvbmUgd2lsbCBiZSBrZXB0XCIsXG4gICAgICAgICAgICAgIGl0ZW0ua2V5LFxuICAgICAgICAgICAgICB0YXJnZXQuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjYWNoZVtpdGVtLmtleS50b1N0cmluZygpXSA9IGl0ZW0ucHJvcHMgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoIXJlY3Vyc2l2ZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9wOiByZXN1bHQucHJvcCxcbiAgICAgIGRlY29yYXRvcnM6IHRyaW0ocmVzdWx0LmRlY29yYXRvcnMpLFxuICAgIH07XG4gIH1cblxuICAvLyBXZSBjaG9vc2UgdG8gaWdub3JlIHR5cGUgaGVyZSwgYmVjYXVzZSBpbiBpbmhlcml0YW5jZSB0aGUgZXhwZWN0ZWQgdHlwZSBpcyBmcm9tIHRoZSBsb3dlc3QgY2hpbGQgY2xhc3NcbiAgcmV0dXJuIGdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICBhbm5vdGF0aW9uUHJlZml4LFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQuY29uc3RydWN0b3IpLFxuICAgIHByb3BlcnR5TmFtZSxcbiAgICB0cnVlLFxuICAgIHJlY3Vyc2l2ZSxcbiAgICByZXN1bHQuZGVjb3JhdG9ycyxcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBnZXRzIHRoZSBwcm9wIHR5cGUgZnJvbSB0aGUgZGVjb3JhdG9yXG4gKiBAcGFyYW0ge2FueX0gbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wS2V5XG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gKlxuICogQGZ1bmN0aW9uIGdlVHlwZUZyb21EZWNvcmF0b3JzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5SZWZsZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbURlY29yYXRvcihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcEtleTogc3RyaW5nIHwgc3ltYm9sLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjb3JhdG9yczogeyBwcm9wOiBzdHJpbmcgfCBzeW1ib2w7IGRlY29yYXRvcnM6IGFueVtdIH0gPVxuICAgIGdldFByb3BlcnR5RGVjb3JhdG9ycyhNb2RlbEtleXMuUkVGTEVDVCwgbW9kZWwsIHByb3BLZXksIGZhbHNlKTtcbiAgaWYgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmRlY29yYXRvcnMpIHJldHVybjtcblxuICAvLyBUT0RPIGhhbmRsZSBAdHlwZSBkZWNvcmF0b3JzLiBmb3Igbm93IHdlIHN0aWNrIHdpdGggZGVzaWduOnR5cGVcbiAgY29uc3QgdHlwZURlY29yYXRvciA9IGRlY29yYXRvcnMuZGVjb3JhdG9ycy5zaGlmdCgpO1xuICBjb25zdCBuYW1lID0gdHlwZURlY29yYXRvci5wcm9wcyA/IHR5cGVEZWNvcmF0b3IucHJvcHMubmFtZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5hbWUgIT09IFwiRnVuY3Rpb25cIiA/IG5hbWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBkZWNvcmF0b3JzIGZvciBhbiBvYmplY3QncyBwcm9wZXJ0aWVzIHByZWZpeGVkIGJ5IHtAcGFyYW0gcHJlZml4ZXN9XG4gKlxuICogQHBhcmFtIHtUfSBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJlZml4ZXNcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkYi1kZWNvcmF0b3JzLlJlZmxlY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogVCxcbiAgLi4ucHJlZml4ZXM6IHN0cmluZ1tdXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcmVmaXhlcyB8fCAhcHJlZml4ZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgY29uc3QgcHVzaE9yQ3JlYXRlID0gZnVuY3Rpb24gKFxuICAgIGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcbiAgICBrZXk6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzOiBhbnlbXSxcbiAgKSB7XG4gICAgaWYgKCFkZWNvcmF0b3JzIHx8ICFkZWNvcmF0b3JzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGlmICghYWNjdW1ba2V5XSkgYWNjdW1ba2V5XSA9IFtdO1xuICAgIGFjY3VtW2tleV0ucHVzaCguLi5kZWNvcmF0b3JzKTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobW9kZWwpLnJlZHVjZShcbiAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsIHByb3BLZXkpID0+IHtcbiAgICAgIHByZWZpeGVzLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcnM6IHsgcHJvcDogc3RyaW5nIHwgc3ltYm9sOyBkZWNvcmF0b3JzOiBhbnlbXSB9ID1cbiAgICAgICAgICBnZXRQcm9wZXJ0eURlY29yYXRvcnMocCwgbW9kZWwsIHByb3BLZXksIGluZGV4ICE9PSAwKTtcbiAgICAgICAgaWYgKCFhY2N1bSkgYWNjdW0gPSB7fTtcbiAgICAgICAgcHVzaE9yQ3JlYXRlKGFjY3VtLCBwcm9wS2V5LCBkZWNvcmF0b3JzLmRlY29yYXRvcnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB1bmRlZmluZWQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyBvZiBhbiBvYmplY3RcbiAqIEBkZXNjcmlwdGlvblxuICogIC0gYW5kIG9mIGFsbCBpdHMgcHJvdG90eXBlcyBpZiB7QHBhcmFtIGNsaW1iVHJlZX0gdW50aWwgaXQgcmVhY2hlcyB7QHBhcmFtIHN0b3BBdH0gKG9yIGVuZHMgdGhlIHByb3RvdHlwZSBjaGFpbilcbiAqXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjbGltYlRyZWVdIGRlZmF1bHQgdG8gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzdG9wQXRdIGRlZmF1bHRzIHRvICdPYmplY3QnXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbFByb3BlcnRpZXNcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQcm9wZXJ0aWVzKFxuICBvYmo6IFJlY29yZDxhbnksIGFueT4sXG4gIGNsaW1iVHJlZSA9IHRydWUsXG4gIHN0b3BBdCA9IFwiT2JqZWN0XCIsXG4pIHtcbiAgY29uc3QgYWxsUHJvcHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyOiBSZWNvcmQ8YW55LCBhbnk+ID0gb2JqO1xuXG4gIGNvbnN0IGtlZXBBdEl0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghY2xpbWJUcmVlKSByZXR1cm47XG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnIpO1xuICAgIGlmICghcHJvdG90eXBlIHx8IHByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBzdG9wQXQpIHJldHVybjtcbiAgICBjdXJyID0gcHJvdG90eXBlO1xuICAgIHJldHVybiBjdXJyO1xuICB9O1xuXG4gIGRvIHtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnIpO1xuICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIGlmIChhbGxQcm9wcy5pbmRleE9mKHByb3ApID09PSAtMSkgYWxsUHJvcHMucHVzaChwcm9wKTtcbiAgICB9KTtcbiAgfSB3aGlsZSAoa2VlcEF0SXQoKSk7XG4gIHJldHVybiBhbGxQcm9wcztcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBDbGFzcyBkZWNvcmF0b3JzXG4gKlxuICogQGZ1bmN0aW9uIGdldENsYXNzRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5SZWZsZWN0aW9uXG4gKiBAY2F0ZWdvcnkgUmVmbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xhc3NEZWNvcmF0b3JzKFxuICBhbm5vdGF0aW9uUHJlZml4OiBzdHJpbmcsXG4gIHRhcmdldDogYW55LFxuKTogeyBrZXk6IHN0cmluZzsgcHJvcHM6IGFueSB9W10ge1xuICBjb25zdCBrZXlzOiBhbnlbXSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldC5jb25zdHJ1Y3Rvcik7XG5cbiAgcmV0dXJuIGtleXNcbiAgICAuZmlsdGVyKChrZXkpID0+IGtleS50b1N0cmluZygpLnN0YXJ0c1dpdGgoYW5ub3RhdGlvblByZWZpeCkpXG4gICAgLnJlZHVjZSgodmFsdWVzLCBrZXkpID0+IHtcbiAgICAgIC8vIGdldCBtZXRhZGF0YSB2YWx1ZVxuICAgICAgY29uc3QgY3VyclZhbHVlcyA9IHtcbiAgICAgICAga2V5OiBrZXkuc3Vic3RyaW5nKGFubm90YXRpb25QcmVmaXgubGVuZ3RoKSxcbiAgICAgICAgcHJvcHM6IFJlZmxlY3QuZ2V0TWV0YWRhdGEoa2V5LCB0YXJnZXQuY29uc3RydWN0b3IpLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB2YWx1ZXMuY29uY2F0KGN1cnJWYWx1ZXMpO1xuICAgIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIGNoZWNrIGEgdHlwZSBhY2NvcmRpbmcgdG8gYSB0eXBlTmFtZVxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGFjY2VwdGVkVHlwZVxuICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBmb3IgYSBtYXRjaCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGZ1bmN0aW9uIGNoZWNrVHlwZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tUeXBlKHZhbHVlOiBhbnksIGFjY2VwdGVkVHlwZTogc3RyaW5nKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IGFjY2VwdGVkVHlwZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAoXG4gICAgdmFsdWUuY29uc3RydWN0b3IgJiZcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY2VwdGVkVHlwZS50b0xvd2VyQ2FzZSgpXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBjaGVjayBhIHR5cGUgYWNjb3JkaW5nIG11bHRpcGxlIHBvc3NpYmlsaXRpZXNcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gYWNjZXB0ZWRUeXBlc1xuICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbnkgaXMgYSBtYXRjaCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKlxuICogQGZ1bmN0aW9uIGNoZWNrVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVHlwZXModmFsdWU6IGFueSwgYWNjZXB0ZWRUeXBlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuICFhY2NlcHRlZFR5cGVzLmV2ZXJ5KCh0KSA9PiAhY2hlY2tUeXBlKHZhbHVlLCB0KSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIG1vZGVsIHR5cGVcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCB7bmFtZTogc3RyaW5nfX0gdHlwZXNcbiAqXG4gKiBAZnVuY3Rpb24gZXZhbHVhdGVEZXNpZ25UeXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVEZXNpZ25UeXBlcyhcbiAgdmFsdWU6IGFueSxcbiAgdHlwZXM6IHN0cmluZyB8IHN0cmluZ1tdIHwgeyBuYW1lOiBzdHJpbmcgfSxcbikge1xuICBzd2l0Y2ggKHR5cGVvZiB0eXBlcykge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBjaGVja1R5cGUodmFsdWUsIHR5cGVzKTtcbiAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlcykpIHJldHVybiBjaGVja1R5cGVzKHZhbHVlLCB0eXBlcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgIGlmICh0eXBlcy5uYW1lICYmIHR5cGVzLm5hbWUgIT09IFwiT2JqZWN0XCIpXG4gICAgICAgIHJldHVybiBjaGVja1R5cGUodmFsdWUsIHR5cGVzLm5hbWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRm9yIFNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHB1cnBvc2VzLlxuICogQGRlc2NyaXB0aW9uIFJlYWRzIHRoZSB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHkgb2YgYSB7QGxpbmsgTW9kZWx9IHRvIGRpc2NvdmVyIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICpcbiAqIEBmdW5jdGlvbiBpc01vZGVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gKFxuICAgICEhdGFyZ2V0W01vZGVsS2V5cy5BTkNIT1JdIHx8XG4gICAgISFnZXRDbGFzc0RlY29yYXRvcnMoTW9kZWxLZXlzLlJFRkxFQ1QsIHRhcmdldCkuZmluZChcbiAgICAgIChkZWMpID0+IGRlYy5rZXkgPT09IE1vZGVsS2V5cy5NT0RFTCAmJiBkZWMucHJvcHMgJiYgZGVjLnByb3BzLmNsYXNzLFxuICAgIClcbiAgKTtcbn1cbiJdfQ==
@@ -1,113 +0,0 @@
1
- import { Model } from "../model/Model";
2
- import "reflect-metadata";
3
- import { DecoratorMetadata } from "../validation";
4
- /**
5
- * @summary Util function to retrieve the decorators for the provided Property
6
- *
7
- * @param {string} annotationPrefix
8
- * @param {any} target
9
- * @param {string | symbol} propertyName
10
- * @param {boolean} [ignoreType] defaults to false. decides if the {@link ModelKeys.TYPE} is ignored or not
11
- * @param {boolean} [recursive] defaults to true. decides if it should climb the prototypal tree searching for more decorators on that property
12
- * @param {DecoratorMetadata[]} [accumulator] used when recursive is true, to cache decorators while it climbs the prototypal tree
13
- *
14
- * @function getPropertyDecorators
15
- * @memberOf module:decorator-validation.Reflection
16
- * @category Reflection
17
- */
18
- export declare function getPropertyDecorators(annotationPrefix: string, target: any, propertyName: string | symbol, ignoreType?: boolean, recursive?: boolean, accumulator?: DecoratorMetadata[]): {
19
- prop: string;
20
- decorators: DecoratorMetadata[];
21
- };
22
- /**
23
- * @summary gets the prop type from the decorator
24
- * @param {any} model
25
- * @param {string | symbol} propKey
26
- * @return {string | undefined}
27
- *
28
- * @function geTypeFromDecorators
29
- *
30
- * @memberOf module:decorator-validation.Reflection
31
- */
32
- export declare function getTypeFromDecorator(model: any, propKey: string | symbol): string | undefined;
33
- /**
34
- * @summary Retrieves the decorators for an object's properties prefixed by {@param prefixes}
35
- *
36
- * @param {T} model
37
- * @param {string[]} prefixes
38
- *
39
- * @function getAllPropertyDecorators
40
- *
41
- * @memberOf module:db-decorators.Reflection
42
- */
43
- export declare const getAllPropertyDecorators: <T extends Model>(model: T, ...prefixes: string[]) => Record<string, any> | undefined;
44
- /**
45
- * @summary Retrieves all properties of an object
46
- * @description
47
- * - and of all its prototypes if {@param climbTree} until it reaches {@param stopAt} (or ends the prototype chain)
48
- *
49
- * @param obj
50
- * @param {boolean} [climbTree] default to true
51
- * @param {string} [stopAt] defaults to 'Object'
52
- *
53
- * @function getAllProperties
54
- *
55
- * @memberOf module:decorator-validation.Model
56
- */
57
- export declare function getAllProperties(obj: Record<any, any>, climbTree?: boolean, stopAt?: string): string[];
58
- /**
59
- * @summary Util function to retrieve the Class decorators
60
- *
61
- * @function getClassDecorators
62
- * @memberOf module:decorator-validation.Reflection
63
- * @category Reflection
64
- */
65
- export declare function getClassDecorators(annotationPrefix: string, target: any): {
66
- key: string;
67
- props: any;
68
- }[];
69
- /**
70
- * @summary Util function to check a type according to a typeName
71
- *
72
- * @param {any} value
73
- * @param {string} acceptedType
74
- * @return {boolean} true for a match, false otherwise
75
- *
76
- * @function checkType
77
- * @memberOf module:decorator-validation.Validation
78
- * @category Validation
79
- */
80
- export declare function checkType(value: any, acceptedType: string): any;
81
- /**
82
- * @summary Util function to check a type according multiple possibilities
83
- * @param {any} value
84
- * @param {string[]} acceptedTypes
85
- * @return {boolean} true if any is a match, false otherwise
86
- *
87
- * @function checkTypes
88
- * @memberOf module:decorator-validation.Validation
89
- * @category Validation
90
- */
91
- export declare function checkTypes(value: any, acceptedTypes: string[]): boolean;
92
- /**
93
- * @summary The model type
94
- *
95
- * @param {any} value
96
- * @param {string | string[] | {name: string}} types
97
- *
98
- * @function evaluateDesignTypes
99
- * @memberOf module:decorator-validation.Validation
100
- * @category Validation
101
- */
102
- export declare function evaluateDesignTypes(value: any, types: string | string[] | {
103
- name: string;
104
- }): any;
105
- /**
106
- * @summary For Serialization/deserialization purposes.
107
- * @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
108
- *
109
- * @function isModel
110
- * @memberOf module:decorator-validation.Validation
111
- * @category Validation
112
- */
113
- export declare function isModel(target: Record<string, any>): boolean;
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isEqual = isEqual;
4
- /**
5
- * @summary Deep Object Comparison
6
- * @description algorithm from {@link https://stackoverflow.com/questions/30476150/javascript-deep-comparison-recursively-objects-and-properties}
7
- * but with optional ignored properties
8
- *
9
- * @param {any} a
10
- * @param {any} b
11
- * @param {string} [propsToIgnore]
12
- *
13
- * @function isEqual
14
- * @memberOf module:decorator-validation.Utils.Equality
15
- * @category Validation
16
- */
17
- function isEqual(a, b, ...propsToIgnore) {
18
- if (a === b)
19
- return true;
20
- if (a instanceof Date && b instanceof Date)
21
- return a.getTime() === b.getTime();
22
- if (!a || !b || (typeof a !== "object" && typeof b !== "object"))
23
- return a === b;
24
- if (a === null || a === undefined || b === null || b === undefined)
25
- return false;
26
- if (typeof a !== typeof b)
27
- return false;
28
- if (a.prototype !== b.prototype)
29
- return false;
30
- const keys = Object.keys(a).filter((k) => propsToIgnore.indexOf(k) === -1);
31
- if (keys.length !==
32
- Object.keys(b).filter((k) => propsToIgnore.indexOf(k) === -1).length)
33
- return false;
34
- return keys.every((k) => propsToIgnore.indexOf(k) !== -1 || isEqual(a[k], b[k], ...propsToIgnore));
35
- }
36
-
37
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9lcXVhbGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWFBLDBCQW9CQztBQWpDRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixPQUFPLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxHQUFHLGFBQXVCO0lBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QixJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUk7UUFDeEMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDO1FBQzlELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsSUFBSSxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4QyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLElBQ0UsSUFBSSxDQUFDLE1BQU07UUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFFcEUsT0FBTyxLQUFLLENBQUM7SUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FDM0UsQ0FBQztBQUNKLENBQUMiLCJmaWxlIjoidXRpbHMvZXF1YWxpdHkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzdW1tYXJ5IERlZXAgT2JqZWN0IENvbXBhcmlzb25cbiAqIEBkZXNjcmlwdGlvbiBhbGdvcml0aG0gZnJvbSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzA0NzYxNTAvamF2YXNjcmlwdC1kZWVwLWNvbXBhcmlzb24tcmVjdXJzaXZlbHktb2JqZWN0cy1hbmQtcHJvcGVydGllc31cbiAqIGJ1dCB3aXRoIG9wdGlvbmFsIGlnbm9yZWQgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSB7YW55fSBhXG4gKiBAcGFyYW0ge2FueX0gYlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wc1RvSWdub3JlXVxuICpcbiAqIEBmdW5jdGlvbiBpc0VxdWFsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkVxdWFsaXR5XG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcXVhbChhOiBhbnksIGI6IGFueSwgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpXG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgaWYgKCFhIHx8ICFiIHx8ICh0eXBlb2YgYSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIikpXG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGEucHJvdG90eXBlICE9PSBiLnByb3RvdHlwZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYSkuZmlsdGVyKChrKSA9PiBwcm9wc1RvSWdub3JlLmluZGV4T2YoaykgPT09IC0xKTtcbiAgaWYgKFxuICAgIGtleXMubGVuZ3RoICE9PVxuICAgIE9iamVjdC5rZXlzKGIpLmZpbHRlcigoaykgPT4gcHJvcHNUb0lnbm9yZS5pbmRleE9mKGspID09PSAtMSkubGVuZ3RoXG4gIClcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBrZXlzLmV2ZXJ5KFxuICAgIChrKSA9PlxuICAgICAgcHJvcHNUb0lnbm9yZS5pbmRleE9mKGspICE9PSAtMSB8fCBpc0VxdWFsKGFba10sIGJba10sIC4uLnByb3BzVG9JZ25vcmUpLFxuICApO1xufVxuIl19
@@ -1,14 +0,0 @@
1
- /**
2
- * @summary Deep Object Comparison
3
- * @description algorithm from {@link https://stackoverflow.com/questions/30476150/javascript-deep-comparison-recursively-objects-and-properties}
4
- * but with optional ignored properties
5
- *
6
- * @param {any} a
7
- * @param {any} b
8
- * @param {string} [propsToIgnore]
9
- *
10
- * @function isEqual
11
- * @memberOf module:decorator-validation.Utils.Equality
12
- * @category Validation
13
- */
14
- export declare function isEqual(a: any, b: any, ...propsToIgnore: string[]): boolean;