@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,239 @@
|
|
|
1
|
+
import { ModelKeys } from "../utils/constants";
|
|
2
|
+
import { sf } from "../utils/strings";
|
|
3
|
+
import { isEqual } from "../utils/equality";
|
|
4
|
+
import "reflect-metadata";
|
|
5
|
+
/**
|
|
6
|
+
* @summary Util function to retrieve the decorators for the provided Property
|
|
7
|
+
*
|
|
8
|
+
* @param {string} annotationPrefix
|
|
9
|
+
* @param {any} target
|
|
10
|
+
* @param {string | symbol} propertyName
|
|
11
|
+
* @param {boolean} [ignoreType] defaults to false. decides if the {@link ModelKeys.TYPE} is ignored or not
|
|
12
|
+
* @param {boolean} [recursive] defaults to true. decides if it should climb the prototypal tree searching for more decorators on that property
|
|
13
|
+
* @param {DecoratorMetadata[]} [accumulator] used when recursive is true, to cache decorators while it climbs the prototypal tree
|
|
14
|
+
*
|
|
15
|
+
* @function getPropertyDecorators
|
|
16
|
+
* @memberOf module:decorator-validation.Reflection
|
|
17
|
+
* @category Reflection
|
|
18
|
+
*/
|
|
19
|
+
export function getPropertyDecorators(annotationPrefix, target, propertyName, ignoreType = false, recursive = true, accumulator) {
|
|
20
|
+
const getPropertyDecoratorsForModel = function (annotationPrefix, target, propertyName, ignoreType = false, accumulator) {
|
|
21
|
+
// get info about keys that used in current property
|
|
22
|
+
const keys = Reflect.getMetadataKeys(target, propertyName);
|
|
23
|
+
const decorators = keys
|
|
24
|
+
// filter your custom decorators
|
|
25
|
+
.filter((key) => {
|
|
26
|
+
if (ignoreType)
|
|
27
|
+
return key.toString().startsWith(annotationPrefix);
|
|
28
|
+
return (key === ModelKeys.TYPE || key.toString().startsWith(annotationPrefix));
|
|
29
|
+
})
|
|
30
|
+
.reduce((values, key) => {
|
|
31
|
+
// get metadata value.
|
|
32
|
+
const currValues = {
|
|
33
|
+
key: key !== ModelKeys.TYPE
|
|
34
|
+
? key.substring(annotationPrefix.length)
|
|
35
|
+
: key,
|
|
36
|
+
props: Reflect.getMetadata(key, target, propertyName),
|
|
37
|
+
};
|
|
38
|
+
return values.concat(currValues);
|
|
39
|
+
}, accumulator || []);
|
|
40
|
+
return {
|
|
41
|
+
prop: propertyName.toString(),
|
|
42
|
+
decorators: decorators,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const result = getPropertyDecoratorsForModel(annotationPrefix, target, propertyName, ignoreType, accumulator);
|
|
46
|
+
const trim = function (items) {
|
|
47
|
+
const cache = {};
|
|
48
|
+
return items.filter((item) => {
|
|
49
|
+
if (item.key in cache) {
|
|
50
|
+
if (!isEqual(item.props, cache[item.key]))
|
|
51
|
+
console.log(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));
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
cache[item.key.toString()] = item.props;
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
if (!recursive || Object.getPrototypeOf(target) === Object.prototype) {
|
|
59
|
+
return {
|
|
60
|
+
prop: result.prop,
|
|
61
|
+
decorators: trim(result.decorators),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// We choose to ignore type here, because in inheritance the expected type is from the lowest child class
|
|
65
|
+
return getPropertyDecorators(annotationPrefix, Object.getPrototypeOf(target.constructor), propertyName, true, recursive, result.decorators);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @summary gets the prop type from the decorator
|
|
69
|
+
* @param {any} model
|
|
70
|
+
* @param {string | symbol} propKey
|
|
71
|
+
* @return {string | undefined}
|
|
72
|
+
*
|
|
73
|
+
* @function geTypeFromDecorators
|
|
74
|
+
*
|
|
75
|
+
* @memberOf module:decorator-validation.Reflection
|
|
76
|
+
*/
|
|
77
|
+
export function getTypeFromDecorator(model, propKey) {
|
|
78
|
+
const decorators = getPropertyDecorators(ModelKeys.REFLECT, model, propKey, false);
|
|
79
|
+
if (!decorators || !decorators.decorators)
|
|
80
|
+
return;
|
|
81
|
+
// TODO handle @type decorators. for now we stick with design:type
|
|
82
|
+
const typeDecorator = decorators.decorators.shift();
|
|
83
|
+
const name = typeDecorator.props ? typeDecorator.props.name : undefined;
|
|
84
|
+
return name !== "Function" ? name : undefined;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* @summary Retrieves the decorators for an object's properties prefixed by {@param prefixes}
|
|
88
|
+
*
|
|
89
|
+
* @param {T} model
|
|
90
|
+
* @param {string[]} prefixes
|
|
91
|
+
*
|
|
92
|
+
* @function getAllPropertyDecorators
|
|
93
|
+
*
|
|
94
|
+
* @memberOf module:db-decorators.Reflection
|
|
95
|
+
*/
|
|
96
|
+
export const getAllPropertyDecorators = function (model, ...prefixes) {
|
|
97
|
+
if (!prefixes || !prefixes.length)
|
|
98
|
+
return;
|
|
99
|
+
const pushOrCreate = function (accum, key, decorators) {
|
|
100
|
+
if (!decorators || !decorators.length)
|
|
101
|
+
return;
|
|
102
|
+
if (!accum[key])
|
|
103
|
+
accum[key] = [];
|
|
104
|
+
accum[key].push(...decorators);
|
|
105
|
+
};
|
|
106
|
+
return Object.getOwnPropertyNames(model).reduce((accum, propKey) => {
|
|
107
|
+
prefixes.forEach((p, index) => {
|
|
108
|
+
const decorators = getPropertyDecorators(p, model, propKey, index !== 0);
|
|
109
|
+
if (!accum)
|
|
110
|
+
accum = {};
|
|
111
|
+
pushOrCreate(accum, propKey, decorators.decorators);
|
|
112
|
+
});
|
|
113
|
+
return accum;
|
|
114
|
+
}, undefined);
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* @summary Retrieves all properties of an object
|
|
118
|
+
* @description
|
|
119
|
+
* - and of all its prototypes if {@param climbTree} until it reaches {@param stopAt} (or ends the prototype chain)
|
|
120
|
+
*
|
|
121
|
+
* @param obj
|
|
122
|
+
* @param {boolean} [climbTree] default to true
|
|
123
|
+
* @param {string} [stopAt] defaults to 'Object'
|
|
124
|
+
*
|
|
125
|
+
* @function getAllProperties
|
|
126
|
+
*
|
|
127
|
+
* @memberOf module:decorator-validation.Model
|
|
128
|
+
*/
|
|
129
|
+
export function getAllProperties(obj, climbTree = true, stopAt = "Object") {
|
|
130
|
+
const allProps = [];
|
|
131
|
+
let curr = obj;
|
|
132
|
+
const keepAtIt = function () {
|
|
133
|
+
if (!climbTree)
|
|
134
|
+
return;
|
|
135
|
+
const prototype = Object.getPrototypeOf(curr);
|
|
136
|
+
if (!prototype || prototype.constructor.name === stopAt)
|
|
137
|
+
return;
|
|
138
|
+
curr = prototype;
|
|
139
|
+
return curr;
|
|
140
|
+
};
|
|
141
|
+
do {
|
|
142
|
+
const props = Object.getOwnPropertyNames(curr);
|
|
143
|
+
props.forEach(function (prop) {
|
|
144
|
+
if (allProps.indexOf(prop) === -1)
|
|
145
|
+
allProps.push(prop);
|
|
146
|
+
});
|
|
147
|
+
} while (keepAtIt());
|
|
148
|
+
return allProps;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* @summary Util function to retrieve the Class decorators
|
|
152
|
+
*
|
|
153
|
+
* @function getClassDecorators
|
|
154
|
+
* @memberOf module:decorator-validation.Reflection
|
|
155
|
+
* @category Reflection
|
|
156
|
+
*/
|
|
157
|
+
export function getClassDecorators(annotationPrefix, target) {
|
|
158
|
+
const keys = Reflect.getOwnMetadataKeys(target.constructor);
|
|
159
|
+
return keys
|
|
160
|
+
.filter((key) => key.toString().startsWith(annotationPrefix))
|
|
161
|
+
.reduce((values, key) => {
|
|
162
|
+
// get metadata value
|
|
163
|
+
const currValues = {
|
|
164
|
+
key: key.substring(annotationPrefix.length),
|
|
165
|
+
props: Reflect.getMetadata(key, target.constructor),
|
|
166
|
+
};
|
|
167
|
+
return values.concat(currValues);
|
|
168
|
+
}, []);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* @summary Util function to check a type according to a typeName
|
|
172
|
+
*
|
|
173
|
+
* @param {any} value
|
|
174
|
+
* @param {string} acceptedType
|
|
175
|
+
* @return {boolean} true for a match, false otherwise
|
|
176
|
+
*
|
|
177
|
+
* @function checkType
|
|
178
|
+
* @memberOf module:decorator-validation.Validation
|
|
179
|
+
* @category Validation
|
|
180
|
+
*/
|
|
181
|
+
export function checkType(value, acceptedType) {
|
|
182
|
+
if (typeof value === acceptedType)
|
|
183
|
+
return true;
|
|
184
|
+
return (value.constructor &&
|
|
185
|
+
value.constructor.name.toLowerCase() === acceptedType.toLowerCase());
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* @summary Util function to check a type according multiple possibilities
|
|
189
|
+
* @param {any} value
|
|
190
|
+
* @param {string[]} acceptedTypes
|
|
191
|
+
* @return {boolean} true if any is a match, false otherwise
|
|
192
|
+
*
|
|
193
|
+
* @function checkTypes
|
|
194
|
+
* @memberOf module:decorator-validation.Validation
|
|
195
|
+
* @category Validation
|
|
196
|
+
*/
|
|
197
|
+
export function checkTypes(value, acceptedTypes) {
|
|
198
|
+
return !acceptedTypes.every((t) => !checkType(value, t));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* @summary The model type
|
|
202
|
+
*
|
|
203
|
+
* @param {any} value
|
|
204
|
+
* @param {string | string[] | {name: string}} types
|
|
205
|
+
*
|
|
206
|
+
* @function evaluateDesignTypes
|
|
207
|
+
* @memberOf module:decorator-validation.Validation
|
|
208
|
+
* @category Validation
|
|
209
|
+
*/
|
|
210
|
+
export function evaluateDesignTypes(value, types) {
|
|
211
|
+
switch (typeof types) {
|
|
212
|
+
case "string":
|
|
213
|
+
return checkType(value, types);
|
|
214
|
+
case "object":
|
|
215
|
+
if (Array.isArray(types))
|
|
216
|
+
return checkTypes(value, types);
|
|
217
|
+
return true;
|
|
218
|
+
case "function":
|
|
219
|
+
if (types.name && types.name !== "Object")
|
|
220
|
+
return checkType(value, types.name);
|
|
221
|
+
return true;
|
|
222
|
+
default:
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* @summary For Serialization/deserialization purposes.
|
|
228
|
+
* @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
|
|
229
|
+
*
|
|
230
|
+
* @function isModel
|
|
231
|
+
* @memberOf module:decorator-validation.Validation
|
|
232
|
+
* @category Validation
|
|
233
|
+
*/
|
|
234
|
+
export function isModel(target) {
|
|
235
|
+
return (!!target[ModelKeys.ANCHOR] ||
|
|
236
|
+
!!getClassDecorators(ModelKeys.REFLECT, target).find((dec) => dec.key === ModelKeys.MODEL && dec.props && dec.props.class));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZWZsZWN0aW9uL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sa0JBQWtCLENBQUM7QUFHMUI7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsZ0JBQXdCLEVBQ3hCLE1BQVcsRUFDWCxZQUE2QixFQUM3QixhQUFzQixLQUFLLEVBQzNCLFNBQVMsR0FBRyxJQUFJLEVBQ2hCLFdBQWlDO0lBRWpDLE1BQU0sNkJBQTZCLEdBQUcsVUFDcEMsZ0JBQXdCLEVBQ3hCLE1BQVcsRUFDWCxZQUE2QixFQUM3QixhQUFzQixLQUFLLEVBQzNCLFdBQWlDO1FBRWpDLG9EQUFvRDtRQUNwRCxNQUFNLElBQUksR0FBVSxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsRSxNQUFNLFVBQVUsR0FBd0IsSUFBSTtZQUMxQyxnQ0FBZ0M7YUFDL0IsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxJQUFJLFVBQVU7Z0JBQUUsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkUsT0FBTyxDQUNMLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FDdEUsQ0FBQztRQUNKLENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN0QixzQkFBc0I7WUFDdEIsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEdBQUcsRUFDRCxHQUFHLEtBQUss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QUksQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQ3ZDLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZDtZQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsTUFBMkI7SUFDakQsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUMxQixDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ2xELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FDckUsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsImZpbGUiOiJyZWZsZWN0aW9uL3V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwiLi4vdXRpbHMvZXF1YWxpdHlcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBkZWNvcmF0b3JzIGZvciB0aGUgcHJvdmlkZWQgUHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5ub3RhdGlvblByZWZpeFxuICogQHBhcmFtIHthbnl9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlVHlwZV0gZGVmYXVsdHMgdG8gZmFsc2UuIGRlY2lkZXMgaWYgdGhlIHtAbGluayBNb2RlbEtleXMuVFlQRX0gaXMgaWdub3JlZCBvciBub3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZV0gZGVmYXVsdHMgdG8gdHJ1ZS4gZGVjaWRlcyBpZiBpdCBzaG91bGQgY2xpbWIgdGhlIHByb3RvdHlwYWwgdHJlZSBzZWFyY2hpbmcgZm9yIG1vcmUgZGVjb3JhdG9ycyBvbiB0aGF0IHByb3BlcnR5XG4gKiBAcGFyYW0ge0RlY29yYXRvck1ldGFkYXRhW119IFthY2N1bXVsYXRvcl0gdXNlZCB3aGVuIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0byBjYWNoZSBkZWNvcmF0b3JzIHdoaWxlIGl0IGNsaW1icyB0aGUgcHJvdG90eXBhbCB0cmVlXG4gKlxuICogQGZ1bmN0aW9uIGdldFByb3BlcnR5RGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5SZWZsZWN0aW9uXG4gKiBAY2F0ZWdvcnkgUmVmbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICBhbm5vdGF0aW9uUHJlZml4OiBzdHJpbmcsXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN5bWJvbCxcbiAgaWdub3JlVHlwZTogYm9vbGVhbiA9IGZhbHNlLFxuICByZWN1cnNpdmUgPSB0cnVlLFxuICBhY2N1bXVsYXRvcj86IERlY29yYXRvck1ldGFkYXRhW10sXG4pOiB7IHByb3A6IHN0cmluZzsgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSB9IHtcbiAgY29uc3QgZ2V0UHJvcGVydHlEZWNvcmF0b3JzRm9yTW9kZWwgPSBmdW5jdGlvbiAoXG4gICAgYW5ub3RhdGlvblByZWZpeDogc3RyaW5nLFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGlnbm9yZVR5cGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhY2N1bXVsYXRvcj86IERlY29yYXRvck1ldGFkYXRhW10sXG4gICk6IHsgcHJvcDogc3RyaW5nOyBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdIH0ge1xuICAgIC8vIGdldCBpbmZvIGFib3V0IGtleXMgdGhhdCB1c2VkIGluIGN1cnJlbnQgcHJvcGVydHlcbiAgICBjb25zdCBrZXlzOiBhbnlbXSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlOYW1lKTtcbiAgICBjb25zdCBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YVtdID0ga2V5c1xuICAgICAgLy8gZmlsdGVyIHlvdXIgY3VzdG9tIGRlY29yYXRvcnNcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlVHlwZSkgcmV0dXJuIGtleS50b1N0cmluZygpLnN0YXJ0c1dpdGgoYW5ub3RhdGlvblByZWZpeCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAga2V5ID09PSBNb2RlbEtleXMuVFlQRSB8fCBrZXkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGFubm90YXRpb25QcmVmaXgpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgodmFsdWVzLCBrZXkpID0+IHtcbiAgICAgICAgLy8gZ2V0IG1ldGFkYXRhIHZhbHVlLlxuICAgICAgICBjb25zdCBjdXJyVmFsdWVzID0ge1xuICAgICAgICAgIGtleTpcbiAgICAgICAgICAgIGtleSAhPT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICAgICAgICAgPyBrZXkuc3Vic3RyaW5nKGFubm90YXRpb25QcmVmaXgubGVuZ3RoKVxuICAgICAgICAgICAgICA6IGtleSxcbiAgICAgICAgICBwcm9wczogUmVmbGVjdC5nZXRNZXRhZGF0YShrZXksIHRhcmdldCwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcy5jb25jYXQoY3VyclZhbHVlcyk7XG4gICAgICB9LCBhY2N1bXVsYXRvciB8fCBbXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvcDogcHJvcGVydHlOYW1lLnRvU3RyaW5nKCksXG4gICAgICBkZWNvcmF0b3JzOiBkZWNvcmF0b3JzLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgcmVzdWx0OiB7IHByb3A6IHN0cmluZzsgZGVjb3JhdG9yczogRGVjb3JhdG9yTWV0YWRhdGFbXSB9ID1cbiAgICBnZXRQcm9wZXJ0eURlY29yYXRvcnNGb3JNb2RlbChcbiAgICAgIGFubm90YXRpb25QcmVmaXgsXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBpZ25vcmVUeXBlLFxuICAgICAgYWNjdW11bGF0b3IsXG4gICAgKTtcblxuICBjb25zdCB0cmltID0gZnVuY3Rpb24gKGl0ZW1zOiBEZWNvcmF0b3JNZXRhZGF0YVtdKSB7XG4gICAgY29uc3QgY2FjaGU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPiA9IHt9O1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW06IERlY29yYXRvck1ldGFkYXRhKSA9PiB7XG4gICAgICBpZiAoaXRlbS5rZXkgaW4gY2FjaGUpIHtcbiAgICAgICAgaWYgKCFpc0VxdWFsKGl0ZW0ucHJvcHMsIGNhY2hlW2l0ZW0ua2V5XSkpXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBzZihcbiAgICAgICAgICAgICAgXCJGb3VuZCBhIHNpbWlsYXIgZGVjb3JhdG9yIGZvciB0aGUgezB9IHByb3BlcnR5IG9mIGEgezF9IG1vZGVsIGJ1dCB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiBUaGUgb3JpZ2luYWwgb25lIHdpbGwgYmUga2VwdFwiLFxuICAgICAgICAgICAgICBpdGVtLmtleSxcbiAgICAgICAgICAgICAgdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY2FjaGVbaXRlbS5rZXkudG9TdHJpbmcoKV0gPSBpdGVtLnByb3BzIGFzIERlY29yYXRvck1ldGFkYXRhO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgaWYgKCFyZWN1cnNpdmUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvcDogcmVzdWx0LnByb3AsXG4gICAgICBkZWNvcmF0b3JzOiB0cmltKHJlc3VsdC5kZWNvcmF0b3JzKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gV2UgY2hvb3NlIHRvIGlnbm9yZSB0eXBlIGhlcmUsIGJlY2F1c2UgaW4gaW5oZXJpdGFuY2UgdGhlIGV4cGVjdGVkIHR5cGUgaXMgZnJvbSB0aGUgbG93ZXN0IGNoaWxkIGNsYXNzXG4gIHJldHVybiBnZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgYW5ub3RhdGlvblByZWZpeCxcbiAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0LmNvbnN0cnVjdG9yKSxcbiAgICBwcm9wZXJ0eU5hbWUsXG4gICAgdHJ1ZSxcbiAgICByZWN1cnNpdmUsXG4gICAgcmVzdWx0LmRlY29yYXRvcnMsXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgZ2V0cyB0aGUgcHJvcCB0eXBlIGZyb20gdGhlIGRlY29yYXRvclxuICogQHBhcmFtIHthbnl9IG1vZGVsXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleVxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICpcbiAqIEBmdW5jdGlvbiBnZVR5cGVGcm9tRGVjb3JhdG9yc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uUmVmbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gIG1vZGVsOiBhbnksXG4gIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY29yYXRvcnM6IHsgcHJvcDogc3RyaW5nIHwgc3ltYm9sOyBkZWNvcmF0b3JzOiBhbnlbXSB9ID1cbiAgICBnZXRQcm9wZXJ0eURlY29yYXRvcnMoTW9kZWxLZXlzLlJFRkxFQ1QsIG1vZGVsLCBwcm9wS2V5LCBmYWxzZSk7XG4gIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5kZWNvcmF0b3JzKSByZXR1cm47XG5cbiAgLy8gVE9ETyBoYW5kbGUgQHR5cGUgZGVjb3JhdG9ycy4gZm9yIG5vdyB3ZSBzdGljayB3aXRoIGRlc2lnbjp0eXBlXG4gIGNvbnN0IHR5cGVEZWNvcmF0b3IgPSBkZWNvcmF0b3JzLmRlY29yYXRvcnMuc2hpZnQoKTtcbiAgY29uc3QgbmFtZSA9IHR5cGVEZWNvcmF0b3IucHJvcHMgPyB0eXBlRGVjb3JhdG9yLnByb3BzLm5hbWUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBuYW1lICE9PSBcIkZ1bmN0aW9uXCIgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgZGVjb3JhdG9ycyBmb3IgYW4gb2JqZWN0J3MgcHJvcGVydGllcyBwcmVmaXhlZCBieSB7QHBhcmFtIHByZWZpeGVzfVxuICpcbiAqIEBwYXJhbSB7VH0gbW9kZWxcbiAqIEBwYXJhbSB7c3RyaW5nW119IHByZWZpeGVzXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5SZWZsZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IFQsXG4gIC4uLnByZWZpeGVzOiBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJlZml4ZXMgfHwgIXByZWZpeGVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IHB1c2hPckNyZWF0ZSA9IGZ1bmN0aW9uIChcbiAgICBhY2N1bTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgZGVjb3JhdG9yczogYW55W10sXG4gICkge1xuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoIWFjY3VtW2tleV0pIGFjY3VtW2tleV0gPSBbXTtcbiAgICBhY2N1bVtrZXldLnB1c2goLi4uZGVjb3JhdG9ycyk7XG4gIH07XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG1vZGVsKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLCBwcm9wS2V5KSA9PiB7XG4gICAgICBwcmVmaXhlcy5mb3JFYWNoKChwLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBkZWNvcmF0b3JzOiB7IHByb3A6IHN0cmluZyB8IHN5bWJvbDsgZGVjb3JhdG9yczogYW55W10gfSA9XG4gICAgICAgICAgZ2V0UHJvcGVydHlEZWNvcmF0b3JzKHAsIG1vZGVsLCBwcm9wS2V5LCBpbmRleCAhPT0gMCk7XG4gICAgICAgIGlmICghYWNjdW0pIGFjY3VtID0ge307XG4gICAgICAgIHB1c2hPckNyZWF0ZShhY2N1bSwgcHJvcEtleSwgZGVjb3JhdG9ycy5kZWNvcmF0b3JzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAgdW5kZWZpbmVkLFxuICApO1xufTtcblxuLyoqXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0XG4gKiBAZGVzY3JpcHRpb25cbiAqICAtIGFuZCBvZiBhbGwgaXRzIHByb3RvdHlwZXMgaWYge0BwYXJhbSBjbGltYlRyZWV9IHVudGlsIGl0IHJlYWNoZXMge0BwYXJhbSBzdG9wQXR9IChvciBlbmRzIHRoZSBwcm90b3R5cGUgY2hhaW4pXG4gKlxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHtib29sZWFufSBbY2xpbWJUcmVlXSBkZWZhdWx0IHRvIHRydWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RvcEF0XSBkZWZhdWx0cyB0byAnT2JqZWN0J1xuICpcbiAqIEBmdW5jdGlvbiBnZXRBbGxQcm9wZXJ0aWVzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsUHJvcGVydGllcyhcbiAgb2JqOiBSZWNvcmQ8YW55LCBhbnk+LFxuICBjbGltYlRyZWUgPSB0cnVlLFxuICBzdG9wQXQgPSBcIk9iamVjdFwiLFxuKSB7XG4gIGNvbnN0IGFsbFByb3BzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycjogUmVjb3JkPGFueSwgYW55PiA9IG9iajtcblxuICBjb25zdCBrZWVwQXRJdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNsaW1iVHJlZSkgcmV0dXJuO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyKTtcbiAgICBpZiAoIXByb3RvdHlwZSB8fCBwcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSA9PT0gc3RvcEF0KSByZXR1cm47XG4gICAgY3VyciA9IHByb3RvdHlwZTtcbiAgICByZXR1cm4gY3VycjtcbiAgfTtcblxuICBkbyB7XG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdXJyKTtcbiAgICBwcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBpZiAoYWxsUHJvcHMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIGFsbFByb3BzLnB1c2gocHJvcCk7XG4gICAgfSk7XG4gIH0gd2hpbGUgKGtlZXBBdEl0KCkpO1xuICByZXR1cm4gYWxsUHJvcHM7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgQ2xhc3MgZGVjb3JhdG9yc1xuICpcbiAqIEBmdW5jdGlvbiBnZXRDbGFzc0RlY29yYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uUmVmbGVjdGlvblxuICogQGNhdGVnb3J5IFJlZmxlY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENsYXNzRGVjb3JhdG9ycyhcbiAgYW5ub3RhdGlvblByZWZpeDogc3RyaW5nLFxuICB0YXJnZXQ6IGFueSxcbik6IHsga2V5OiBzdHJpbmc7IHByb3BzOiBhbnkgfVtdIHtcbiAgY29uc3Qga2V5czogYW55W10gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQuY29uc3RydWN0b3IpO1xuXG4gIHJldHVybiBrZXlzXG4gICAgLmZpbHRlcigoa2V5KSA9PiBrZXkudG9TdHJpbmcoKS5zdGFydHNXaXRoKGFubm90YXRpb25QcmVmaXgpKVxuICAgIC5yZWR1Y2UoKHZhbHVlcywga2V5KSA9PiB7XG4gICAgICAvLyBnZXQgbWV0YWRhdGEgdmFsdWVcbiAgICAgIGNvbnN0IGN1cnJWYWx1ZXMgPSB7XG4gICAgICAgIGtleToga2V5LnN1YnN0cmluZyhhbm5vdGF0aW9uUHJlZml4Lmxlbmd0aCksXG4gICAgICAgIHByb3BzOiBSZWZsZWN0LmdldE1ldGFkYXRhKGtleSwgdGFyZ2V0LmNvbnN0cnVjdG9yKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdmFsdWVzLmNvbmNhdChjdXJyVmFsdWVzKTtcbiAgICB9LCBbXSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBjaGVjayBhIHR5cGUgYWNjb3JkaW5nIHRvIGEgdHlwZU5hbWVcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY2NlcHRlZFR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgZm9yIGEgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBmdW5jdGlvbiBjaGVja1R5cGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVHlwZSh2YWx1ZTogYW55LCBhY2NlcHRlZFR5cGU6IHN0cmluZykge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBhY2NlcHRlZFR5cGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLmNvbnN0cnVjdG9yICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NlcHRlZFR5cGUudG9Mb3dlckNhc2UoKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gY2hlY2sgYSB0eXBlIGFjY29yZGluZyBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFjY2VwdGVkVHlwZXNcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYW55IGlzIGEgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBmdW5jdGlvbiBjaGVja1R5cGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1R5cGVzKHZhbHVlOiBhbnksIGFjY2VwdGVkVHlwZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiAhYWNjZXB0ZWRUeXBlcy5ldmVyeSgodCkgPT4gIWNoZWNrVHlwZSh2YWx1ZSwgdCkpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBtb2RlbCB0eXBlXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwge25hbWU6IHN0cmluZ319IHR5cGVzXG4gKlxuICogQGZ1bmN0aW9uIGV2YWx1YXRlRGVzaWduVHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlRGVzaWduVHlwZXMoXG4gIHZhbHVlOiBhbnksXG4gIHR5cGVzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHsgbmFtZTogc3RyaW5nIH0sXG4pIHtcbiAgc3dpdGNoICh0eXBlb2YgdHlwZXMpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gY2hlY2tUeXBlKHZhbHVlLCB0eXBlcyk7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZXMpKSByZXR1cm4gY2hlY2tUeXBlcyh2YWx1ZSwgdHlwZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICBpZiAodHlwZXMubmFtZSAmJiB0eXBlcy5uYW1lICE9PSBcIk9iamVjdFwiKVxuICAgICAgICByZXR1cm4gY2hlY2tUeXBlKHZhbHVlLCB0eXBlcy5uYW1lKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEZvciBTZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBwdXJwb3Nlcy5cbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyB0aGUge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9IHByb3BlcnR5IG9mIGEge0BsaW5rIE1vZGVsfSB0byBkaXNjb3ZlciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAqXG4gKiBAZnVuY3Rpb24gaXNNb2RlbFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RlbCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgcmV0dXJuIChcbiAgICAhIXRhcmdldFtNb2RlbEtleXMuQU5DSE9SXSB8fFxuICAgICEhZ2V0Q2xhc3NEZWNvcmF0b3JzKE1vZGVsS2V5cy5SRUZMRUNULCB0YXJnZXQpLmZpbmQoXG4gICAgICAoZGVjKSA9PiBkZWMua2V5ID09PSBNb2RlbEtleXMuTU9ERUwgJiYgZGVjLnByb3BzICYmIGRlYy5wcm9wcy5jbGFzcyxcbiAgICApXG4gICk7XG59XG4iXX0=
|
|
@@ -1 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @summary Defines the various Model keys used for reflection
|
|
3
|
+
*
|
|
4
|
+
* @property {string} REFLECT prefix to all other keys
|
|
5
|
+
* @property {string} TYPE type key
|
|
6
|
+
* @property {string} PARAMS method params key
|
|
7
|
+
* @property {string} RETURN method return key
|
|
8
|
+
* @property {string} MODEL model key
|
|
9
|
+
* @property {string} ANCHOR anchor key. will serve as a ghost property in the model
|
|
10
|
+
*
|
|
11
|
+
* @constant ModelKeys
|
|
12
|
+
* @memberOf module:decorator-validation.Model
|
|
13
|
+
* @category Model
|
|
14
|
+
*/
|
|
15
|
+
export var ModelKeys;
|
|
16
|
+
(function (ModelKeys) {
|
|
17
|
+
ModelKeys["REFLECT"] = "model.definition.";
|
|
18
|
+
ModelKeys["TYPE"] = "design:type";
|
|
19
|
+
ModelKeys["PARAMS"] = "design:paramtypes";
|
|
20
|
+
ModelKeys["RETURN"] = "design:returntype";
|
|
21
|
+
ModelKeys["MODEL"] = "model";
|
|
22
|
+
ModelKeys["ANCHOR"] = "__modelDefinition";
|
|
23
|
+
})(ModelKeys || (ModelKeys = {}));
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBTixJQUFZLFNBT1g7QUFQRCxXQUFZLFNBQVM7SUFDbkIsMENBQTZCLENBQUE7SUFDN0IsaUNBQW9CLENBQUE7SUFDcEIseUNBQTRCLENBQUE7SUFDNUIseUNBQTRCLENBQUE7SUFDNUIsNEJBQWUsQ0FBQTtJQUNmLHlDQUE0QixDQUFBO0FBQzlCLENBQUMsRUFQVyxTQUFTLEtBQVQsU0FBUyxRQU9wQiIsImZpbGUiOiJ1dGlscy9jb25zdGFudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgTW9kZWwga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgcHJlZml4IHRvIGFsbCBvdGhlciBrZXlzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSB0eXBlIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBUkFNUyBtZXRob2QgcGFyYW1zIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFVFVSTiBtZXRob2QgcmV0dXJuIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PREVMIG1vZGVsIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFOQ0hPUiBhbmNob3Iga2V5LiB3aWxsIHNlcnZlIGFzIGEgZ2hvc3QgcHJvcGVydHkgaW4gdGhlIG1vZGVsXG4gKlxuICogQGNvbnN0YW50IE1vZGVsS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsS2V5cyB7XG4gIFJFRkxFQ1QgPSBcIm1vZGVsLmRlZmluaXRpb24uXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsRGVmaW5pdGlvblwiLFxufVxuIl19
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
/**
|
|
3
|
+
* @summary Reverses the process from {@link formatDate}
|
|
4
|
+
*
|
|
5
|
+
* @param {string} date the date string to be converted back into date
|
|
6
|
+
* @param {string} format the date format
|
|
7
|
+
* @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?)
|
|
8
|
+
*
|
|
9
|
+
* @function dateFromFormat
|
|
10
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
11
|
+
* @category Format
|
|
12
|
+
*/
|
|
13
|
+
export declare function dateFromFormat(date: string, format: string): Date;
|
|
14
|
+
/**
|
|
15
|
+
* @summary Binds a date format to a string
|
|
16
|
+
* @param {Date} [date]
|
|
17
|
+
* @param {string} [format]
|
|
18
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
19
|
+
* @category Utilities
|
|
20
|
+
*/
|
|
21
|
+
export declare function bindDateToString(date: Date | undefined, format: string): Date | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* @summary Helper function to be used instead of instanceOf Date
|
|
24
|
+
* @param date
|
|
25
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
26
|
+
* @category Validation
|
|
27
|
+
*/
|
|
28
|
+
export declare function isValidDate(date: any): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* @summary Util function to pad numbers
|
|
31
|
+
* @param {number} num
|
|
32
|
+
*
|
|
33
|
+
* @return {string}
|
|
34
|
+
*
|
|
35
|
+
* @function twoDigitPad
|
|
36
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
37
|
+
* @category Format
|
|
38
|
+
*/
|
|
39
|
+
export declare function twoDigitPad(num: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* @summary Date Format Handling
|
|
42
|
+
* @description Code from {@link https://stackoverflow.com/questions/3552461/how-to-format-a-javascript-date}
|
|
43
|
+
*
|
|
44
|
+
* <pre>
|
|
45
|
+
* Using similar formatting as Moment.js, Class DateTimeFormatter (Java), and Class SimpleDateFormat (Java),
|
|
46
|
+
* I implemented a comprehensive solution formatDate(date, patternStr) where the code is easy to read and modify.
|
|
47
|
+
* You can display date, time, AM/PM, etc.
|
|
48
|
+
*
|
|
49
|
+
* Date and Time Patterns
|
|
50
|
+
* yy = 2-digit year; yyyy = full year
|
|
51
|
+
* M = digit month; MM = 2-digit month; MMM = short month name; MMMM = full month name
|
|
52
|
+
* EEEE = full weekday name; EEE = short weekday name
|
|
53
|
+
* d = digit day; dd = 2-digit day
|
|
54
|
+
* h = hours am/pm; hh = 2-digit hours am/pm; H = hours; HH = 2-digit hours
|
|
55
|
+
* m = minutes; mm = 2-digit minutes; aaa = AM/PM
|
|
56
|
+
* s = seconds; ss = 2-digit seconds
|
|
57
|
+
* S = miliseconds
|
|
58
|
+
* </pre>
|
|
59
|
+
*
|
|
60
|
+
* @param {Date} date
|
|
61
|
+
* @param {string} [patternStr] defaults to 'yyyy/MM/dd'
|
|
62
|
+
* @return {string} the formatted date
|
|
63
|
+
*
|
|
64
|
+
* @function formatDate
|
|
65
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
66
|
+
* @category Format
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatDate(date: Date, patternStr?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* @summary Parses a date from a specified format
|
|
71
|
+
* @param {string} format
|
|
72
|
+
* @param {string | Date | number} [v]
|
|
73
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
74
|
+
* @category Format
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseDate(format: string, v?: string | Date | number): Date | undefined;
|