@decaf-ts/decorator-validation 1.1.2 → 1.1.5

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 (61) 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/utils/strings.d.ts +2 -2
  15. package/lib/esm/utils/strings.js +5 -3
  16. package/lib/esm/validation/Validators/TypeValidator.js +2 -2
  17. package/lib/esm/validation/Validators/Validator.d.ts +1 -2
  18. package/lib/esm/validation/Validators/Validator.js +2 -2
  19. package/lib/esm/validation/Validators/decorators.js +2 -2
  20. package/lib/esm/validation/decorators.d.ts +10 -10
  21. package/lib/esm/validation/decorators.js +2 -2
  22. package/lib/esm/validation/types.d.ts +1 -9
  23. package/lib/esm/validation/types.js +1 -1
  24. package/lib/index.cjs +2 -3
  25. package/lib/index.d.ts +1 -2
  26. package/lib/model/Model.cjs +5 -7
  27. package/lib/model/Registry.cjs +2 -2
  28. package/lib/model/construction.cjs +4 -3
  29. package/lib/model/index.cjs +2 -1
  30. package/lib/model/index.d.ts +1 -0
  31. package/lib/model/utils.cjs +19 -0
  32. package/lib/model/utils.d.ts +9 -0
  33. package/lib/utils/index.cjs +1 -2
  34. package/lib/utils/index.d.ts +0 -1
  35. package/lib/utils/strings.cjs +5 -3
  36. package/lib/utils/strings.d.ts +2 -2
  37. package/lib/validation/Validators/TypeValidator.cjs +5 -5
  38. package/lib/validation/Validators/Validator.cjs +3 -3
  39. package/lib/validation/Validators/Validator.d.ts +1 -2
  40. package/lib/validation/Validators/decorators.cjs +2 -2
  41. package/lib/validation/decorators.cjs +12 -12
  42. package/lib/validation/decorators.d.ts +10 -10
  43. package/lib/validation/types.cjs +1 -1
  44. package/lib/validation/types.d.ts +1 -9
  45. package/package.json +2 -1
  46. package/lib/esm/reflection/decorators.d.ts +0 -27
  47. package/lib/esm/reflection/decorators.js +0 -51
  48. package/lib/esm/reflection/index.d.ts +0 -2
  49. package/lib/esm/reflection/index.js +0 -4
  50. package/lib/esm/reflection/utils.d.ts +0 -113
  51. package/lib/esm/reflection/utils.js +0 -239
  52. package/lib/esm/utils/equality.d.ts +0 -14
  53. package/lib/esm/utils/equality.js +0 -34
  54. package/lib/reflection/decorators.cjs +0 -55
  55. package/lib/reflection/decorators.d.ts +0 -27
  56. package/lib/reflection/index.cjs +0 -20
  57. package/lib/reflection/index.d.ts +0 -2
  58. package/lib/reflection/utils.cjs +0 -250
  59. package/lib/reflection/utils.d.ts +0 -113
  60. package/lib/utils/equality.cjs +0 -37
  61. package/lib/utils/equality.d.ts +0 -14
