@decaf-ts/decorator-validation 1.0.7 → 1.0.11
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 +6 -1
- package/lib/esm/index.js +68 -1
- package/lib/esm/model/Model.d.ts +3 -1
- package/lib/esm/model/Model.js +316 -1
- package/lib/esm/model/ModelErrorDefinition.d.ts +1 -1
- package/lib/esm/model/ModelErrorDefinition.js +55 -3
- package/lib/esm/model/Registry.d.ts +1 -1
- package/lib/esm/model/Registry.js +76 -1
- package/lib/esm/model/constants.js +44 -1
- package/lib/esm/model/construction.js +124 -1
- package/lib/esm/model/decorators.d.ts +3 -3
- package/lib/esm/model/decorators.js +68 -1
- package/lib/esm/model/index.d.ts +3 -3
- package/lib/esm/model/index.js +9 -1
- package/lib/esm/model/types.js +3 -0
- package/lib/esm/reflection/decorators.d.ts +15 -0
- package/lib/esm/reflection/decorators.js +28 -0
- package/lib/esm/reflection/index.d.ts +2 -0
- package/lib/esm/reflection/index.js +4 -0
- package/lib/esm/{utils/general.d.ts → reflection/utils.d.ts} +7 -87
- package/lib/esm/reflection/utils.js +239 -0
- package/lib/esm/utils/constants.js +25 -1
- package/lib/esm/utils/dates.d.ts +76 -0
- package/lib/esm/utils/dates.js +241 -0
- package/lib/esm/utils/equality.d.ts +14 -0
- package/lib/esm/utils/equality.js +34 -0
- package/lib/esm/utils/hashing.d.ts +42 -0
- package/lib/esm/utils/hashing.js +73 -0
- package/lib/esm/utils/index.d.ts +6 -2
- package/lib/esm/utils/index.js +10 -1
- package/lib/esm/utils/registry.js +3 -0
- package/lib/esm/utils/serialization.js +53 -1
- package/lib/esm/utils/strings.d.ts +25 -0
- package/lib/esm/utils/strings.js +31 -0
- package/lib/esm/validation/Validation.d.ts +2 -1
- package/lib/esm/validation/Validation.js +63 -1
- package/lib/esm/validation/Validators/DateValidator.js +55 -1
- package/lib/esm/validation/Validators/EmailValidator.d.ts +0 -1
- package/lib/esm/validation/Validators/EmailValidator.js +49 -1
- package/lib/esm/validation/Validators/ListValidator.js +67 -1
- package/lib/esm/validation/Validators/MaxLengthValidator.js +55 -1
- package/lib/esm/validation/Validators/MaxValidator.js +59 -1
- package/lib/esm/validation/Validators/MinLengthValidator.js +55 -1
- package/lib/esm/validation/Validators/MinValidator.js +59 -1
- package/lib/esm/validation/Validators/PasswordValidator.js +52 -1
- package/lib/esm/validation/Validators/PatternValidator.d.ts +3 -3
- package/lib/esm/validation/Validators/PatternValidator.js +72 -1
- package/lib/esm/validation/Validators/RequiredValidator.js +57 -1
- package/lib/esm/validation/Validators/StepValidator.js +54 -1
- package/lib/esm/validation/Validators/TypeValidator.js +42 -1
- package/lib/esm/validation/Validators/URLValidator.d.ts +0 -1
- package/lib/esm/validation/Validators/URLValidator.js +48 -1
- package/lib/esm/validation/Validators/Validator.js +50 -1
- package/lib/esm/validation/Validators/ValidatorRegistry.js +81 -1
- package/lib/esm/validation/Validators/constants.d.ts +8 -4
- package/lib/esm/validation/Validators/constants.js +135 -1
- package/lib/esm/validation/Validators/decorators.d.ts +13 -0
- package/lib/esm/validation/Validators/decorators.js +23 -0
- package/lib/esm/validation/Validators/index.d.ts +9 -7
- package/lib/esm/validation/Validators/index.js +54 -1
- package/lib/esm/validation/Validators/types.d.ts +2 -2
- package/lib/esm/validation/Validators/types.js +3 -0
- package/lib/esm/validation/decorators.d.ts +14 -87
- package/lib/esm/validation/decorators.js +320 -1
- package/lib/esm/validation/index.d.ts +1 -10
- package/lib/esm/validation/index.js +6 -1
- package/lib/esm/validation/types.d.ts +11 -0
- package/lib/esm/validation/types.js +3 -0
- package/lib/index.cjs +85 -1
- package/lib/index.d.ts +6 -1
- package/lib/model/Model.cjs +321 -1
- package/lib/model/Model.d.ts +3 -1
- package/lib/model/ModelErrorDefinition.cjs +59 -3
- package/lib/model/ModelErrorDefinition.d.ts +1 -1
- package/lib/model/Registry.cjs +81 -1
- package/lib/model/Registry.d.ts +1 -1
- package/lib/model/constants.cjs +47 -1
- package/lib/model/construction.cjs +129 -1
- package/lib/model/decorators.cjs +73 -1
- package/lib/model/decorators.d.ts +3 -3
- package/lib/model/index.cjs +25 -1
- package/lib/model/index.d.ts +3 -3
- package/lib/model/types.cjs +4 -1
- package/lib/reflection/decorators.cjs +31 -0
- package/lib/reflection/decorators.d.ts +15 -0
- package/lib/reflection/index.cjs +20 -0
- package/lib/reflection/index.d.ts +2 -0
- package/lib/reflection/utils.cjs +251 -0
- package/lib/{utils/general.d.ts → reflection/utils.d.ts} +7 -87
- package/lib/utils/constants.cjs +28 -1
- package/lib/utils/dates.cjs +249 -0
- package/lib/utils/dates.d.ts +76 -0
- package/lib/utils/equality.cjs +37 -0
- package/lib/utils/equality.d.ts +14 -0
- package/lib/utils/hashing.cjs +78 -0
- package/lib/utils/hashing.d.ts +42 -0
- package/lib/utils/index.cjs +26 -1
- package/lib/utils/index.d.ts +6 -2
- package/lib/utils/registry.cjs +4 -1
- package/lib/utils/serialization.cjs +57 -1
- package/lib/utils/strings.cjs +35 -0
- package/lib/utils/strings.d.ts +25 -0
- package/lib/validation/Validation.cjs +67 -1
- package/lib/validation/Validation.d.ts +2 -1
- package/lib/validation/Validators/DateValidator.cjs +58 -1
- package/lib/validation/Validators/EmailValidator.cjs +52 -1
- package/lib/validation/Validators/EmailValidator.d.ts +0 -1
- package/lib/validation/Validators/ListValidator.cjs +70 -1
- package/lib/validation/Validators/MaxLengthValidator.cjs +58 -1
- package/lib/validation/Validators/MaxValidator.cjs +62 -1
- package/lib/validation/Validators/MinLengthValidator.cjs +58 -1
- package/lib/validation/Validators/MinValidator.cjs +62 -1
- package/lib/validation/Validators/PasswordValidator.cjs +55 -1
- package/lib/validation/Validators/PatternValidator.cjs +75 -1
- package/lib/validation/Validators/PatternValidator.d.ts +3 -3
- package/lib/validation/Validators/RequiredValidator.cjs +60 -1
- package/lib/validation/Validators/StepValidator.cjs +57 -1
- package/lib/validation/Validators/TypeValidator.cjs +46 -1
- package/lib/validation/Validators/URLValidator.cjs +51 -1
- package/lib/validation/Validators/URLValidator.d.ts +0 -1
- package/lib/validation/Validators/Validator.cjs +54 -1
- package/lib/validation/Validators/ValidatorRegistry.cjs +86 -1
- package/lib/validation/Validators/constants.cjs +138 -1
- package/lib/validation/Validators/constants.d.ts +8 -4
- package/lib/validation/Validators/decorators.cjs +26 -0
- package/lib/validation/Validators/decorators.d.ts +13 -0
- package/lib/validation/Validators/index.cjs +71 -1
- package/lib/validation/Validators/index.d.ts +9 -7
- package/lib/validation/Validators/types.cjs +4 -1
- package/lib/validation/Validators/types.d.ts +2 -2
- package/lib/validation/decorators.cjs +337 -1
- package/lib/validation/decorators.d.ts +14 -87
- package/lib/validation/index.cjs +22 -1
- package/lib/validation/index.d.ts +1 -10
- package/lib/validation/types.cjs +4 -1
- package/lib/validation/types.d.ts +11 -0
- package/package.json +17 -13
- package/lib/esm/utils/general.js +0 -1
- package/lib/utils/general.cjs +0 -1
|
@@ -0,0 +1,251 @@
|
|
|
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/index.cjs");
|
|
13
|
+
const strings_1 = require("../utils/strings/index.cjs");
|
|
14
|
+
const equality_1 = require("../utils/equality/index.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,6 +1,6 @@
|
|
|
1
|
+
import { Model } from "../model/Model";
|
|
1
2
|
import "reflect-metadata";
|
|
2
3
|
import { DecoratorMetadata } from "../validation";
|
|
3
|
-
import { Model } from "../model";
|
|
4
4
|
/**
|
|
5
5
|
* @summary Util function to retrieve the decorators for the provided Property
|
|
6
6
|
*
|
|
@@ -55,83 +55,6 @@ export declare const getAllPropertyDecorators: <T extends Model>(model: T, ...pr
|
|
|
55
55
|
* @memberOf module:decorator-validation.Model
|
|
56
56
|
*/
|
|
57
57
|
export declare function getAllProperties(obj: Record<any, any>, climbTree?: boolean, stopAt?: string): string[];
|
|
58
|
-
/**
|
|
59
|
-
* @summary Util function to provide string format functionality similar to C#'s string.format
|
|
60
|
-
*
|
|
61
|
-
* @param {string} string
|
|
62
|
-
* @param {string} args replacements made by order of appearance (replacement0 wil replace {0} and so on)
|
|
63
|
-
* @return {string} formatted string
|
|
64
|
-
*
|
|
65
|
-
* @function stringFormat
|
|
66
|
-
* @memberOf module:decorator-validation.Utils.Format
|
|
67
|
-
* @category Format
|
|
68
|
-
*/
|
|
69
|
-
export declare function stringFormat(string: string, ...args: string[]): string;
|
|
70
|
-
/**
|
|
71
|
-
* @summary Deep Object Comparison
|
|
72
|
-
* @description algorithm from {@link https://stackoverflow.com/questions/30476150/javascript-deep-comparison-recursively-objects-and-properties}
|
|
73
|
-
* but with optional ignored properties
|
|
74
|
-
*
|
|
75
|
-
* @param {any} a
|
|
76
|
-
* @param {any} b
|
|
77
|
-
* @param {string} [propsToIgnore]
|
|
78
|
-
*
|
|
79
|
-
* @function isEqual
|
|
80
|
-
* @memberOf module:decorator-validation.Utils.Equality
|
|
81
|
-
* @category Validation
|
|
82
|
-
*/
|
|
83
|
-
export declare function isEqual(a: any, b: any, ...propsToIgnore: string[]): boolean;
|
|
84
|
-
/**
|
|
85
|
-
* @summary Mimics Java's String's Hash implementation
|
|
86
|
-
*
|
|
87
|
-
* @param {string | number | symbol | Date} obj
|
|
88
|
-
* @return {number} hash value of obj
|
|
89
|
-
*
|
|
90
|
-
* @function hashCode
|
|
91
|
-
* @memberOf module:decorator-validation.Utils.Hashing
|
|
92
|
-
* @category Hashing
|
|
93
|
-
*/
|
|
94
|
-
export declare function hashCode(obj: string | number | symbol | Date): number;
|
|
95
|
-
/**
|
|
96
|
-
* @summary Defines teh type for a Hashing function
|
|
97
|
-
* @memberOf module:decorator-validation.Utils.Hashing
|
|
98
|
-
* @category Hashing
|
|
99
|
-
*/
|
|
100
|
-
export type HashingFunction = (value: any) => string | number;
|
|
101
|
-
/**
|
|
102
|
-
* @summary Hashes an object serializing it and then hashing the string
|
|
103
|
-
* @description The Serialization algorithm used by default (JSON.stringify)
|
|
104
|
-
* is not deterministic and should not be used for hashing
|
|
105
|
-
*
|
|
106
|
-
* @param {Record<string, any>} obj
|
|
107
|
-
* @return {string} the resulting hash
|
|
108
|
-
*
|
|
109
|
-
* @function hashSerialization
|
|
110
|
-
* @memberOf module:decorator-validation.Utils.Hashing
|
|
111
|
-
*
|
|
112
|
-
* @category Hashing
|
|
113
|
-
*/
|
|
114
|
-
export declare function hashSerialization(obj: Record<string, any> | any[]): number;
|
|
115
|
-
/**
|
|
116
|
-
* @summary Hashes an object by combining the hash of all its properties
|
|
117
|
-
*
|
|
118
|
-
* @param {Record<string, any>} obj
|
|
119
|
-
* @return {string} the resulting hash
|
|
120
|
-
*
|
|
121
|
-
* @function hashObj
|
|
122
|
-
* @memberOf module:decorator-validation.Utils.Hashing
|
|
123
|
-
* @category Hashing
|
|
124
|
-
*/
|
|
125
|
-
export declare function hashObj(obj: Record<string, any> | any[]): string | number;
|
|
126
|
-
/**
|
|
127
|
-
* @summary For Serialization/deserialization purposes.
|
|
128
|
-
* @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
|
|
129
|
-
*
|
|
130
|
-
* @function isModel
|
|
131
|
-
* @memberOf module:decorator-validation.Validation
|
|
132
|
-
* @category Validation
|
|
133
|
-
*/
|
|
134
|
-
export declare function isModel(target: Record<string, any>): boolean;
|
|
135
58
|
/**
|
|
136
59
|
* @summary Util function to retrieve the Class decorators
|
|
137
60
|
*
|
|
@@ -180,14 +103,11 @@ export declare function evaluateDesignTypes(value: any, types: string | string[]
|
|
|
180
103
|
name: string;
|
|
181
104
|
}): any;
|
|
182
105
|
/**
|
|
183
|
-
* @summary
|
|
184
|
-
*
|
|
185
|
-
* @param {string} date the date string to be converted back into date
|
|
186
|
-
* @param {string} format the date format
|
|
187
|
-
* @return {Date} the date from the format or the standard new Date({@prop date}) if the string couldn't be parsed (are you sure the format matches the string?)
|
|
106
|
+
* @summary For Serialization/deserialization purposes.
|
|
107
|
+
* @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
|
|
188
108
|
*
|
|
189
|
-
* @function
|
|
190
|
-
* @memberOf module:decorator-validation.
|
|
191
|
-
* @category
|
|
109
|
+
* @function isModel
|
|
110
|
+
* @memberOf module:decorator-validation.Validation
|
|
111
|
+
* @category Validation
|
|
192
112
|
*/
|
|
193
|
-
export declare function
|
|
113
|
+
export declare function isModel(target: Record<string, any>): boolean;
|
package/lib/utils/constants.cjs
CHANGED
|
@@ -1 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModelKeys = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @summary Defines the various Model keys used for reflection
|
|
6
|
+
*
|
|
7
|
+
* @property {string} REFLECT prefix to all other keys
|
|
8
|
+
* @property {string} TYPE type key
|
|
9
|
+
* @property {string} PARAMS method params key
|
|
10
|
+
* @property {string} RETURN method return key
|
|
11
|
+
* @property {string} MODEL model key
|
|
12
|
+
* @property {string} ANCHOR anchor key. will serve as a ghost property in the model
|
|
13
|
+
*
|
|
14
|
+
* @constant ModelKeys
|
|
15
|
+
* @memberOf module:decorator-validation.Model
|
|
16
|
+
* @category Model
|
|
17
|
+
*/
|
|
18
|
+
var ModelKeys;
|
|
19
|
+
(function (ModelKeys) {
|
|
20
|
+
ModelKeys["REFLECT"] = "model.definition.";
|
|
21
|
+
ModelKeys["TYPE"] = "design:type";
|
|
22
|
+
ModelKeys["PARAMS"] = "design:paramtypes";
|
|
23
|
+
ModelKeys["RETURN"] = "design:returntype";
|
|
24
|
+
ModelKeys["MODEL"] = "model";
|
|
25
|
+
ModelKeys["ANCHOR"] = "__modelDefinition";
|
|
26
|
+
})(ModelKeys || (exports.ModelKeys = ModelKeys = {}));
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILElBQVksU0FPWDtBQVBELFdBQVksU0FBUztJQUNuQiwwQ0FBNkIsQ0FBQTtJQUM3QixpQ0FBb0IsQ0FBQTtJQUNwQix5Q0FBNEIsQ0FBQTtJQUM1Qix5Q0FBNEIsQ0FBQTtJQUM1Qiw0QkFBZSxDQUFBO0lBQ2YseUNBQTRCLENBQUE7QUFDOUIsQ0FBQyxFQVBXLFNBQVMseUJBQVQsU0FBUyxRQU9wQiIsImZpbGUiOiJ1dGlscy9jb25zdGFudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgTW9kZWwga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgcHJlZml4IHRvIGFsbCBvdGhlciBrZXlzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSB0eXBlIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBUkFNUyBtZXRob2QgcGFyYW1zIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFVFVSTiBtZXRob2QgcmV0dXJuIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PREVMIG1vZGVsIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFOQ0hPUiBhbmNob3Iga2V5LiB3aWxsIHNlcnZlIGFzIGEgZ2hvc3QgcHJvcGVydHkgaW4gdGhlIG1vZGVsXG4gKlxuICogQGNvbnN0YW50IE1vZGVsS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsS2V5cyB7XG4gIFJFRkxFQ1QgPSBcIm1vZGVsLmRlZmluaXRpb24uXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsRGVmaW5pdGlvblwiLFxufVxuIl19
|