@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.
- package/dist/decorator-validation.bundle.min.js +1 -1
- package/dist/esm/decorator-validation.bundle.min.esm.js +1 -1
- package/lib/esm/index.d.ts +1 -2
- package/lib/esm/index.js +2 -3
- package/lib/esm/model/Model.js +2 -4
- package/lib/esm/model/Registry.js +2 -2
- package/lib/esm/model/construction.js +3 -2
- package/lib/esm/model/index.d.ts +1 -0
- package/lib/esm/model/index.js +2 -1
- package/lib/esm/model/utils.d.ts +9 -0
- package/lib/esm/model/utils.js +16 -0
- package/lib/esm/utils/index.d.ts +0 -1
- package/lib/esm/utils/index.js +1 -2
- package/lib/esm/validation/Validators/TypeValidator.js +2 -2
- package/lib/esm/validation/Validators/Validator.js +2 -2
- package/lib/esm/validation/Validators/decorators.js +2 -2
- package/lib/esm/validation/decorators.d.ts +10 -10
- package/lib/esm/validation/decorators.js +2 -2
- package/lib/esm/validation/types.d.ts +2 -14
- package/lib/esm/validation/types.js +1 -1
- package/lib/index.cjs +2 -3
- package/lib/index.d.ts +1 -2
- package/lib/model/Model.cjs +5 -7
- package/lib/model/Registry.cjs +2 -2
- package/lib/model/construction.cjs +4 -3
- package/lib/model/index.cjs +2 -1
- package/lib/model/index.d.ts +1 -0
- package/lib/model/utils.cjs +19 -0
- package/lib/model/utils.d.ts +9 -0
- package/lib/utils/index.cjs +1 -2
- package/lib/utils/index.d.ts +0 -1
- package/lib/validation/Validators/TypeValidator.cjs +5 -5
- package/lib/validation/Validators/Validator.cjs +3 -3
- package/lib/validation/Validators/decorators.cjs +2 -2
- package/lib/validation/decorators.cjs +12 -12
- package/lib/validation/decorators.d.ts +10 -10
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +2 -14
- package/package.json +2 -1
- package/lib/esm/reflection/decorators.d.ts +0 -27
- package/lib/esm/reflection/decorators.js +0 -51
- package/lib/esm/reflection/index.d.ts +0 -2
- package/lib/esm/reflection/index.js +0 -4
- package/lib/esm/reflection/utils.d.ts +0 -113
- package/lib/esm/reflection/utils.js +0 -239
- package/lib/esm/utils/equality.d.ts +0 -14
- package/lib/esm/utils/equality.js +0 -34
- package/lib/reflection/decorators.cjs +0 -55
- package/lib/reflection/decorators.d.ts +0 -27
- package/lib/reflection/index.cjs +0 -20
- package/lib/reflection/index.d.ts +0 -2
- package/lib/reflection/utils.cjs +0 -251
- package/lib/reflection/utils.d.ts +0 -113
- package/lib/utils/equality.cjs +0 -37
- package/lib/utils/equality.d.ts +0 -14
package/lib/reflection/utils.cjs
DELETED
|
@@ -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;
|
package/lib/utils/equality.cjs
DELETED
|
@@ -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
|
package/lib/utils/equality.d.ts
DELETED
|
@@ -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;
|