@@ -1,250 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPropertyDecorators = getPropertyDecorators;
4
- exports.getTypeFromDecorator = getTypeFromDecorator;
5
- exports.getAllPropertyDecorators = getAllPropertyDecorators;
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
- function getAllPropertyDecorators(model, ...prefixes) {
108
- if (!prefixes || !prefixes.length)
109
- return;
110
- function pushOrCreate(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
- /**
128
- * @summary Retrieves all properties of an object
129
- * @description
130
- * - and of all its prototypes if {@param climbTree} until it reaches {@param stopAt} (or ends the prototype chain)
131
- *
132
- * @param obj
133
- * @param {boolean} [climbTree] default to true
134
- * @param {string} [stopAt] defaults to 'Object'
135
- *
136
- * @function getAllProperties
137
- *
138
- * @memberOf module:decorator-validation.Model
139
- */
140
- function getAllProperties(obj, climbTree = true, stopAt = "Object") {
141
- const allProps = [];
142
- let curr = obj;
143
- const keepAtIt = function () {
144
- if (!climbTree)
145
- return;
146
- const prototype = Object.getPrototypeOf(curr);
147
- if (!prototype || prototype.constructor.name === stopAt)
148
- return;
149
- curr = prototype;
150
- return curr;
151
- };
152
- do {
153
- const props = Object.getOwnPropertyNames(curr);
154
- props.forEach(function (prop) {
155
- if (allProps.indexOf(prop) === -1)
156
- allProps.push(prop);
157
- });
158
- } while (keepAtIt());
159
- return allProps;
160
- }
161
- /**
162
- * @summary Util function to retrieve the Class decorators
163
- *
164
- * @function getClassDecorators
165
- * @memberOf module:decorator-validation.Reflection
166
- * @category Reflection
167
- */
168
- function getClassDecorators(annotationPrefix, target) {
169
- const keys = Reflect.getOwnMetadataKeys(target.constructor);
170
- return keys
171
- .filter((key) => key.toString().startsWith(annotationPrefix))
172
- .reduce((values, key) => {
173
- // get metadata value
174
- const currValues = {
175
- key: key.substring(annotationPrefix.length),
176
- props: Reflect.getMetadata(key, target.constructor),
177
- };
178
- return values.concat(currValues);
179
- }, []);
180
- }
181
- /**
182
- * @summary Util function to check a type according to a typeName
183
- *
184
- * @param {any} value
185
- * @param {string} acceptedType
186
- * @return {boolean} true for a match, false otherwise
187
- *
188
- * @function checkType
189
- * @memberOf module:decorator-validation.Validation
190
- * @category Validation
191
- */
192
- function checkType(value, acceptedType) {
193
- if (typeof value === acceptedType)
194
- return true;
195
- return (value.constructor &&
196
- value.constructor.name.toLowerCase() === acceptedType.toLowerCase());
197
- }
198
- /**
199
- * @summary Util function to check a type according multiple possibilities
200
- * @param {any} value
201
- * @param {string[]} acceptedTypes
202
- * @return {boolean} true if any is a match, false otherwise
203
- *
204
- * @function checkTypes
205
- * @memberOf module:decorator-validation.Validation
206
- * @category Validation
207
- */
208
- function checkTypes(value, acceptedTypes) {
209
- return !acceptedTypes.every((t) => !checkType(value, t));
210
- }
211
- /**
212
- * @summary The model type
213
- *
214
- * @param {any} value
215
- * @param {string | string[] | {name: string}} types
216
- *
217
- * @function evaluateDesignTypes
218
- * @memberOf module:decorator-validation.Validation
219
- * @category Validation
220
- */
221
- function evaluateDesignTypes(value, types) {
222
- switch (typeof types) {
223
- case "string":
224
- return checkType(value, types);
225
- case "object":
226
- if (Array.isArray(types))
227
- return checkTypes(value, types);
228
- return true;
229
- case "function":
230
- if (types.name && types.name !== "Object")
231
- return checkType(value, types.name);
232
- return true;
233
- default:
234
- return true;
235
- }
236
- }
237
- /**
238
- * @summary For Serialization/deserialization purposes.
239
- * @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
240
- *
241
- * @function isModel
242
- * @memberOf module:decorator-validation.Validation
243
- * @category Validation
244
- */
245
- function isModel(target) {
246
- return (!!target[constants_1.ModelKeys.ANCHOR] ||
247
- !!getClassDecorators(constants_1.ModelKeys.REFLECT, target).find((dec) => dec.key === constants_1.ModelKeys.MODEL && dec.props && dec.props.class));
248
- }
249
-
250
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUN2QyxPQUFPLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixPQUFPLENBQUMsTUFBMkI7SUFDakQsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQVMsQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLHFCQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDbEQsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUsscUJBQVMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FDckUsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsImZpbGUiOiJyZWZsZWN0aW9uL3V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiLi4vdXRpbHMvZXF1YWxpdHlcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBkZWNvcmF0b3JzIGZvciB0aGUgcHJvdmlkZWQgUHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblByZWZpeFxuICogQHBhcmFtIHthbnl9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlVHlwZV0gZGVmYXVsdHMgdG8gZmFsc2UuIGRlY2lkZXMgaWYgdGhlIHtAbGluayBNb2RlbEtleXMuVFlQRX0gaXMgaWdub3JlZCBvciBub3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZV0gZGVmYXVsdHMgdG8gdHJ1ZS4gZGVjaWRlcyBpZiBpdCBzaG91bGQgY2xpbWIgdGhlIHByb3RvdHlwYWwgdHJlZSBzZWFyY2hpbmcgZm9yIG1vcmUgZGVjb3JhdG9ycyBvbiB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0ge0RlY29yYXRvck1ldGFkYXRhW119IFthY2N1bXVsYXRvcl0gdXNlZCB3aGVuIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0byBjYWNoZSBkZWNvcmF0b3JzIHdoaWxlIGl0IGNsaW1icyB0aGUgcHJvdG90eXBhbCB0cmVlXG4gKlxuICogQGZ1bmN0aW9uIGdldFByb3BlcnR5RGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5SZWZsZWN0aW9uXG4gKiBAY2F0ZWdvcnkgUmVmbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICBhbm5vdGF0aW9uUHJlZml4OiBzdHJpbmcsXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN5bWJvbCxcbiAgaWdub3JlVHlwZTogYm9vbGVhbiA9IGZhbHNlLFxuICByZWN1cnNpdmUgPSB0cnVlLFxuICBhY2N1bXVsYXRvcj86IERlY29yYXRvck1ldGFkYXRhW10sXG4pOiB7IHByb3A6IHN0cmluZzsgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSB9IHtcbiAgY29uc3QgZ2V0UHJvcGVydHlEZWNvcmF0b3JzRm9yTW9kZWwgPSBmdW5jdGlvbiAoXG4gICAgYW5ub3RhdGlvblByZWZpeDogc3RyaW5nLFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGlnbm9yZVR5cGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhY2N1bXVsYXRvcj86IERlY29yYXRvck1ldGFkYXRhW10sXG4gICk6IHsgcHJvcDogc3RyaW5nOyBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdIH0ge1xuICAgIC8vIGdldCBpbmZvIGFib3V0IGtleXMgdGhhdCB1c2VkIGluIGN1cnJlbnQgcHJvcGVydHlcbiAgICBjb25zdCBrZXlzOiBhbnlbXSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlOYW1lKTtcbiAgICBjb25zdCBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdID0ga2V5c1xuICAgICAgLy8gZmlsdGVyIHlvdXIgY3VzdG9tIGRlY29yYXRvcnNcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlVHlwZSkgcmV0dXJuIGtleS50b1N0cmluZygpLnN0YXJ0c1dpdGgoYW5ub3RhdGlvblByZWZpeCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAga2V5ID09PSBNb2RlbEtleXMuVFlQRSB8fCBrZXkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGFubm90YXRpb25QcmVmaXgpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgodmFsdWVzLCBrZXkpID0+IHtcbiAgICAgICAgLy8gZ2V0IG1ldGFkYXRhIHZhbHVlLlxuICAgICAgICBjb25zdCBjdXJyVmFsdWVzID0ge1xuICAgICAgICAgIGtleTpcbiAgICAgICAgICAgIGtleSAhPT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICAgICAgICAgPyBrZXkuc3Vic3RyaW5nKGFubm90YXRpb25QcmVmaXgubGVuZ3RoKVxuICAgICAgICAgICAgICA6IGtleSxcbiAgICAgICAgICBwcm9wczogUmVmbGVjdC5nZXRNZXRhZGF0YShrZXksIHRhcmdldCwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcy5jb25jYXQoY3VyclZhbHVlcyk7XG4gICAgICB9LCBhY2N1bXVsYXRvciB8fCBbXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvcDogcHJvcGVydHlOYW1lLnRvU3RyaW5nKCksXG4gICAgICBkZWNvcmF0b3JzOiBkZWNvcmF0b3JzLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgcmVzdWx0OiB7IHByb3A6IHN0cmluZzsgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSB9ID1cbiAgICBnZXRQcm9wZXJ0eURlY29yYXRvcnNGb3JNb2RlbChcbiAgICAgIGFubm90YXRpb25QcmVmaXgsXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBpZ25vcmVUeXBlLFxuICAgICAgYWNjdW11bGF0b3IsXG4gICAgKTtcblxuICBjb25zdCB0cmltID0gZnVuY3Rpb24gKGl0ZW1zOiBEZWNvcmF0b3JNZXRhZGF0YVtdKSB7XG4gICAgY29uc3QgY2FjaGU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPiA9IHt9O1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW06IERlY29yYXRvck1ldGFkYXRhKSA9PiB7XG4gICAgICBpZiAoaXRlbS5rZXkgaW4gY2FjaGUpIHtcbiAgICAgICAgaWYgKCFpc0VxdWFsKGl0ZW0ucHJvcHMsIGNhY2hlW2l0ZW0ua2V5XSkpXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBzZihcbiAgICAgICAgICAgICAgXCJGb3VuZCBhIHNpbWlsYXIgZGVjb3JhdG9yIGZvciB0aGUgezB9IHByb3BlcnR5IG9mIGEgezF9IG1vZGVsIGJ1dCB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiBUaGUgb3JpZ2luYWwgb25lIHdpbGwgYmUga2VwdFwiLFxuICAgICAgICAgICAgICBpdGVtLmtleSxcbiAgICAgICAgICAgICAgdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FjaGVbaXRlbS5rZXkudG9TdHJpbmcoKV0gPSBpdGVtLnByb3BzIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgaWYgKCFyZWN1cnNpdmUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvcDogcmVzdWx0LnByb3AsXG4gICAgICBkZWNvcmF0b3JzOiB0cmltKHJlc3VsdC5kZWNvcmF0b3JzKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gV2UgY2hvb3NlIHRvIGlnbm9yZSB0eXBlIGhlcmUsIGJlY2F1c2UgaW4gaW5oZXJpdGFuY2UgdGhlIGV4cGVjdGVkIHR5cGUgaXMgZnJvbSB0aGUgbG93ZXN0IGNoaWxkIGNsYXNzXG4gIHJldHVybiBnZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgYW5ub3RhdGlvblByZWZpeCxcbiAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0LmNvbnN0cnVjdG9yKSxcbiAgICBwcm9wZXJ0eU5hbWUsXG4gICAgdHJ1ZSxcbiAgICByZWN1cnNpdmUsXG4gICAgcmVzdWx0LmRlY29yYXRvcnMsXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgZ2V0cyB0aGUgcHJvcCB0eXBlIGZyb20gdGhlIGRlY29yYXRvclxuICogQHBhcmFtIHthbnl9IG1vZGVsXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleVxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICpcbiAqIEBmdW5jdGlvbiBnZVR5cGVGcm9tRGVjb3JhdG9yc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uUmVmbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gIG1vZGVsOiBhbnksXG4gIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY29yYXRvcnM6IHsgcHJvcDogc3RyaW5nIHwgc3ltYm9sOyBkZWNvcmF0b3JzOiBhbnlbXSB9ID1cbiAgICBnZXRQcm9wZXJ0eURlY29yYXRvcnMoTW9kZWxLZXlzLlJFRkxFQ1QsIG1vZGVsLCBwcm9wS2V5LCBmYWxzZSk7XG4gIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzKSByZXR1cm47XG5cbiAgLy8gVE9ETyBoYW5kbGUgQHR5cGUgZGVjb3JhdG9ycy4gZm9yIG5vdyB3ZSBzdGljayB3aXRoIGRlc2lnbjp0eXBlXG4gIGNvbnN0IHR5cGVEZWNvcmF0b3IgPSBkZWNvcmF0b3JzLmRlY29yYXRvcnMuc2hpZnQoKTtcbiAgY29uc3QgbmFtZSA9IHR5cGVEZWNvcmF0b3IucHJvcHMgPyB0eXBlRGVjb3JhdG9yLnByb3BzLm5hbWUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBuYW1lICE9PSBcIkZ1bmN0aW9uXCIgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGVjb3JhdG9ycyBmb3IgYW4gb2JqZWN0J3MgcHJvcGVydGllcyBwcmVmaXhlZCBieSB7QHBhcmFtIHByZWZpeGVzfVxuICpcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nW119IHByZWZpeGVzXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZWZsZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnM8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IFQsXG4gIC4uLnByZWZpeGVzOiBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gfCB1bmRlZmluZWQge1xuICBpZiAoIXByZWZpeGVzIHx8ICFwcmVmaXhlcy5sZW5ndGgpIHJldHVybjtcblxuICBmdW5jdGlvbiBwdXNoT3JDcmVhdGUoXG4gICAgYWNjdW06IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+LFxuICAgIGtleTogc3RyaW5nLFxuICAgIGRlY29yYXRvcnM6IERlY29yYXRvck1ldGFkYXRhW10sXG4gICk6IHZvaWQge1xuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoIWFjY3VtW2tleV0pIGFjY3VtW2tleV0gPSBbXTtcbiAgICBhY2N1bVtrZXldLnB1c2goLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobW9kZWwpLnJlZHVjZShcbiAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsIHByb3BLZXkpID0+IHtcbiAgICAgIHByZWZpeGVzLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRvcnM6IHtcbiAgICAgICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICAgICAgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXTtcbiAgICAgICAgfSA9IGdldFByb3BlcnR5RGVjb3JhdG9ycyhwLCBtb2RlbCwgcHJvcEtleSwgaW5kZXggIT09IDApO1xuICAgICAgICBpZiAoIWFjY3VtKSBhY2N1bSA9IHt9O1xuICAgICAgICBwdXNoT3JDcmVhdGUoYWNjdW0sIHByb3BLZXksIGRlY29yYXRvcnMuZGVjb3JhdG9ycyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG4gKiBAZGVzY3JpcHRpb25cbiAqICAtIGFuZCBvZiBhbGwgaXRzIHByb3RvdHlwZXMgaWYge0BwYXJhbSBjbGltYlRyZWV9IHVudGlsIGl0IHJlYWNoZXMge0BwYXJhbSBzdG9wQXR9IChvciBlbmRzIHRoZSBwcm90b3R5cGUgY2hhaW4pXG4gKlxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHtib29sZWFufSBbY2xpbWJUcmVlXSBkZWZhdWx0IHRvIHRydWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RvcEF0XSBkZWZhdWx0cyB0byAnT2JqZWN0J1xuICpcbiAqIEBmdW5jdGlvbiBnZXRBbGxQcm9wZXJ0aWVzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsUHJvcGVydGllcyhcbiAgb2JqOiBSZWNvcmQ8YW55LCBhbnk+LFxuICBjbGltYlRyZWUgPSB0cnVlLFxuICBzdG9wQXQgPSBcIk9iamVjdFwiLFxuKSB7XG4gIGNvbnN0IGFsbFByb3BzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycjogUmVjb3JkPGFueSwgYW55PiA9IG9iajtcblxuICBjb25zdCBrZWVwQXRJdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNsaW1iVHJlZSkgcmV0dXJuO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyKTtcbiAgICBpZiAoIXByb3RvdHlwZSB8fCBwcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSA9PT0gc3RvcEF0KSByZXR1cm47XG4gICAgY3VyciA9IHByb3RvdHlwZTtcbiAgICByZXR1cm4gY3VycjtcbiAgfTtcblxuICBkbyB7XG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdXJyKTtcbiAgICBwcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBpZiAoYWxsUHJvcHMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIGFsbFByb3BzLnB1c2gocHJvcCk7XG4gICAgfSk7XG4gIH0gd2hpbGUgKGtlZXBBdEl0KCkpO1xuICByZXR1cm4gYWxsUHJvcHM7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgQ2xhc3MgZGVjb3JhdG9yc1xuICpcbiAqIEBmdW5jdGlvbiBnZXRDbGFzc0RlY29yYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uUmVmbGVjdGlvblxuICogQGNhdGVnb3J5IFJlZmxlY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzRGVjb3JhdG9ycyhcbiAgYW5ub3RhdGlvblByZWZpeDogc3RyaW5nLFxuICB0YXJnZXQ6IGFueSxcbik6IHsga2V5OiBzdHJpbmc7IHByb3BzOiBhbnkgfVtdIHtcbiAgY29uc3Qga2V5czogYW55W10gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQuY29uc3RydWN0b3IpO1xuXG4gIHJldHVybiBrZXlzXG4gICAgLmZpbHRlcigoa2V5KSA9PiBrZXkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGFubm90YXRpb25QcmVmaXgpKVxuICAgIC5yZWR1Y2UoKHZhbHVlcywga2V5KSA9PiB7XG4gICAgICAvLyBnZXQgbWV0YWRhdGEgdmFsdWVcbiAgICAgIGNvbnN0IGN1cnJWYWx1ZXMgPSB7XG4gICAgICAgIGtleToga2V5LnN1YnN0cmluZyhhbm5vdGF0aW9uUHJlZml4Lmxlbmd0aCksXG4gICAgICAgIHByb3BzOiBSZWZsZWN0LmdldE1ldGFkYXRhKGtleSwgdGFyZ2V0LmNvbnN0cnVjdG9yKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdmFsdWVzLmNvbmNhdChjdXJyVmFsdWVzKTtcbiAgICB9LCBbXSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBjaGVjayBhIHR5cGUgYWNjb3JkaW5nIHRvIGEgdHlwZU5hbWVcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY2NlcHRlZFR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgZm9yIGEgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBmdW5jdGlvbiBjaGVja1R5cGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVHlwZSh2YWx1ZTogYW55LCBhY2NlcHRlZFR5cGU6IHN0cmluZykge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBhY2NlcHRlZFR5cGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLmNvbnN0cnVjdG9yICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NlcHRlZFR5cGUudG9Mb3dlckNhc2UoKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gY2hlY2sgYSB0eXBlIGFjY29yZGluZyBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFjY2VwdGVkVHlwZXNcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYW55IGlzIGEgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBmdW5jdGlvbiBjaGVja1R5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1R5cGVzKHZhbHVlOiBhbnksIGFjY2VwdGVkVHlwZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiAhYWNjZXB0ZWRUeXBlcy5ldmVyeSgodCkgPT4gIWNoZWNrVHlwZSh2YWx1ZSwgdCkpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBtb2RlbCB0eXBlXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwge25hbWU6IHN0cmluZ319IHR5cGVzXG4gKlxuICogQGZ1bmN0aW9uIGV2YWx1YXRlRGVzaWduVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlRGVzaWduVHlwZXMoXG4gIHZhbHVlOiBhbnksXG4gIHR5cGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHsgbmFtZTogc3RyaW5nIH0sXG4pIHtcbiAgc3dpdGNoICh0eXBlb2YgdHlwZXMpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gY2hlY2tUeXBlKHZhbHVlLCB0eXBlcyk7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZXMpKSByZXR1cm4gY2hlY2tUeXBlcyh2YWx1ZSwgdHlwZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICBpZiAodHlwZXMubmFtZSAmJiB0eXBlcy5uYW1lICE9PSBcIk9iamVjdFwiKVxuICAgICAgICByZXR1cm4gY2hlY2tUeXBlKHZhbHVlLCB0eXBlcy5uYW1lKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEZvciBTZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyB0aGUge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9IHByb3BlcnR5IG9mIGEge0BsaW5rIE1vZGVsfSB0byBkaXNjb3ZlciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAqXG4gKiBAZnVuY3Rpb24gaXNNb2RlbFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgcmV0dXJuIChcbiAgICAhIXRhcmdldFtNb2RlbEtleXMuQU5DSE9SXSB8fFxuICAgICEhZ2V0Q2xhc3NEZWNvcmF0b3JzKE1vZGVsS2V5cy5SRUZMRUNULCB0YXJnZXQpLmZpbmQoXG4gICAgICAoZGVjKSA9PiBkZWMua2V5ID09PSBNb2RlbEtleXMuTU9ERUwgJiYgZGVjLnByb3BzICYmIGRlYy5wcm9wcy5jbGFzcyxcbiAgICApXG4gICk7XG59XG4iXX0=
@@ -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 function getAllPropertyDecorators<T extends Model>(model: T, ...prefixes: string[]): Record<string, DecoratorMetadata[]> | 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;