@decaf-ts/decorator-validation 1.7.3 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE.md +21 -157
  2. package/dist/decorator-validation.cjs +320 -211
  3. package/dist/decorator-validation.esm.cjs +320 -211
  4. package/lib/constants/errors.cjs +19 -0
  5. package/lib/constants/errors.d.ts +11 -0
  6. package/lib/constants/index.cjs +2 -1
  7. package/lib/constants/index.d.ts +1 -0
  8. package/lib/esm/constants/errors.d.ts +11 -0
  9. package/lib/esm/constants/errors.js +16 -0
  10. package/lib/esm/constants/index.d.ts +1 -0
  11. package/lib/esm/constants/index.js +2 -1
  12. package/lib/esm/index.d.ts +1 -1
  13. package/lib/esm/index.js +1 -1
  14. package/lib/esm/model/validation.js +3 -3
  15. package/lib/esm/utils/PathProxy.d.ts +43 -0
  16. package/lib/esm/utils/PathProxy.js +89 -0
  17. package/lib/esm/utils/index.d.ts +1 -0
  18. package/lib/esm/utils/index.js +2 -1
  19. package/lib/esm/validation/Validators/DiffValidator.d.ts +4 -2
  20. package/lib/esm/validation/Validators/DiffValidator.js +5 -5
  21. package/lib/esm/validation/Validators/EqualsValidator.d.ts +4 -2
  22. package/lib/esm/validation/Validators/EqualsValidator.js +5 -5
  23. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
  24. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js +6 -5
  25. package/lib/esm/validation/Validators/GreaterThanValidator.d.ts +4 -2
  26. package/lib/esm/validation/Validators/GreaterThanValidator.js +6 -5
  27. package/lib/esm/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
  28. package/lib/esm/validation/Validators/LessThanOrEqualValidator.js +6 -5
  29. package/lib/esm/validation/Validators/LessThanValidator.d.ts +4 -2
  30. package/lib/esm/validation/Validators/LessThanValidator.js +6 -5
  31. package/lib/esm/validation/Validators/Validator.d.ts +3 -2
  32. package/lib/esm/validation/Validators/Validator.js +1 -1
  33. package/lib/esm/validation/Validators/constants.d.ts +0 -13
  34. package/lib/esm/validation/Validators/constants.js +1 -14
  35. package/lib/esm/validation/Validators/utils.d.ts +0 -14
  36. package/lib/esm/validation/Validators/utils.js +69 -56
  37. package/lib/index.cjs +1 -1
  38. package/lib/index.d.ts +1 -1
  39. package/lib/model/validation.cjs +3 -3
  40. package/lib/utils/PathProxy.cjs +93 -0
  41. package/lib/utils/PathProxy.d.ts +43 -0
  42. package/lib/utils/index.cjs +2 -1
  43. package/lib/utils/index.d.ts +1 -0
  44. package/lib/validation/Validators/DiffValidator.cjs +5 -5
  45. package/lib/validation/Validators/DiffValidator.d.ts +4 -2
  46. package/lib/validation/Validators/EqualsValidator.cjs +5 -5
  47. package/lib/validation/Validators/EqualsValidator.d.ts +4 -2
  48. package/lib/validation/Validators/GreaterThanOrEqualValidator.cjs +5 -4
  49. package/lib/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
  50. package/lib/validation/Validators/GreaterThanValidator.cjs +5 -4
  51. package/lib/validation/Validators/GreaterThanValidator.d.ts +4 -2
  52. package/lib/validation/Validators/LessThanOrEqualValidator.cjs +5 -4
  53. package/lib/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
  54. package/lib/validation/Validators/LessThanValidator.cjs +5 -4
  55. package/lib/validation/Validators/LessThanValidator.d.ts +4 -2
  56. package/lib/validation/Validators/Validator.cjs +1 -1
  57. package/lib/validation/Validators/Validator.d.ts +3 -2
  58. package/lib/validation/Validators/constants.cjs +2 -15
  59. package/lib/validation/Validators/constants.d.ts +0 -13
  60. package/lib/validation/Validators/utils.cjs +79 -67
  61. package/lib/validation/Validators/utils.d.ts +0 -14
  62. package/package.json +2 -2
@@ -1,64 +1,76 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getValueByPath = getValueByPath;
4
3
  exports.isValidForGteOrLteComparison = isValidForGteOrLteComparison;
5
4
  exports.isLessThan = isLessThan;
6
5
  exports.isGreaterThan = isGreaterThan;
7
6
  const constants_1 = require("./../../constants/index.cjs");
