@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.
Files changed (141) hide show
  1. package/dist/decorator-validation.bundle.min.js +1 -1
  2. package/dist/esm/decorator-validation.bundle.min.esm.js +1 -1
  3. package/lib/esm/index.d.ts +6 -1
  4. package/lib/esm/index.js +68 -1
  5. package/lib/esm/model/Model.d.ts +3 -1
  6. package/lib/esm/model/Model.js +316 -1
  7. package/lib/esm/model/ModelErrorDefinition.d.ts +1 -1
  8. package/lib/esm/model/ModelErrorDefinition.js +55 -3
  9. package/lib/esm/model/Registry.d.ts +1 -1
  10. package/lib/esm/model/Registry.js +76 -1
  11. package/lib/esm/model/constants.js +44 -1
  12. package/lib/esm/model/construction.js +124 -1
  13. package/lib/esm/model/decorators.d.ts +3 -3
  14. package/lib/esm/model/decorators.js +68 -1
  15. package/lib/esm/model/index.d.ts +3 -3
  16. package/lib/esm/model/index.js +9 -1
  17. package/lib/esm/model/types.js +3 -0
  18. package/lib/esm/reflection/decorators.d.ts +15 -0
  19. package/lib/esm/reflection/decorators.js +28 -0
  20. package/lib/esm/reflection/index.d.ts +2 -0
  21. package/lib/esm/reflection/index.js +4 -0
  22. package/lib/esm/{utils/general.d.ts → reflection/utils.d.ts} +7 -87
  23. package/lib/esm/reflection/utils.js +239 -0
  24. package/lib/esm/utils/constants.js +25 -1
  25. package/lib/esm/utils/dates.d.ts +76 -0
  26. package/lib/esm/utils/dates.js +241 -0
  27. package/lib/esm/utils/equality.d.ts +14 -0
  28. package/lib/esm/utils/equality.js +34 -0
  29. package/lib/esm/utils/hashing.d.ts +42 -0
  30. package/lib/esm/utils/hashing.js +73 -0
  31. package/lib/esm/utils/index.d.ts +6 -2
  32. package/lib/esm/utils/index.js +10 -1
  33. package/lib/esm/utils/registry.js +3 -0
  34. package/lib/esm/utils/serialization.js +53 -1
  35. package/lib/esm/utils/strings.d.ts +25 -0
  36. package/lib/esm/utils/strings.js +31 -0
  37. package/lib/esm/validation/Validation.d.ts +2 -1
  38. package/lib/esm/validation/Validation.js +63 -1
  39. package/lib/esm/validation/Validators/DateValidator.js +55 -1
  40. package/lib/esm/validation/Validators/EmailValidator.d.ts +0 -1
  41. package/lib/esm/validation/Validators/EmailValidator.js +49 -1
  42. package/lib/esm/validation/Validators/ListValidator.js +67 -1
  43. package/lib/esm/validation/Validators/MaxLengthValidator.js +55 -1
  44. package/lib/esm/validation/Validators/MaxValidator.js +59 -1
  45. package/lib/esm/validation/Validators/MinLengthValidator.js +55 -1
  46. package/lib/esm/validation/Validators/MinValidator.js +59 -1
  47. package/lib/esm/validation/Validators/PasswordValidator.js +52 -1
  48. package/lib/esm/validation/Validators/PatternValidator.d.ts +3 -3
  49. package/lib/esm/validation/Validators/PatternValidator.js +72 -1
  50. package/lib/esm/validation/Validators/RequiredValidator.js +57 -1
  51. package/lib/esm/validation/Validators/StepValidator.js +54 -1
  52. package/lib/esm/validation/Validators/TypeValidator.js +42 -1
  53. package/lib/esm/validation/Validators/URLValidator.d.ts +0 -1
  54. package/lib/esm/validation/Validators/URLValidator.js +48 -1
  55. package/lib/esm/validation/Validators/Validator.js +50 -1
  56. package/lib/esm/validation/Validators/ValidatorRegistry.js +81 -1
  57. package/lib/esm/validation/Validators/constants.d.ts +8 -4
  58. package/lib/esm/validation/Validators/constants.js +135 -1
  59. package/lib/esm/validation/Validators/decorators.d.ts +13 -0
  60. package/lib/esm/validation/Validators/decorators.js +23 -0
  61. package/lib/esm/validation/Validators/index.d.ts +9 -7
  62. package/lib/esm/validation/Validators/index.js +54 -1
  63. package/lib/esm/validation/Validators/types.d.ts +2 -2
  64. package/lib/esm/validation/Validators/types.js +3 -0
  65. package/lib/esm/validation/decorators.d.ts +14 -87
  66. package/lib/esm/validation/decorators.js +320 -1
  67. package/lib/esm/validation/index.d.ts +1 -10
  68. package/lib/esm/validation/index.js +6 -1
  69. package/lib/esm/validation/types.d.ts +11 -0
  70. package/lib/esm/validation/types.js +3 -0
  71. package/lib/index.cjs +85 -1
  72. package/lib/index.d.ts +6 -1
  73. package/lib/model/Model.cjs +321 -1
  74. package/lib/model/Model.d.ts +3 -1
  75. package/lib/model/ModelErrorDefinition.cjs +59 -3
  76. package/lib/model/ModelErrorDefinition.d.ts +1 -1
  77. package/lib/model/Registry.cjs +81 -1
  78. package/lib/model/Registry.d.ts +1 -1
  79. package/lib/model/constants.cjs +47 -1
  80. package/lib/model/construction.cjs +129 -1
  81. package/lib/model/decorators.cjs +73 -1
  82. package/lib/model/decorators.d.ts +3 -3
  83. package/lib/model/index.cjs +25 -1
  84. package/lib/model/index.d.ts +3 -3
  85. package/lib/model/types.cjs +4 -1
  86. package/lib/reflection/decorators.cjs +31 -0
  87. package/lib/reflection/decorators.d.ts +15 -0
  88. package/lib/reflection/index.cjs +20 -0
  89. package/lib/reflection/index.d.ts +2 -0
  90. package/lib/reflection/utils.cjs +251 -0
  91. package/lib/{utils/general.d.ts → reflection/utils.d.ts} +7 -87
  92. package/lib/utils/constants.cjs +28 -1
  93. package/lib/utils/dates.cjs +249 -0
  94. package/lib/utils/dates.d.ts +76 -0
  95. package/lib/utils/equality.cjs +37 -0
  96. package/lib/utils/equality.d.ts +14 -0
  97. package/lib/utils/hashing.cjs +78 -0
  98. package/lib/utils/hashing.d.ts +42 -0
  99. package/lib/utils/index.cjs +26 -1
  100. package/lib/utils/index.d.ts +6 -2
  101. package/lib/utils/registry.cjs +4 -1
  102. package/lib/utils/serialization.cjs +57 -1
  103. package/lib/utils/strings.cjs +35 -0
  104. package/lib/utils/strings.d.ts +25 -0
  105. package/lib/validation/Validation.cjs +67 -1
  106. package/lib/validation/Validation.d.ts +2 -1
  107. package/lib/validation/Validators/DateValidator.cjs +58 -1
  108. package/lib/validation/Validators/EmailValidator.cjs +52 -1
  109. package/lib/validation/Validators/EmailValidator.d.ts +0 -1
  110. package/lib/validation/Validators/ListValidator.cjs +70 -1
  111. package/lib/validation/Validators/MaxLengthValidator.cjs +58 -1
  112. package/lib/validation/Validators/MaxValidator.cjs +62 -1
  113. package/lib/validation/Validators/MinLengthValidator.cjs +58 -1
  114. package/lib/validation/Validators/MinValidator.cjs +62 -1
  115. package/lib/validation/Validators/PasswordValidator.cjs +55 -1
  116. package/lib/validation/Validators/PatternValidator.cjs +75 -1
  117. package/lib/validation/Validators/PatternValidator.d.ts +3 -3
  118. package/lib/validation/Validators/RequiredValidator.cjs +60 -1
  119. package/lib/validation/Validators/StepValidator.cjs +57 -1
  120. package/lib/validation/Validators/TypeValidator.cjs +46 -1
  121. package/lib/validation/Validators/URLValidator.cjs +51 -1
  122. package/lib/validation/Validators/URLValidator.d.ts +0 -1
  123. package/lib/validation/Validators/Validator.cjs +54 -1
  124. package/lib/validation/Validators/ValidatorRegistry.cjs +86 -1
  125. package/lib/validation/Validators/constants.cjs +138 -1
  126. package/lib/validation/Validators/constants.d.ts +8 -4
  127. package/lib/validation/Validators/decorators.cjs +26 -0
  128. package/lib/validation/Validators/decorators.d.ts +13 -0
  129. package/lib/validation/Validators/index.cjs +71 -1
  130. package/lib/validation/Validators/index.d.ts +9 -7
  131. package/lib/validation/Validators/types.cjs +4 -1
  132. package/lib/validation/Validators/types.d.ts +2 -2
  133. package/lib/validation/decorators.cjs +337 -1
  134. package/lib/validation/decorators.d.ts +14 -87
  135. package/lib/validation/index.cjs +22 -1
  136. package/lib/validation/index.d.ts +1 -10
  137. package/lib/validation/types.cjs +4 -1
  138. package/lib/validation/types.d.ts +11 -0
  139. package/package.json +17 -13
  140. package/lib/esm/utils/general.js +0 -1
  141. 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
- var ModelKeys;!function(e){e.REFLECT="model.definition.",e.TYPE="design:type",e.PARAMS="design:paramtypes",e.RETURN="design:returntype",e.MODEL="model",e.ANCHOR="__modelDefinition"}(ModelKeys=ModelKeys||{});export{ModelKeys};
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;