8
- const strings_1 = require("./../../utils/strings.cjs");
9
- const constants_2 = require("./constants.cjs");
10
- /**
11
- * Safely retrieves a nested property value from an object using a dot-notated path string.
12
- *
13
- * @template T - The expected return type of the property value.
14
- *
15
- * @param {Record<string, any>} obj - The source object to retrieve the value from.
16
- * @param {string} path - A dot-separated string representing the path to the desired property (e.g., "user.address.street").
17
- *
18
- * @returns {T} - The value found at the specified path
19
- *
20
- * @throws {Error} - Throws an error if the path is not a non-empty string or if any part of the path does not exist in the object.
21
- * @memberOf module:decorator-validation
22
- */
23
- function getValueByPath(obj, path) {
24
- if (typeof path !== "string" || !path.trim()) {
25
- throw new Error((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.INVALID_PATH, path));
26
- }
27
- // Process parent directory access (../)
28
- const parentAccessors = path.match(/\.\.\//g) || [];
29
- const parentLevel = parentAccessors.length;
30
- const cleanPath = path.replace(/\.\.\//g, "");
31
- // Navigate up the parent chain
32
- let currentContext = obj;
33
- for (let i = 0; i < parentLevel; i++) {
34
- if (!currentContext || typeof currentContext !== "object") {
35
- throw new Error((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.CONTEXT_NOT_OBJECT_COMPARISON, i + 1, path));
36
- }
37
- if (!currentContext[constants_1.VALIDATION_PARENT_KEY]) {
38
- throw new Error((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.NO_PARENT_COMPARISON, i + 1, path));
39
- }
40
- currentContext = currentContext[constants_1.VALIDATION_PARENT_KEY];
41
- }
42
- // Process dot notation path
43
- const parts = cleanPath.split(".");
44
- let currentValue = currentContext;
45
- for (const part of parts) {
46
- if (currentValue !== null &&
47
- typeof currentValue === "object" &&
48
- part in currentValue) {
49
- currentValue = currentValue[part];
50
- }
51
- else {
52
- const errorMsgTemplate = parentLevel === 0
53
- ? constants_2.COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND
54
- : parentLevel === 1
55
- ? constants_2.COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_ON_PARENT
56
- : constants_2.COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_AFTER_PARENT;
57
- throw new Error((0, strings_1.sf)(errorMsgTemplate, path, part, parentLevel));
58
- }
59
- }
60
- return currentValue;
61
- }
7
+ const utils_1 = require("./../../utils/index.cjs");
8
+ // /**
9
+ // * Safely retrieves a nested property value from an object using a dot-notated path string.
10
+ // *
11
+ // * @template T - The expected return type of the property value.
12
+ // *
13
+ // * @param {Record<string, any>} obj - The source object to retrieve the value from.
14
+ // * @param {string} path - A dot-separated string representing the path to the desired property (e.g., "user.address.street").
15
+ // *
16
+ // * @returns {T} - The value found at the specified path
17
+ // *
18
+ // * @throws {Error} - Throws an error if the path is not a non-empty string or if any part of the path does not exist in the object.
19
+ // * @memberOf module:decorator-validation
20
+ // */
21
+ // export function getValueByPath<T>(obj: Record<string, any>, path: string): T {
22
+ // if (typeof path !== "string" || !path.trim()) {
23
+ // throw new Error(sf(COMPARISON_ERROR_MESSAGES.INVALID_PATH, path));
24
+ // }
25
+ //
26
+ // // Process parent directory access (../)
27
+ // const parentAccessors = path.match(/\.\.\//g) || [];
28
+ // const parentLevel = parentAccessors.length;
29
+ // const cleanPath = path.replace(/\.\.\//g, "");
30
+ //
31
+ // // Navigate up the parent chain
32
+ // let currentContext: any = obj;
33
+ // for (let i = 0; i < parentLevel; i++) {
34
+ // if (!currentContext || typeof currentContext !== "object") {
35
+ // throw new Error(
36
+ // sf(COMPARISON_ERROR_MESSAGES.CONTEXT_NOT_OBJECT_COMPARISON, i + 1, path)
37
+ // );
38
+ // }
39
+ //
40
+ // if (!currentContext[VALIDATION_PARENT_KEY]) {
41
+ // throw new Error(
42
+ // sf(COMPARISON_ERROR_MESSAGES.NO_PARENT_COMPARISON, i + 1, path)
43
+ // );
44
+ // }
45
+ //
46
+ // currentContext = currentContext[VALIDATION_PARENT_KEY];
47
+ // }
48
+ //
49
+ // // Process dot notation path
50
+ // const parts = cleanPath.split(".");
51
+ // let currentValue: any = currentContext;
52
+ //
53
+ // for (const part of parts) {
54
+ // if (
55
+ // currentValue !== null &&
56
+ // typeof currentValue === "object" &&
57
+ // part in currentValue
58
+ // ) {
59
+ // currentValue = (currentValue as Record<string, any>)[part];
60
+ // } else {
61
+ // const errorMsgTemplate =
62
+ // parentLevel === 0
63
+ // ? COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND
64
+ // : parentLevel === 1
65
+ // ? COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_ON_PARENT
66
+ // : COMPARISON_ERROR_MESSAGES.PROPERTY_NOT_FOUND_AFTER_PARENT;
67
+ //
68
+ // throw new Error(sf(errorMsgTemplate, path, part, parentLevel));
69
+ // }
70
+ // }
71
+ //
72
+ // return currentValue as T;
73
+ // }
62
74
  const getTypeName = (value) => {
63
75
  if (value === null)
64
76
  return "null";
@@ -100,7 +112,7 @@ const isSupported = (value) => {
100
112
  function isValidForGteOrLteComparison(a, b) {
101
113
  if (isSupported(a) && isSupported(b))
102
114
  return true;
103
- throw new TypeError((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
115
+ throw new TypeError((0, utils_1.sf)(constants_1.COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
104
116
  }
105
117
  /**
106
118
  * @summary Compares two values to determine if the first is less than the second.
@@ -117,7 +129,7 @@ function isValidForGteOrLteComparison(a, b) {
117
129
  */
118
130
  function isLessThan(a, b) {
119
131
  if ([null, undefined].includes(a) || [null, undefined].includes(b))
120
- throw new Error(constants_2.COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
132
+ throw new Error(constants_1.COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
121
133
  // Validate type compatibility
122
134
  const aType = typeof a;
123
135
  const bType = typeof b;
@@ -127,20 +139,20 @@ function isLessThan(a, b) {
127
139
  return Number(a) < b;
128
140
  if (aType === "number" && bType === "bigint")
129
141
  return a < Number(b);
130
- throw new TypeError((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
142
+ throw new TypeError((0, utils_1.sf)(constants_1.COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
131
143
  }
132
144
  if ((aType === "number" && bType === "number") ||
133
145
  (aType === "bigint" && bType === "bigint")) {
134
146
  if (Number.isNaN(a) || Number.isNaN(b))
135
- throw new TypeError(constants_2.COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
147
+ throw new TypeError(constants_1.COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
136
148
  return a < b;
137
149
  }
138
150
  if (a instanceof Date && b instanceof Date) {
139
151
  if (isNaN(a.getTime()) || isNaN(b.getTime()))
140
- throw new TypeError(constants_2.COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
152
+ throw new TypeError(constants_1.COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
141
153
  return a.getTime() < b.getTime();
142
154
  }
143
- throw new TypeError((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
155
+ throw new TypeError((0, utils_1.sf)(constants_1.COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
144
156
  }
145
157
  /**
146
158
  * Checks if `a` is greater than `b`.
@@ -157,7 +169,7 @@ function isLessThan(a, b) {
157
169
  */
158
170
  function isGreaterThan(a, b) {
159
171
  if ([null, undefined].includes(a) || [null, undefined].includes(b))
160
- throw new Error(constants_2.COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
172
+ throw new Error(constants_1.COMPARISON_ERROR_MESSAGES.NULL_OR_UNDEFINED_COMPARISON);
161
173
  const aType = typeof a;
162
174
  const bType = typeof b;
163
175
  if (aType !== bType) {
@@ -166,19 +178,19 @@ function isGreaterThan(a, b) {
166
178
  return Number(a) > b;
167
179
  if (aType === "number" && bType === "bigint")
168
180
  return a > Number(b);
169
- throw new Error((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
181
+ throw new Error((0, utils_1.sf)(constants_1.COMPARISON_ERROR_MESSAGES.TYPE_MISMATCH_COMPARISON, aType, bType));
170
182
  }
171
183
  if ((aType === "number" && bType === "number") ||
172
184
  (aType === "bigint" && bType === "bigint")) {
173
185
  if (Number.isNaN(a) || Number.isNaN(b))
174
- throw new TypeError(constants_2.COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
186
+ throw new TypeError(constants_1.COMPARISON_ERROR_MESSAGES.NAN_COMPARISON);
175
187
  return a > b;
176
188
  }
177
189
  if (a instanceof Date && b instanceof Date) {
178
190
  if (isNaN(a.getTime()) || isNaN(b.getTime()))
179
- throw new TypeError(constants_2.COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
191
+ throw new TypeError(constants_1.COMPARISON_ERROR_MESSAGES.INVALID_DATE_COMPARISON);
180
192
  return a.getTime() > b.getTime();
181
193
  }
182
- throw new TypeError((0, strings_1.sf)(constants_2.COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
194
+ throw new TypeError((0, utils_1.sf)(constants_1.COMPARISON_ERROR_MESSAGES.UNSUPPORTED_TYPES_COMPARISON, getTypeName(a), getTypeName(b)));
183
195
  }
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUJBLHdDQW9EQztBQXNDRCxvRUFVQztBQWVELGdDQXlDQztBQWVELHNDQXdDQztBQXBPRCwyREFBd0Q7QUFDeEQsdURBQXlDO0FBQ3pDLCtDQUF3RDtBQUV4RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixjQUFjLENBQUksR0FBd0IsRUFBRSxJQUFZO0lBQ3RFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFBLFlBQUUsRUFBQyxxQ0FBeUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFOUMsK0JBQStCO0lBQy9CLElBQUksY0FBYyxHQUFRLEdBQUcsQ0FBQztJQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksS0FBSyxDQUNiLElBQUEsWUFBRSxFQUFDLHFDQUF5QixDQUFDLDZCQUE2QixFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENB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QUxJREFUSU9OX1BBUkVOVF9LRVkgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogU2FmZWx5IHJldHJpZXZlcyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBhIGRvdC1ub3RhdGVkIHBhdGggc3RyaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgZGVzaXJlZCBwcm9wZXJ0eSAoZS5nLiwgXCJ1c2VyLmFkZHJlc3Muc3RyZWV0XCIpLlxuICpcbiAqIEByZXR1cm5zIHtUfSAtIFRoZSB2YWx1ZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGhcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhdGggaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb2JqZWN0LlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGg8VD4ob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBUIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiIHx8ICFwYXRoLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfUEFUSCwgcGF0aCkpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBwYXJlbnQgZGlyZWN0b3J5IGFjY2VzcyAoLi4vKVxuICBjb25zdCBwYXJlbnRBY2Nlc3NvcnMgPSBwYXRoLm1hdGNoKC9cXC5cXC5cXC8vZykgfHwgW107XG4gIGNvbnN0IHBhcmVudExldmVsID0gcGFyZW50QWNjZXNzb3JzLmxlbmd0aDtcbiAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5cXC5cXC8vZywgXCJcIik7XG5cbiAgLy8gTmF2aWdhdGUgdXAgdGhlIHBhcmVudCBjaGFpblxuICBsZXQgY3VycmVudENvbnRleHQ6IGFueSA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRMZXZlbDsgaSsrKSB7XG4gICAgaWYgKCFjdXJyZW50Q29udGV4dCB8fCB0eXBlb2YgY3VycmVudENvbnRleHQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5DT05URVhUX05PVF9PQkpFQ1RfQ09NUEFSSVNPTiwgaSArIDEsIHBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY3VycmVudENvbnRleHRbVkFMSURBVElPTl9QQVJFTlRfS0VZXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5PX1BBUkVOVF9DT01QQVJJU09OLCBpICsgMSwgcGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dFtWQUxJREFUSU9OX1BBUkVOVF9LRVldO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBkb3Qgbm90YXRpb24gcGF0aFxuICBjb25zdCBwYXJ0cyA9IGNsZWFuUGF0aC5zcGxpdChcIi5cIik7XG4gIGxldCBjdXJyZW50VmFsdWU6IGFueSA9IGN1cnJlbnRDb250ZXh0O1xuXG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgcGFydCBpbiBjdXJyZW50VmFsdWVcbiAgICApIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcGFydF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnVGVtcGxhdGUgPVxuICAgICAgICBwYXJlbnRMZXZlbCA9PT0gMFxuICAgICAgICAgID8gQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRk9VTkRcbiAgICAgICAgICA6IHBhcmVudExldmVsID09PSAxXG4gICAgICAgICAgICA/IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0ZPVU5EX09OX1BBUkVOVFxuICAgICAgICAgICAgOiBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9GT1VORF9BRlRFUl9QQVJFTlQ7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihzZihlcnJvck1zZ1RlbXBsYXRlLCBwYXRoLCBwYXJ0LCBwYXJlbnRMZXZlbCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjdXJyZW50VmFsdWUgYXMgVDtcbn1cblxuY29uc3QgZ2V0VHlwZU5hbWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBcIm51bGxcIjtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIFwiRGF0ZVwiO1xuICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuIFwiTmFOXCI7XG4gIGlmICh2YWx1ZSA9PT0gSW5maW5pdHkpIHJldHVybiBcIkluZmluaXR5XCI7XG4gIGlmICh2YWx1ZSA9PT0gLUluZmluaXR5KSByZXR1cm4gXCItSW5maW5pdHlcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gXCJhcnJheVwiO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlO1xufTtcblxuY29uc3QgaXNTdXBwb3J0ZWQgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB1bmRlZmluZWQgfCBudW1iZXIgfCBiaWdpbnQgfCBEYXRlID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBOdW1iZXJzIG11c3QgYmUgZmluaXRlIChleGNsdWRlcyBOYU4sIEluZmluaXR5LCAtSW5maW5pdHkpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdHdvIHZhbHVlcyBhcmUgZWxpZ2libGUgZm9yIGNvbXBhcmlzb24gdXNpbmcgPj0gb3IgPD0gb3BlcmF0b3JzLlxuICpcbiAqIFN1cHBvcnRlZCB0eXBlczogYHVuZGVmaW5lZGAsIGBudW1iZXJgLCBgYmlnaW50YCwgYW5kIGBEYXRlYC5cbiAqXG4gKiBAcGFyYW0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm90aCB2YWx1ZXMgYXJlIG9mIHN1cHBvcnRlZCB0eXBlcy5cbiAqXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGVpdGhlciB2YWx1ZSBpcyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEZvckd0ZU9yTHRlQ29tcGFyaXNvbihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBwb3J0ZWQoYSkgJiYgaXNTdXBwb3J0ZWQoYikpIHJldHVybiB0cnVlO1xuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IENvbXBhcmVzIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqIEBkZXNjcmlwdGlvbiBTdXBwb3J0cyBudW1iZXJzIGFuZCBkYXRlcy4gVGhyb3dzIGFuIGVycm9yIGZvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFRoZSBmaXJzdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHthbnl9IGIgLSBUaGUgc2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgYWAgaXMgbGVzcyB0aGFuIGBiYCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgYGFgIG9yIGBiYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHZhbHVlcyBhcmUgb2YgbWlzbWF0Y2hlZCBvciB1bnN1cHBvcnRlZCB0eXBlcy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGVzc1RoYW4oYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGEpIHx8IFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKGIpKVxuICAgIHRocm93IG5ldyBFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5VTExfT1JfVU5ERUZJTkVEX0NPTVBBUklTT04pO1xuXG4gIC8vIFZhbGlkYXRlIHR5cGUgY29tcGF0aWJpbGl0eVxuICBjb25zdCBhVHlwZSA9IHR5cGVvZiBhO1xuICBjb25zdCBiVHlwZSA9IHR5cGVvZiBiO1xuXG4gIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAvLyBBbGxvdyBudW1iZXIgWCBiaWdpbnRcbiAgICBpZiAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyKGEpIDwgKGIgYXMgbnVtYmVyKTtcbiAgICBpZiAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICByZXR1cm4gKGEgYXMgbnVtYmVyKSA8IE51bWJlcihiKTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5UWVBFX01JU01BVENIX0NPTVBBUklTT04sIGFUeXBlLCBiVHlwZSlcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIikgfHxcbiAgICAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4oYSkgfHwgTnVtYmVyLmlzTmFOKGIpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5BTl9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYSA8IGI7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4oYS5nZXRUaW1lKCkpIHx8IGlzTmFOKGIuZ2V0VGltZSgpKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX0RBVEVfQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpIDwgYi5nZXRUaW1lKCk7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmAuXG4gKiBTdXBwb3J0cyBjb21wYXJpc29uIGZvciBudW1iZXJzIGFuZCBEYXRlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHthbnl9IGEgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0ge2FueX0gYiAtIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYGFgIGlzIGdyZWF0ZXIgdGhhbiBgYmAsIG90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIGBhYCBvciBgYmAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB2YWx1ZXMgYXJlIG9mIG1pc21hdGNoZWQgb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dyZWF0ZXJUaGFuKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhKSB8fCBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhiKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OKTtcblxuICBjb25zdCBhVHlwZSA9IHR5cGVvZiBhO1xuICBjb25zdCBiVHlwZSA9IHR5cGVvZiBiO1xuXG4gIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAvLyBBbGxvdyBudW1iZXIgWCBiaWdpbnRcbiAgICBpZiAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gTnVtYmVyKGEpID4gKGIgYXMgbnVtYmVyKTtcbiAgICBpZiAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICByZXR1cm4gKGEgYXMgbnVtYmVyKSA+IE51bWJlcihiKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlRZUEVfTUlTTUFUQ0hfQ09NUEFSSVNPTiwgYVR5cGUsIGJUeXBlKVxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKSB8fFxuICAgIChhVHlwZSA9PT0gXCJiaWdpbnRcIiAmJiBiVHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgKSB7XG4gICAgaWYgKE51bWJlci5pc05hTihhKSB8fCBOdW1iZXIuaXNOYU4oYikpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTkFOX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhID4gYjtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGlmIChpc05hTihhLmdldFRpbWUoKSkgfHwgaXNOYU4oYi5nZXRUaW1lKCkpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfREFURV9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPiBiLmdldFRpbWUoKTtcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgc2YoXG4gICAgICBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlVOU1VQUE9SVEVEX1RZUEVTX0NPTVBBUklTT04sXG4gICAgICBnZXRUeXBlTmFtZShhKSxcbiAgICAgIGdldFR5cGVOYW1lKGIpXG4gICAgKVxuICApO1xufVxuIl19
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEdBLG9FQVVDO0FBZUQsZ0NBeUNDO0FBZUQsc0NBd0NDO0FBbk9ELDJEQUE0RDtBQUM1RCxtREFBaUM7QUFFakMsTUFBTTtBQUNOLDhGQUE4RjtBQUM5RixLQUFLO0FBQ0wsbUVBQW1FO0FBQ25FLEtBQUs7QUFDTCxzRkFBc0Y7QUFDdEYsZ0lBQWdJO0FBQ2hJLEtBQUs7QUFDTCwwREFBMEQ7QUFDMUQsS0FBSztBQUNMLHNJQUFzSTtBQUN0SSwyQ0FBMkM7QUFDM0MsTUFBTTtBQUNOLGlGQUFpRjtBQUNqRixvREFBb0Q7QUFDcEQseUVBQXlFO0FBQ3pFLE1BQU07QUFDTixFQUFFO0FBQ0YsNkNBQTZDO0FBQzdDLHlEQUF5RDtBQUN6RCxnREFBZ0Q7QUFDaEQsbURBQW1EO0FBQ25ELEVBQUU7QUFDRixvQ0FBb0M7QUFDcEMsbUNBQW1DO0FBQ25DLDRDQUE0QztBQUM1QyxtRUFBbUU7QUFDbkUseUJBQXlCO0FBQ3pCLG1GQUFtRjtBQUNuRixXQUFXO0FBQ1gsUUFBUTtBQUNSLEVBQUU7QUFDRixvREFBb0Q7QUFDcEQseUJBQXlCO0FBQ3pCLDBFQUEwRTtBQUMxRSxXQUFXO0FBQ1gsUUFBUTtBQUNSLEVBQUU7QUFDRiw4REFBOEQ7QUFDOUQsTUFBTTtBQUNOLEVBQUU7QUFDRixpQ0FBaUM7QUFDakMsd0NBQXdDO0FBQ3hDLDRDQUE0QztBQUM1QyxFQUFFO0FBQ0YsZ0NBQWdDO0FBQ2hDLFdBQVc7QUFDWCxpQ0FBaUM7QUFDakMsNENBQTRDO0FBQzVDLDZCQUE2QjtBQUM3QixVQUFVO0FBQ1Ysb0VBQW9FO0FBQ3BFLGVBQWU7QUFDZixpQ0FBaUM7QUFDakMsNEJBQTRCO0FBQzVCLDJEQUEyRDtBQUMzRCxnQ0FBZ0M7QUFDaEMsdUVBQXVFO0FBQ3ZFLDJFQUEyRTtBQUMz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Q0FBeUIsQ0FBQyw0QkFBNEIsRUFDdEQsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUNkLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8vIC8qKlxuLy8gICogU2FmZWx5IHJldHJpZXZlcyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBhIGRvdC1ub3RhdGVkIHBhdGggc3RyaW5nLlxuLy8gICpcbi8vICAqIEB0ZW1wbGF0ZSBUIC0gVGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbi8vICAqXG4vLyAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iaiAtIFRoZSBzb3VyY2Ugb2JqZWN0IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tLlxuLy8gICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBBIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGUgZGVzaXJlZCBwcm9wZXJ0eSAoZS5nLiwgXCJ1c2VyLmFkZHJlc3Muc3RyZWV0XCIpLlxuLy8gICpcbi8vICAqIEByZXR1cm5zIHtUfSAtIFRoZSB2YWx1ZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIHBhdGhcbi8vICAqXG4vLyAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhdGggaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgb2JqZWN0LlxuLy8gICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuLy8gICovXG4vLyBleHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGg8VD4ob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBUIHtcbi8vICAgaWYgKHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiIHx8ICFwYXRoLnRyaW0oKSkge1xuLy8gICAgIHRocm93IG5ldyBFcnJvcihzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLklOVkFMSURfUEFUSCwgcGF0aCkpO1xuLy8gICB9XG4vL1xuLy8gICAvLyBQcm9jZXNzIHBhcmVudCBkaXJlY3RvcnkgYWNjZXNzICguLi8pXG4vLyAgIGNvbnN0IHBhcmVudEFjY2Vzc29ycyA9IHBhdGgubWF0Y2goL1xcLlxcLlxcLy9nKSB8fCBbXTtcbi8vICAgY29uc3QgcGFyZW50TGV2ZWwgPSBwYXJlbnRBY2Nlc3NvcnMubGVuZ3RoO1xuLy8gICBjb25zdCBjbGVhblBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLlxcLlxcLy9nLCBcIlwiKTtcbi8vXG4vLyAgIC8vIE5hdmlnYXRlIHVwIHRoZSBwYXJlbnQgY2hhaW5cbi8vICAgbGV0IGN1cnJlbnRDb250ZXh0OiBhbnkgPSBvYmo7XG4vLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50TGV2ZWw7IGkrKykge1xuLy8gICAgIGlmICghY3VycmVudENvbnRleHQgfHwgdHlwZW9mIGN1cnJlbnRDb250ZXh0ICE9PSBcIm9iamVjdFwiKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuQ09OVEVYVF9OT1RfT0JKRUNUX0NPTVBBUklTT04sIGkgKyAxLCBwYXRoKVxuLy8gICAgICAgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIGlmICghY3VycmVudENvbnRleHRbVkFMSURBVElPTl9QQVJFTlRfS0VZXSkge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFxuLy8gICAgICAgICBzZihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5PX1BBUkVOVF9DT01QQVJJU09OLCBpICsgMSwgcGF0aClcbi8vICAgICAgICk7XG4vLyAgICAgfVxuLy9cbi8vICAgICBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRDb250ZXh0W1ZBTElEQVRJT05fUEFSRU5UX0tFWV07XG4vLyAgIH1cbi8vXG4vLyAgIC8vIFByb2Nlc3MgZG90IG5vdGF0aW9uIHBhdGhcbi8vICAgY29uc3QgcGFydHMgPSBjbGVhblBhdGguc3BsaXQoXCIuXCIpO1xuLy8gICBsZXQgY3VycmVudFZhbHVlOiBhbnkgPSBjdXJyZW50Q29udGV4dDtcbi8vXG4vLyAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuLy8gICAgIGlmIChcbi8vICAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuLy8gICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuLy8gICAgICAgcGFydCBpbiBjdXJyZW50VmFsdWVcbi8vICAgICApIHtcbi8vICAgICAgIGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50VmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PilbcGFydF07XG4vLyAgICAgfSBlbHNlIHtcbi8vICAgICAgIGNvbnN0IGVycm9yTXNnVGVtcGxhdGUgPVxuLy8gICAgICAgICBwYXJlbnRMZXZlbCA9PT0gMFxuLy8gICAgICAgICAgID8gQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5QUk9QRVJUWV9OT1RfRk9VTkRcbi8vICAgICAgICAgICA6IHBhcmVudExldmVsID09PSAxXG4vLyAgICAgICAgICAgICA/IENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuUFJPUEVSVFlfTk9UX0ZPVU5EX09OX1BBUkVOVFxuLy8gICAgICAgICAgICAgOiBDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLlBST1BFUlRZX05PVF9GT1VORF9BRlRFUl9QQVJFTlQ7XG4vL1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKHNmKGVycm9yTXNnVGVtcGxhdGUsIHBhdGgsIHBhcnQsIHBhcmVudExldmVsKSk7XG4vLyAgICAgfVxuLy8gICB9XG4vL1xuLy8gICByZXR1cm4gY3VycmVudFZhbHVlIGFzIFQ7XG4vLyB9XG5cbmNvbnN0IGdldFR5cGVOYW1lID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBcIkRhdGVcIjtcbiAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiBcIk5hTlwiO1xuICBpZiAodmFsdWUgPT09IEluZmluaXR5KSByZXR1cm4gXCJJbmZpbml0eVwiO1xuICBpZiAodmFsdWUgPT09IC1JbmZpbml0eSkgcmV0dXJuIFwiLUluZmluaXR5XCI7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFwiYXJyYXlcIjtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZTtcbn07XG5cbmNvbnN0IGlzU3VwcG9ydGVkID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgdW5kZWZpbmVkIHwgbnVtYmVyIHwgYmlnaW50IHwgRGF0ZSA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHRydWU7XG5cbiAgLy8gTnVtYmVycyBtdXN0IGJlIGZpbml0ZSAoZXhjbHVkZXMgTmFOLCBJbmZpbml0eSwgLUluZmluaXR5KVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHR3byB2YWx1ZXMgYXJlIGVsaWdpYmxlIGZvciBjb21wYXJpc29uIHVzaW5nID49IG9yIDw9IG9wZXJhdG9ycy5cbiAqXG4gKiBTdXBwb3J0ZWQgdHlwZXM6IGB1bmRlZmluZWRgLCBgbnVtYmVyYCwgYGJpZ2ludGAsIGFuZCBgRGF0ZWAuXG4gKlxuICogQHBhcmFtIGEgLSBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBiIC0gVGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGJvdGggdmFsdWVzIGFyZSBvZiBzdXBwb3J0ZWQgdHlwZXMuXG4gKlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBlaXRoZXIgdmFsdWUgaXMgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRGb3JHdGVPckx0ZUNvbXBhcmlzb24oYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwcG9ydGVkKGEpICYmIGlzU3VwcG9ydGVkKGIpKSByZXR1cm4gdHJ1ZTtcblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBDb21wYXJlcyB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGUgZmlyc3QgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXG4gKiBAZGVzY3JpcHRpb24gU3VwcG9ydHMgbnVtYmVycyBhbmQgZGF0ZXMuIFRocm93cyBhbiBlcnJvciBmb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHthbnl9IGEgLSBUaGUgZmlyc3QgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7YW55fSBiIC0gVGhlIHNlY29uZCB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYGFgIGlzIGxlc3MgdGhhbiBgYmAsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZWl0aGVyIGBhYCBvciBgYmAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB2YWx1ZXMgYXJlIG9mIG1pc21hdGNoZWQgb3IgdW5zdXBwb3J0ZWQgdHlwZXMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xlc3NUaGFuKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhKSB8fCBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhiKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OVUxMX09SX1VOREVGSU5FRF9DT01QQVJJU09OKTtcblxuICAvLyBWYWxpZGF0ZSB0eXBlIGNvbXBhdGliaWxpdHlcbiAgY29uc3QgYVR5cGUgPSB0eXBlb2YgYTtcbiAgY29uc3QgYlR5cGUgPSB0eXBlb2YgYjtcblxuICBpZiAoYVR5cGUgIT09IGJUeXBlKSB7XG4gICAgLy8gQWxsb3cgbnVtYmVyIFggYmlnaW50XG4gICAgaWYgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIE51bWJlcihhKSA8IChiIGFzIG51bWJlcik7XG4gICAgaWYgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgcmV0dXJuIChhIGFzIG51bWJlcikgPCBOdW1iZXIoYik7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIHNmKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVFlQRV9NSVNNQVRDSF9DT01QQVJJU09OLCBhVHlwZSwgYlR5cGUpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoYVR5cGUgPT09IFwibnVtYmVyXCIgJiYgYlR5cGUgPT09IFwibnVtYmVyXCIpIHx8XG4gICAgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICApIHtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGEpIHx8IE51bWJlci5pc05hTihiKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5OQU5fQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEgPCBiO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgaWYgKGlzTmFOKGEuZ2V0VGltZSgpKSB8fCBpc05hTihiLmdldFRpbWUoKSkpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuSU5WQUxJRF9EQVRFX0NPTVBBUklTT04pO1xuICAgIHJldHVybiBhLmdldFRpbWUoKSA8IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBzZihcbiAgICAgIENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuVU5TVVBQT1JURURfVFlQRVNfQ09NUEFSSVNPTixcbiAgICAgIGdldFR5cGVOYW1lKGEpLFxuICAgICAgZ2V0VHlwZU5hbWUoYilcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBhYCBpcyBncmVhdGVyIHRoYW4gYGJgLlxuICogU3VwcG9ydHMgY29tcGFyaXNvbiBmb3IgbnVtYmVycyBhbmQgRGF0ZSBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBhIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIHthbnl9IGIgLSBUaGUgdmFsdWUgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGBhYCBpcyBncmVhdGVyIHRoYW4gYGJgLCBvdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIGVpdGhlciBgYWAgb3IgYGJgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdmFsdWVzIGFyZSBvZiBtaXNtYXRjaGVkIG9yIHVuc3VwcG9ydGVkIHR5cGVzLlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmVhdGVyVGhhbihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYSkgfHwgW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYikpXG4gICAgdGhyb3cgbmV3IEVycm9yKENPTVBBUklTT05fRVJST1JfTUVTU0FHRVMuTlVMTF9PUl9VTkRFRklORURfQ09NUEFSSVNPTik7XG5cbiAgY29uc3QgYVR5cGUgPSB0eXBlb2YgYTtcbiAgY29uc3QgYlR5cGUgPSB0eXBlb2YgYjtcblxuICBpZiAoYVR5cGUgIT09IGJUeXBlKSB7XG4gICAgLy8gQWxsb3cgbnVtYmVyIFggYmlnaW50XG4gICAgaWYgKGFUeXBlID09PSBcImJpZ2ludFwiICYmIGJUeXBlID09PSBcIm51bWJlclwiKVxuICAgICAgcmV0dXJuIE51bWJlcihhKSA+IChiIGFzIG51bWJlcik7XG4gICAgaWYgKGFUeXBlID09PSBcIm51bWJlclwiICYmIGJUeXBlID09PSBcImJpZ2ludFwiKVxuICAgICAgcmV0dXJuIChhIGFzIG51bWJlcikgPiBOdW1iZXIoYik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgc2YoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5UWVBFX01JU01BVENIX0NPTVBBUklTT04sIGFUeXBlLCBiVHlwZSlcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIChhVHlwZSA9PT0gXCJudW1iZXJcIiAmJiBiVHlwZSA9PT0gXCJudW1iZXJcIikgfHxcbiAgICAoYVR5cGUgPT09IFwiYmlnaW50XCIgJiYgYlR5cGUgPT09IFwiYmlnaW50XCIpXG4gICkge1xuICAgIGlmIChOdW1iZXIuaXNOYU4oYSkgfHwgTnVtYmVyLmlzTmFOKGIpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihDT01QQVJJU09OX0VSUk9SX01FU1NBR0VTLk5BTl9DT01QQVJJU09OKTtcbiAgICByZXR1cm4gYSA+IGI7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4oYS5nZXRUaW1lKCkpIHx8IGlzTmFOKGIuZ2V0VGltZSgpKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5JTlZBTElEX0RBVEVfQ09NUEFSSVNPTik7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpID4gYi5nZXRUaW1lKCk7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIHNmKFxuICAgICAgQ09NUEFSSVNPTl9FUlJPUl9NRVNTQUdFUy5VTlNVUFBPUlRFRF9UWVBFU19DT01QQVJJU09OLFxuICAgICAgZ2V0VHlwZU5hbWUoYSksXG4gICAgICBnZXRUeXBlTmFtZShiKVxuICAgIClcbiAgKTtcbn1cbiJdfQ==
@@ -1,17 +1,3 @@
1
- /**
2
- * Safely retrieves a nested property value from an object using a dot-notated path string.
3
- *
4
- * @template T - The expected return type of the property value.
5
- *
6
- * @param {Record<string, any>} obj - The source object to retrieve the value from.
7
- * @param {string} path - A dot-separated string representing the path to the desired property (e.g., "user.address.street").
8
- *
9
- * @returns {T} - The value found at the specified path
10
- *
11
- * @throws {Error} - Throws an error if the path is not a non-empty string or if any part of the path does not exist in the object.
12
- * @memberOf module:decorator-validation
13
- */
14
- export declare function getValueByPath<T>(obj: Record<string, any>, path: string): T;
15
1
  /**
16
2
  * Validates whether two values are eligible for comparison using >= or <= operators.
17
3
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/decorator-validation",
3
- "version": "1.7.3",
3
+ "version": "1.7.4",
4
4
  "description": "simple decorator based validation engine",
5
5
  "type": "module",
6
6
  "exports": {
@@ -60,7 +60,7 @@
60
60
  "ts"
61
61
  ],
62
62
  "author": "Tiago Venceslau",
63
- "license": "LGPL-3.0-or-later",
63
+ "license": "MIT",
64
64
  "bugs": {
65
65
  "url": "https://github.com/decaf-ts/decorator-validation/issues"
66
66
  },