@sot1986/appsync-precognition 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,45 +1,30 @@
1
1
  import { Context } from "@aws-appsync/utils";
2
2
 
3
- //#region rolldown:runtime
4
- //#endregion
5
3
  //#region src/types.d.ts
6
4
  interface Rule<T = unknown> {
7
5
  check: boolean;
8
6
  message: string;
9
7
  value: T;
10
8
  }
11
- type ShortRule<T extends string> = T | `${T}:${string}`;
9
+ type FullRule = "required" | "nullable" | "sometimes" | "number" | "boolean" | "string" | "array" | "object" | "date" | ["min", number] | ["max", number] | ["between", number, number] | "email" | "url" | "uuid" | "ulid" | ["regex", string] | ["in", ...(string | number | boolean | null)[]] | ["notIn", ...(string | number | boolean | null)[]] | ["after", string] | ["before", string] | ["afterOrEqual", string] | ["beforeOrEqual", string];
12
10
  type ArrayKeys<T extends unknown[]> = T extends [unknown, ...unknown[]] ? T extends Record<infer Index, unknown> ? Index extends `${number}` ? Index : never : never : `${number}`;
13
11
  type ObjectKeys<T extends object> = T extends unknown[] ? ArrayKeys<T> : keyof T & string;
14
12
  interface HasConstructor {
15
13
  new (...args: unknown[]): unknown;
16
14
  }
17
15
  type NestedKeyOf<T> = T extends Record<infer Key, unknown> ? T extends HasConstructor ? never : T extends CallableFunction ? never : Key extends string | number ? (ObjectKeys<T> | (T[Key] extends object ? `${ObjectKeys<Pick<T, Key>>}.${NestedKeyOf<T[Key]>}` : T extends unknown[] ? T extends [unknown, ...unknown[]] ? never : T[number] extends object ? `${number}.${NestedKeyOf<T[number]>}` : never : never)) : never : never;
18
- declare namespace rules_d_exports {
19
- export { names, parse, requiredRule };
20
- }
21
- declare const names: {
22
- readonly required: "required";
23
- readonly nullable: "nullable";
24
- readonly sometimes: "sometimes";
25
- readonly min: "min";
26
- readonly max: "max";
27
- readonly between: "between";
28
- readonly email: "email";
29
- readonly url: "url";
30
- readonly uuid: "uuid";
31
- readonly regex: "regex";
32
- readonly in: "in";
33
- readonly notIn: "notIn";
34
- readonly before: "before";
35
- readonly after: "after";
36
- };
37
- declare function parse<T>(value: T, rule: ShortRule<keyof typeof names>): Rule<T>;
38
- declare function requiredRule<T>(value: T, ..._params: string[]): Rule<T>;
39
16
  //#endregion
40
17
  //#region src/index.d.ts
41
- declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
42
- declare function precognition<T extends object>(ctx: Context<T>, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
18
+ declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule)[]>>, options?: {
19
+ trim?: boolean;
20
+ allowEmptyString?: boolean;
21
+ }): T;
22
+ declare function precognitiveValidation<T extends object>(ctx: Context<T>, checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule)[]>>, options?: {
23
+ trim?: boolean;
24
+ allowEmptyString?: boolean;
25
+ skipTo?: "END" | "NEXT";
26
+ }): T;
27
+ declare function formatAttributeName(path: string): string;
43
28
  //#endregion
44
- export { precognition, validate };
45
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcnVsZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7VUFFaUI7OztTQUdSOztLQUdHLDhCQUE4QixPQUFPO0tBRTVDLGlDQUNELG9DQUNFLFVBQVU7S0FPWCwrQkFDRCxzQkFDRSxVQUFVLFdBQ0o7VUFFRixjQUFBOzs7S0FJRSxpQkFBaUIsVUFBVSw2QkFDbkMsVUFBVSx5QkFFUixVQUFVLDBEQUdMLFdBQVcsTUFBTSxFQUFFLHlCQUNiLFdBQVcsS0FBSyxHQUFHLFNBQVMsWUFBWSxFQUFFLFVBQzdDLHNCQUNFLDRDQUVFLHdDQUNlLFlBQVk7Ozs7Y0NwQ2hDOzs7Ozs7Ozs7Ozs7Ozs7O2lCQWlCRyxnQkFBZ0IsU0FBUyx1QkFBdUIsU0FBUyxLQUFLO2lCQXVLOUQsdUJBQXVCLDBCQUEwQixLQUFLOzs7aUJDdEx0RCxnQ0FDVCxXQUNHLFFBQVEsT0FBTyxZQUFZLEtBQUssdUJBQXVCLDRCQUFrQixZQUNoRjtpQkEyQ2Esb0NBQ1QsUUFBUSxZQUNMLFFBQVEsT0FBTyxZQUFZLEtBQUssdUJBQXVCLDRCQUFrQixZQUNoRiJ9
29
+ export { formatAttributeName, precognitiveValidation, validate };
30
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7O1VBRWlCOztFQUFqQixPQUFpQixFQUFBLE1BQUE7RUFNakIsS0FBWSxFQUhILENBR0c7QUF1Qkw7QUFHSCxLQTFCUSxRQUFBLEdBMEJSLFVBQUEsR0FBQSxVQUFBLEdBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxTQUFBLEdBQUEsUUFBQSxHQUFBLE9BQUEsR0FBQSxRQUFBLEdBQUEsTUFBQSxHQUFBLENBQUEsS0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsS0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsU0FBQSxFQUFBLE1BQUEsRUFBQSxNQUFBLENBQUEsR0FBQSxPQUFBLEdBQUEsS0FBQSxHQUFBLE1BQUEsR0FBQSxNQUFBLEdBQUEsQ0FBQSxPQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQUEsR0FBQSxDQUFBLE1BQUEsR0FBQSxNQUFBLEdBQUEsT0FBQSxHQUFBLElBQUEsQ0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLE9BQUEsRUFBQSxHQUFBLENBQUEsTUFBQSxHQUFBLE1BQUEsR0FBQSxPQUFBLEdBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsT0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsUUFBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsY0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsZUFBQSxFQUFBLE1BQUEsQ0FBQTtLQURDLFNBRUMsQ0FBQSxVQUFBLE9BQUEsRUFBQSxDQUFBLEdBREYsQ0FDRSxTQUFBLENBQUEsT0FBQSxFQUFBLEdBQUEsT0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLFNBQVUsTUFBVixDQUFBLEtBQUEsTUFBQSxFQUFBLE9BQUEsQ0FBQSxHQUFBLEtBQUEsU0FBQSxHQUFBLE1BQUEsRUFBQSxHQUFBLEtBQUEsR0FBQSxLQUFBLEdBQUEsS0FBQSxHQUFBLEdBQUEsTUFBQSxFQUFBO0tBT0QsVUFQVyxDQUFBLFVBQUEsTUFBQSxDQUFBLEdBUVosQ0FSWSxTQUFBLE9BQUEsRUFBQSxHQVNWLFNBVFUsQ0FTQSxDQVRBLENBQUEsR0FBQSxNQVVKLENBVkksR0FBQSxNQUFBO1VBWU4sY0FBQSxDQVpNO0VBQUEsS0FPWCxHQUFBLElBQUEsRUFBQSxPQUFBLEVBQUEsQ0FBQSxFQUFBLE9BQUE7O0FBRVcsS0FPSixXQVBJLENBQUEsQ0FBQSxDQUFBLEdBT2EsQ0FQYixTQU91QixNQVB2QixDQUFBLEtBQUEsSUFBQSxFQUFBLE9BQUEsQ0FBQSxHQVFaLENBUlksU0FRRixjQVJFLEdBQUEsS0FBQSxHQVVWLENBVlUsU0FVQSxnQkFWQSxHQUFBLEtBQUEsR0FBQSxHQUFBLFNBQUEsTUFBQSxHQUFBLE1BQUEsR0FBQSxDQWFMLFVBYkssQ0FhTSxDQWJOLENBQUEsR0FBQSxDQWFZLENBYlosQ0FhYyxHQWJkLENBQUEsU0FBQSxNQUFBLEdBQUEsR0FjQyxVQWRELENBY1ksSUFkWixDQWNpQixDQWRqQixFQWNvQixHQWRwQixDQUFBLENBQUEsSUFjNkIsV0FkN0IsQ0FjeUMsQ0FkekMsQ0FjMkMsR0FkM0MsQ0FBQSxDQUFBLEVBQUEsR0FlRixDQWZFLFNBQUEsT0FBQSxFQUFBLEdBZ0JBLENBaEJBLFNBQUEsQ0FBQSxPQUFBLEVBQUEsR0FBQSxPQUFBLEVBQUEsQ0FBQSxHQUFBLEtBQUEsR0FrQkUsQ0FsQkYsQ0FBQSxNQUFBLENBQUEsU0FBQSxNQUFBLEdBQUEsR0FBQSxNQUFBLElBbUJpQixXQW5CakIsQ0FtQjZCLENBbkI3QixDQUFBLE1BQUEsQ0FBQSxDQUFBLEVBQUEsR0FBQSxLQUFBLEdBQUEsS0FBQSxDQUFBLENBQUEsR0FBQSxLQUFBLEdBQUEsS0FBQTs7O2lCQ3RDQSxnQ0FDVCxXQUNHLFFBQVEsT0FBTyxZQUFZLEtBQUssV0FBVyxrQkR1QjlDO0VBN0JQLElBQWlCLENBQUEsRUFBQSxPQUFBO0VBTWpCLGdCQUFZLENBQUEsRUFBQSxPQUFBO0FBdUJMLENBQUEsQ0FBQSxFQ2xCSixDRG9CRTtBQUNELGlCQzhCWSxzQkQ5QlosQ0FBQSxVQUFBLE1BQUEsQ0FBQSxDQUFBLEdBQUEsRUMrQkcsT0QvQkgsQ0MrQlcsQ0QvQlgsQ0FBQSxFQUFBLE1BQUEsRUNnQ00sT0RoQ04sQ0NnQ2MsTURoQ2QsQ0NnQ3FCLFdEaENyQixDQ2dDaUMsQ0RoQ2pDLENBQUEsRUFBQSxDQ2dDc0MsUURoQ3RDLEdDZ0NpRCxJRGhDakQsQ0FBQSxFQUFBLENBQUEsQ0FBQSxFQUFBLE9BQ1ksQ0FEWixFQUFBO0VBQ0UsSUFBQSxDQUFBLEVBQUEsT0FBQTtFQUFVLGdCQUFBLENBQUEsRUFBQSxPQUFBO0VBQUEsTUFBQSxDQUFBLEVBQUEsS0FBQSxHQUFBLE1BQUE7QUFBQSxDQUFBLENBQUEsRUNxQ2IsQ0Q5QkU7QUFDRCxpQkNxRFksbUJBQUEsQ0RyRFosSUFBQSxFQUFBLE1BQUEsQ0FBQSxFQUFBLE1BQUEifQ==
package/dist/index.js CHANGED
@@ -28,8 +28,10 @@ function precognitiveKeys(ctx) {
28
28
  const keys = getHeader("Precognition-Validate-Only", ctx);
29
29
  return keys ? keys.split(",").map((key) => key.trim()) : null;
30
30
  }
31
- function cleanString(value) {
31
+ function cleanString(value, options) {
32
+ if (options?.trim === false) return value;
32
33
  let parsed = value.trim();
34
+ if (options?.allowEmptyString) return parsed;
33
35
  if (parsed === "") parsed = null;
34
36
  return parsed;
35
37
  }
@@ -37,51 +39,61 @@ function cleanString(value) {
37
39
  //#endregion
38
40
  //#region src/rules.ts
39
41
  function parse(value, rule) {
40
- const [ruleName, params] = rule.includes(":") ? rule.split(":", 2) : [rule, ""];
41
- switch (ruleName) {
42
+ const [name, ...params] = typeof rule === "string" ? [rule, void 0] : [rule[0], ...rule.slice(1)];
43
+ switch (name) {
42
44
  case "required": return requiredRule(value);
43
45
  case "nullable": return nullableRule(value);
44
46
  case "sometimes": return sometimesRule(value);
45
- case "min": return minRule(value, ...params.split(","));
46
- case "max": return maxRule(value, ...params.split(", "));
47
- case "between": return betweenRule(value, ...params.split(", "));
47
+ case "min": return minRule(value, params[0]);
48
+ case "max": return maxRule(value, params[0]);
49
+ case "between": return betweenRule(value, params[0], params[1]);
48
50
  case "email": return emailRule(value);
49
51
  case "url": return urlRule(value);
50
52
  case "uuid": return uuidRule(value);
51
- case "regex": return regexRule(value, params);
52
- case "in": return inRule(value, ...params.split(", "));
53
+ case "ulid": return ulidRule(value);
54
+ case "regex": return regexRule(value, params[0]);
55
+ case "in": return inRule(value, ...params);
56
+ case "notIn": return notInRule(value, ...params);
57
+ case "array": return arrayRule(value);
58
+ case "object": return objectRule(value);
59
+ case "boolean": return booleanRule(value);
60
+ case "number": return numberRule(value);
61
+ case "string": return stringRule(value);
62
+ case "date": return dateRule(value);
63
+ case "before": return beforeRule(value, params[0]);
64
+ case "after": return afterRule(value, params[0]);
65
+ case "beforeOrEqual": return beforeOrEqualRule(value, params[0]);
66
+ case "afterOrEqual": return afterOrEqualRule(value, params[0]);
53
67
  default: return {
54
68
  check: false,
55
- message: `Unknown rule ${ruleName}`,
69
+ message: `Unknown rule ${name}`,
56
70
  value
57
71
  };
58
72
  }
59
73
  }
60
- function minRule(value, ...params) {
61
- const minValue = Number(params[0] ?? "0");
74
+ function minRule(value, minValue) {
62
75
  const result = {
63
76
  check: false,
64
77
  message: `:attribute must be greater than or equal to ${minValue}`,
65
78
  value
66
79
  };
67
80
  if (typeof value === "number") result.check = value >= minValue;
68
- if (typeof result.value === "string") result.check = result.value.length >= minValue;
81
+ if (typeof value === "string") result.check = value.length >= minValue;
69
82
  if (isArray(value)) {
70
83
  result.check = value.length >= minValue;
71
84
  result.message = `Array must contain at least ${minValue} elements`;
72
85
  }
73
86
  return result;
74
87
  }
75
- function maxRule(value, ...params) {
76
- const maxValue = Number(params[0] ?? "0");
88
+ function maxRule(value, maxValue) {
77
89
  const result = {
78
90
  check: false,
79
91
  message: `:attribute must be less than or equal to ${maxValue}`,
80
92
  value
81
93
  };
82
94
  if (typeof value === "number") result.check = value <= maxValue;
83
- if (typeof result.value === "string") {
84
- result.check = result.value.length <= maxValue;
95
+ if (typeof value === "string") {
96
+ result.check = value.length <= maxValue;
85
97
  result.message = `String must contain at most ${maxValue} characters`;
86
98
  }
87
99
  if (isArray(value)) {
@@ -90,17 +102,15 @@ function maxRule(value, ...params) {
90
102
  }
91
103
  return result;
92
104
  }
93
- function betweenRule(value, ...params) {
94
- const minValue = Number(params[0] ?? "0");
95
- const maxValue = Number(params[1] ?? "0");
105
+ function betweenRule(value, minValue, maxValue) {
96
106
  const result = {
97
107
  check: false,
98
108
  message: `:attribute must be between ${minValue} and ${maxValue}`,
99
109
  value
100
110
  };
101
111
  if (typeof value === "number") result.check = value >= minValue && value <= maxValue;
102
- if (typeof result.value === "string") {
103
- result.check = result.value.length >= minValue && result.value.length <= maxValue;
112
+ if (typeof value === "string") {
113
+ result.check = value.length >= minValue && value.length <= maxValue;
104
114
  result.message = `String must contain between ${minValue} and ${maxValue} characters`;
105
115
  }
106
116
  if (isArray(value)) {
@@ -115,7 +125,7 @@ function emailRule(value) {
115
125
  message: ":attribute must be a valid email address",
116
126
  value
117
127
  };
118
- if (typeof value === "string") result.check = util.matches("^[^s@]+@[^s@]+.[^s@]+$", result.value);
128
+ if (typeof value === "string") result.check = util.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", result.value);
119
129
  return result;
120
130
  }
121
131
  function urlRule(value) {
@@ -124,7 +134,7 @@ function urlRule(value) {
124
134
  message: ":attribute must be a valid URL",
125
135
  value
126
136
  };
127
- if (typeof value === "string") result.check = util.matches("^(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$", result.value);
137
+ if (typeof value === "string") result.check = util.matches("^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$|^https?:\\/\\/(localhost|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(:\\d+)?(\\/.*)?$", result.value);
128
138
  return result;
129
139
  }
130
140
  function uuidRule(value) {
@@ -133,70 +143,189 @@ function uuidRule(value) {
133
143
  message: ":attribute must be a valid UUID",
134
144
  value
135
145
  };
136
- if (typeof result.value === "string") result.check = util.matches("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", value);
146
+ if (typeof value === "string") result.check = util.matches("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", value);
147
+ return result;
148
+ }
149
+ function ulidRule(value) {
150
+ const result = {
151
+ check: false,
152
+ message: ":attribute must be a valid ULID",
153
+ value
154
+ };
155
+ if (typeof value === "string") result.check = util.matches("^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$", value);
137
156
  return result;
138
157
  }
139
- function regexRule(value, ...params) {
140
- const regex = params[0] ?? "";
158
+ function regexRule(value, pattern) {
141
159
  const result = {
142
160
  check: false,
143
161
  message: ":attribute must match the specified regular expression",
144
162
  value
145
163
  };
146
- if (typeof result.value === "string") {
147
- result.value = result.value.trim();
148
- result.check = util.matches(regex, result.value);
164
+ if (typeof value === "string") {
165
+ result.value = value.trim();
166
+ result.check = util.matches(pattern, result.value);
149
167
  }
150
168
  return result;
151
169
  }
152
170
  function inRule(value, ...params) {
153
- const result = {
154
- check: false,
171
+ return {
172
+ check: params.includes(value),
155
173
  message: ":attribute must be one of the specified values",
156
174
  value
157
175
  };
158
- if (typeof result.value === "string") result.check = params.includes(result.value);
159
- if (typeof value === "number") result.check = params.map(Number).includes(value);
160
- return result;
161
176
  }
162
- function requiredRule(value, ..._params) {
177
+ function notInRule(value, ...params) {
178
+ return {
179
+ check: !params.includes(value),
180
+ message: ":attribute must not be one of the specified values",
181
+ value
182
+ };
183
+ }
184
+ function requiredRule(value) {
163
185
  const result = {
164
186
  check: true,
165
187
  message: ":attribute is required",
166
188
  value
167
189
  };
168
- if (typeof result.value === "string") result.check = result.value.length > 0;
169
- if (isArray(result.value)) result.check = result.value.length > 0;
170
- if (typeof result.value === "number") result.check = true;
171
- if (result.check === false) result.message = ":attribute is required";
190
+ if (typeof value === "string") result.check = value.length > 0;
191
+ if (isArray(value)) result.check = value.length > 0;
192
+ if (typeof value === "number") result.check = true;
193
+ if (typeof value === "boolean") result.check = true;
194
+ if (typeof value === "object" && !result.value) {
195
+ result.message = ":attribute is not nullable";
196
+ result.check = false;
197
+ }
198
+ if (typeof value === "undefined") result.check = false;
172
199
  return result;
173
200
  }
174
- function nullableRule(value, ..._params) {
201
+ function nullableRule(value) {
175
202
  return {
176
203
  check: true,
177
204
  message: "",
178
205
  value
179
206
  };
180
207
  }
181
- function sometimesRule(value, ..._params) {
208
+ function sometimesRule(value) {
182
209
  const result = {
183
210
  check: true,
184
211
  message: "",
185
212
  value
186
213
  };
187
- if (typeof result.value === "undefined") return result;
188
- return requiredRule(value, ..._params);
214
+ if (typeof value === "undefined") return result;
215
+ if (typeof value === "object" && !result.value) {
216
+ result.message = ":attribute is not nullable";
217
+ result.check = false;
218
+ }
219
+ return requiredRule(value);
220
+ }
221
+ function arrayRule(value) {
222
+ const result = {
223
+ check: false,
224
+ message: ":attribute must be an array",
225
+ value
226
+ };
227
+ if (isArray(value)) result.check = true;
228
+ return result;
229
+ }
230
+ function objectRule(value) {
231
+ const result = {
232
+ check: false,
233
+ message: ":attribute must be an object",
234
+ value
235
+ };
236
+ if (typeof value === "object" && !isArray(result.value)) result.check = true;
237
+ return result;
238
+ }
239
+ function booleanRule(value) {
240
+ const result = {
241
+ check: false,
242
+ message: ":attribute must be a boolean",
243
+ value
244
+ };
245
+ if (typeof value === "boolean") result.check = true;
246
+ return result;
247
+ }
248
+ function numberRule(value) {
249
+ const result = {
250
+ check: false,
251
+ message: ":attribute must be a number",
252
+ value
253
+ };
254
+ if (typeof value === "number") result.check = true;
255
+ return result;
256
+ }
257
+ function stringRule(value) {
258
+ const result = {
259
+ check: false,
260
+ message: ":attribute must be a string",
261
+ value
262
+ };
263
+ if (typeof value === "string") result.check = true;
264
+ return result;
265
+ }
266
+ function dateRule(value) {
267
+ const result = {
268
+ check: false,
269
+ message: ":attribute must be a date",
270
+ value
271
+ };
272
+ if (typeof value === "string") result.check = util.matches("^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z$", result.value);
273
+ if (typeof value === "number") result.check = true;
274
+ return result;
275
+ }
276
+ function beforeRule(value, start) {
277
+ const result = {
278
+ check: false,
279
+ message: `:attribute must be before ${start}`,
280
+ value
281
+ };
282
+ const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
283
+ if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) < startValue;
284
+ if (typeof value === "number") result.check = value < startValue;
285
+ return result;
286
+ }
287
+ function afterRule(value, start) {
288
+ const result = {
289
+ check: false,
290
+ message: `:attribute must be after ${start}`,
291
+ value
292
+ };
293
+ const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
294
+ if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) > startValue;
295
+ if (typeof value === "number") result.check = value > startValue;
296
+ return result;
297
+ }
298
+ function beforeOrEqualRule(value, start) {
299
+ const result = {
300
+ check: false,
301
+ message: `:attribute must be before or equal to ${start}`,
302
+ value
303
+ };
304
+ const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
305
+ if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) <= startValue;
306
+ if (typeof value === "number") result.check = value <= startValue;
307
+ return result;
308
+ }
309
+ function afterOrEqualRule(value, start) {
310
+ const result = {
311
+ check: false,
312
+ message: `:attribute must be after or equal to ${start}`,
313
+ value
314
+ };
315
+ const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
316
+ if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) >= startValue;
317
+ if (typeof value === "number") result.check = value >= startValue;
318
+ return result;
189
319
  }
190
320
 
191
321
  //#endregion
192
322
  //#region src/index.ts
193
- function validate(obj, checks) {
194
- let hasErrors = false;
195
- const errorMessages = [];
323
+ function validate(obj, checks, options) {
324
+ let error = {};
196
325
  Object.keys(checks).forEach((path) => {
197
326
  let value = getNestedValue(obj, path);
198
327
  if (typeof value === "string") {
199
- value = cleanString(value);
328
+ value = cleanString(value, options);
200
329
  setNestedValue(obj, path, value);
201
330
  }
202
331
  let skip = false;
@@ -204,26 +333,31 @@ function validate(obj, checks) {
204
333
  if (skip) return;
205
334
  if (rule === "nullable" && value === null) skip = true;
206
335
  if (rule === "sometimes" && typeof value === "undefined") skip = true;
207
- const result = typeof rule === "string" ? parse(value, rule) : { ...rule };
336
+ const result = typeof rule === "string" || isArray(rule) ? parse(value, rule) : { ...rule };
208
337
  if (result.check) return;
209
- hasErrors = true;
210
- errorMessages.push(result.message);
211
- util.appendError(result.message, "ValidationError", null, {
212
- path,
213
- value
214
- });
215
- if (rule === "required") skip = true;
338
+ if (error.msg) util.appendError(error.msg, error.errorType, error.data, error.errorInfo);
339
+ result.message = result.message.replace(":attribute", formatAttributeName(path));
340
+ error = {
341
+ msg: result.message,
342
+ errorType: "ValidationError",
343
+ data: null,
344
+ errorInfo: {
345
+ path,
346
+ value
347
+ }
348
+ };
349
+ skip = true;
216
350
  });
217
351
  });
218
- if (hasErrors) util.error(errorMessages[0], "ValidationError");
219
- return obj;
352
+ if (!error.msg) return obj;
353
+ util.error(error.msg, error.errorType, error.data, error.errorInfo);
220
354
  }
221
- function precognition(ctx, checks) {
222
- if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks);
355
+ function precognitiveValidation(ctx, checks, options) {
356
+ if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks, options);
223
357
  const validationKeys = precognitiveKeys(ctx);
224
358
  util.http.addResponseHeader("Precognition", "true");
225
359
  if (!validationKeys) {
226
- validate(ctx.args, checks);
360
+ validate(ctx.args, checks, options);
227
361
  util.http.addResponseHeader("Precognition-Success", "true");
228
362
  runtime.earlyReturn(null);
229
363
  }
@@ -232,11 +366,17 @@ function precognition(ctx, checks) {
232
366
  validationKeys.forEach((key) => {
233
367
  precognitionChecks[key] = checks[key];
234
368
  });
235
- validate(ctx.args, precognitionChecks);
369
+ validate(ctx.args, precognitionChecks, options);
236
370
  util.http.addResponseHeader("Precognition-Success", "true");
237
- runtime.earlyReturn(null);
371
+ runtime.earlyReturn(null, { skipTo: options?.skipTo ?? "END" });
372
+ }
373
+ function formatAttributeName(path) {
374
+ return path.split(".").reduce((acc, part) => {
375
+ if (util.matches("^d+$", part)) return acc;
376
+ return acc ? `${acc} ${part.toLowerCase()}` : part.toLowerCase();
377
+ }, "");
238
378
  }
239
379
 
240
380
  //#endregion
241
- export { precognition, validate };
242
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogQ29udGV4dCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3R4LnJlcXVlc3QuaGVhZGVycylcbiAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0pID0+IHR5cGVvZiBwcmV2ID09PSAnc3RyaW5nJ1xuICAgICAgPyBwcmV2XG4gICAgICA6IChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBudWxsKSwgbnVsbCBhcyBzdHJpbmcgfCBudWxsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb2duaXRpdmVSZXF1ZXN0KGN0eDogQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0SGVhZGVyKCdwcmVjb2duaXRpb24nLCBjdHgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGl2ZUtleXMoY3R4OiBDb250ZXh0KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuICByZXR1cm4gcGFyc2VkXG59XG4iLCJpbXBvcnQgdHlwZSB7IFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBuYW1lcyA9IHtcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIG51bGxhYmxlOiAnbnVsbGFibGUnLFxuICBzb21ldGltZXM6ICdzb21ldGltZXMnLFxuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHJlZ2V4OiAncmVnZXgnLFxuICBpbjogJ2luJyxcbiAgbm90SW46ICdub3RJbicsXG4gIGJlZm9yZTogJ2JlZm9yZScsXG4gIGFmdGVyOiAnYWZ0ZXInLFxufSBhcyBjb25zdFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VD4odmFsdWU6IFQsIHJ1bGU6IFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgbmFtZXM+KTogUnVsZTxUPiB7XG4gIGNvbnN0IFtydWxlTmFtZSwgcGFyYW1zXSA9IHJ1bGUuaW5jbHVkZXMoJzonKSA/IHJ1bGUuc3BsaXQoJzonLCAyKSA6IFtydWxlLCAnJ11cblxuICBzd2l0Y2ggKHJ1bGVOYW1lIGFzIGtleW9mIHR5cGVvZiBuYW1lcykge1xuICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG4gICAgY2FzZSAnbnVsbGFibGUnOlxuICAgICAgcmV0dXJuIG51bGxhYmxlUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdzb21ldGltZXMnOlxuICAgICAgcmV0dXJuIHNvbWV0aW1lc1J1bGUodmFsdWUpXG4gICAgY2FzZSAnbWluJzpcbiAgICAgIHJldHVybiBtaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBjYXNlICdtYXgnOlxuICAgICAgcmV0dXJuIG1heFJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCAnKSlcbiAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgIHJldHVybiBiZXR3ZWVuUnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsICcpKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtcylcbiAgICBjYXNlICdpbic6XG4gICAgICByZXR1cm4gaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywgJykpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNoZWNrOiBmYWxzZSwgbWVzc2FnZTogYFVua25vd24gcnVsZSAke3J1bGVOYW1lfWAsIHZhbHVlIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW5WYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSAocmVzdWx0LnZhbHVlKS5sZW5ndGggPj0gbWluVmFsdWVcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5WYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBtYXhSdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXhWYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGF0IG1vc3QgJHttYXhWYWx1ZX0gY2hhcmFjdGVyc2BcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJldHdlZW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1sxXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgKHJlc3VsdC52YWx1ZSkubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBlbWFpbFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcygnXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskJywgcmVzdWx0LnZhbHVlIGFzIHN0cmluZylcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeKGh0dHB8aHR0cHMpOlxcXFwvXFxcXC9bXFxcXHdcXFxcLV9dKyhcXFxcLltcXFxcd1xcXFwtX10rKSsoW1xcXFx3XFxcXC1cXFxcLixAP149JSY6L35cXFxcKyNdKltcXFxcd1xcXFwtXFxcXEA/Xj0lJi9+XFxcXCsjXSk/JCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHV1aWRSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIFVVSUQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWdleFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVnZXggPSBwYXJhbXNbMF0gPz8gJydcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLmluY2x1ZGVzKHJlc3VsdC52YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5tYXAoTnVtYmVyKS5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFJ1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBpcyByZXF1aXJlZCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAoaXNBcnJheShyZXN1bHQudmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHJlc3VsdC5jaGVjayA9PT0gZmFsc2UpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIHJlcXVpcmVkJ1xuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzb21ldGltZXNSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUsIC4uLl9wYXJhbXMpXG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mLCBSdWxlLCBTaG9ydFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgcnVsZXNbJ25hbWVzJ10+IHwgUnVsZSlbXT4+LFxuKTogVCB7XG4gIGxldCBoYXNFcnJvcnMgPSBmYWxzZVxuICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpIDogeyAuLi5ydWxlIH1cbiAgICAgIGlmIChyZXN1bHQuY2hlY2spXG4gICAgICAgIHJldHVyblxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKHJlc3VsdC5tZXNzYWdlKVxuICAgICAgdXRpbC5hcHBlbmRFcnJvcihyZXN1bHQubWVzc2FnZSwgJ1ZhbGlkYXRpb25FcnJvcicsIG51bGwsIHsgcGF0aCwgdmFsdWUgfSlcbiAgICAgIGlmIChydWxlID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgdXRpbC5lcnJvcihlcnJvck1lc3NhZ2VzWzBdLCAnVmFsaWRhdGlvbkVycm9yJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgY3R4OiBDb250ZXh0PFQ+LFxuICBjaGVja3M6IFBhcnRpYWw8UmVjb3JkPE5lc3RlZEtleU9mPFQ+LCAoU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBydWxlc1snbmFtZXMnXT4gfCBSdWxlKVtdPj4sXG4pOiBUIHtcbiAgaWYgKCFpc1ByZWNvZ25pdGl2ZVJlcXVlc3QoY3R4KSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICB9XG4gIGNvbnN0IHZhbGlkYXRpb25LZXlzID0gcHJlY29nbml0aXZlS2V5cyhjdHgpXG4gIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uJywgJ3RydWUnKVxuXG4gIGlmICghdmFsaWRhdGlvbktleXMpIHtcbiAgICB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICAgIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uLVN1Y2Nlc3MnLCAndHJ1ZScpXG4gICAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxuICB9XG5cbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tVmFsaWRhdGUtT25seScsIHZhbGlkYXRpb25LZXlzLmpvaW4oJywnKSlcbiAgY29uc3QgcHJlY29nbml0aW9uQ2hlY2tzID0ge30gYXMgUGFydGlhbDx0eXBlb2YgY2hlY2tzPlxuICB2YWxpZGF0aW9uS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBwcmVjb2duaXRpb25DaGVja3Nba2V5IGFzIE5lc3RlZEtleU9mPFQ+XSA9IGNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dXG4gIH0pXG5cbiAgdmFsaWRhdGUoY3R4LmFyZ3MsIHByZWNvZ25pdGlvbkNoZWNrcylcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFRQSxTQUFnQixRQUFRLE9BQW9DO0FBQzFELEtBQUksT0FBTyxVQUFVLFlBQVksQ0FBQyxDQUFDLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxDQUN4RSxRQUFPLE9BQVEsTUFBb0IsV0FBVztBQUVoRCxRQUFPOztBQUdULFNBQWdCLGVBQWlDLEtBQVEsTUFBMkI7QUFDbEYsUUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQWlCLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUyxJQUFJLEdBQzlFLFFBQXNCLE9BQU8sSUFBSSxJQUNqQyxRQUFvQyxNQUFNLElBQUk7O0FBR3JELFNBQWdCLGVBQWlDLEtBQVEsTUFBc0IsT0FBc0I7Q0FDbkcsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQzVCLEtBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsTUFBSSxLQUFLLE1BQTBCO0FBQ25DOztDQUVGLE1BQU0sVUFBVSxLQUFLLEtBQUs7Q0FDMUIsTUFBTSxlQUFlLGVBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFtQjtBQUMxRSxLQUFJLE9BQU8saUJBQWlCLFlBQVksQ0FBQyxDQUFDLGFBQ3hDLGNBQWEsV0FBVzs7QUFJNUIsU0FBZ0IsVUFBVSxNQUFjLEtBQTZCO0FBQ25FLFFBQU8s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
381
+ export { formatAttributeName, precognitiveValidation, validate };
382
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvcjogeyBtc2c/OiBzdHJpbmcsIGVycm9yVHlwZT86IHN0cmluZywgZGF0YT86IGFueSwgZXJyb3JJbmZvPzogYW55IH0iLCJydWxlcy5wYXJzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9ydWxlcy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5rbm93bltdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISF2YWx1ZSAmJiBPYmplY3QuaGFzT3duKHZhbHVlLCAnbGVuZ3RoJykpIHtcbiAgICByZXR1cm4gdHlwZW9mICh2YWx1ZSBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gJ251bWJlcidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCwgcGF0aDogTmVzdGVkS2V5T2Y8VD4pOiBhbnkge1xuICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZTx1bmtub3duPigoY3VycmVudCwga2V5KSA9PiB1dGlsLm1hdGNoZXMoJ15cXGQrJCcsIGtleSlcbiAgICA/IChjdXJyZW50IGFzIHVua25vd25bXSlbTnVtYmVyKGtleSldXG4gICAgOiAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgb2JqKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKVxuICBpZiAoa2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICBvYmpba2V5c1swXSBhcyBrZXlvZiB0eXBlb2Ygb2JqXSA9IHZhbHVlIGFzIGFueVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGxhc3RLZXkgPSBrZXlzLnBvcCgpIGFzIHN0cmluZ1xuICBjb25zdCBwYXJlbnRPYmplY3QgPSBnZXROZXN0ZWRWYWx1ZShvYmosIGtleXMuam9pbignLicpIGFzIE5lc3RlZEtleU9mPFQ+KVxuICBpZiAodHlwZW9mIHBhcmVudE9iamVjdCA9PT0gJ29iamVjdCcgJiYgISFwYXJlbnRPYmplY3QpIHtcbiAgICBwYXJlbnRPYmplY3RbbGFzdEtleV0gPSB2YWx1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXIobmFtZTogc3RyaW5nLCBjdHg6IENvbnRleHQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGN0eC5yZXF1ZXN0LmhlYWRlcnMpXG4gICAgLnJlZHVjZSgocHJldiwgW2tleSwgdmFsdWVdKSA9PiB0eXBlb2YgcHJldiA9PT0gJ3N0cmluZydcbiAgICAgID8gcHJldlxuICAgICAgOiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogbnVsbCksIG51bGwgYXMgc3RyaW5nIHwgbnVsbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlY29nbml0aXZlUmVxdWVzdChjdHg6IENvbnRleHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldEhlYWRlcigncHJlY29nbml0aW9uJywgY3R4KSA9PT0gJ3RydWUnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVLZXlzKGN0eDogQ29udGV4dCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGNvbnN0IGtleXMgPSBnZXRIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgY3R4KVxuICByZXR1cm4ga2V5cyA/IGtleXMuc3BsaXQoJywnKS5tYXAoa2V5ID0+IGtleS50cmltKCkpIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TdHJpbmcodmFsdWU6IHN0cmluZywgb3B0aW9ucz86IHtcbiAgdHJpbT86IGJvb2xlYW5cbiAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW5cbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKG9wdGlvbnM/LnRyaW0gPT09IGZhbHNlKVxuICAgIHJldHVybiB2YWx1ZVxuXG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcblxuICBpZiAob3B0aW9ucz8uYWxsb3dFbXB0eVN0cmluZylcbiAgICByZXR1cm4gcGFyc2VkXG5cbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuXG4gIHJldHVybiBwYXJzZWRcbn1cbiIsImltcG9ydCB0eXBlIHsgRnVsbFJ1bGUsIFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VD4odmFsdWU6IFQsIHJ1bGU6IEZ1bGxSdWxlKTogUnVsZTxUPiB7XG4gIGNvbnN0IFtuYW1lLCAuLi5wYXJhbXNdID0gdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgPyBbcnVsZSwgdW5kZWZpbmVkXVxuICAgIDogW3J1bGVbMF0sIC4uLnJ1bGUuc2xpY2UoMSldXG5cbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgcmV0dXJuIHJlcXVpcmVkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdudWxsYWJsZSc6XG4gICAgICByZXR1cm4gbnVsbGFibGVSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3NvbWV0aW1lcyc6XG4gICAgICByZXR1cm4gc29tZXRpbWVzUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdtaW4nOlxuICAgICAgcmV0dXJuIG1pblJ1bGUodmFsdWUsIChwYXJhbXNbMF0hIGFzIG51bWJlcikpXG4gICAgY2FzZSAnbWF4JzpcbiAgICAgIHJldHVybiBtYXhSdWxlKHZhbHVlLCAocGFyYW1zWzBdIGFzIG51bWJlcikpXG4gICAgY2FzZSAnYmV0d2Vlbic6XG4gICAgICByZXR1cm4gYmV0d2VlblJ1bGUodmFsdWUsIChwYXJhbXNbMF0gYXMgbnVtYmVyKSwgcGFyYW1zWzFdIGFzIG51bWJlcilcbiAgICBjYXNlICdlbWFpbCc6XG4gICAgICByZXR1cm4gZW1haWxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3VybCc6XG4gICAgICByZXR1cm4gdXJsUnVsZSh2YWx1ZSlcbiAgICBjYXNlICd1dWlkJzpcbiAgICAgIHJldHVybiB1dWlkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICd1bGlkJzpcbiAgICAgIHJldHVybiB1bGlkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdyZWdleCc6XG4gICAgICByZXR1cm4gcmVnZXhSdWxlKHZhbHVlLCBwYXJhbXNbMF0gYXMgc3RyaW5nKVxuICAgIGNhc2UgJ2luJzpcbiAgICAgIHJldHVybiBpblJ1bGUodmFsdWUsIC4uLnBhcmFtcylcbiAgICBjYXNlICdub3RJbic6XG4gICAgICByZXR1cm4gbm90SW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMpXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIGFycmF5UnVsZSh2YWx1ZSlcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdFJ1bGUodmFsdWUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gYm9vbGVhblJ1bGUodmFsdWUpXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBudW1iZXJSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5nUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBkYXRlUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgcmV0dXJuIGJlZm9yZVJ1bGUodmFsdWUsIHBhcmFtc1swXSBhcyBzdHJpbmcpXG4gICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgcmV0dXJuIGFmdGVyUnVsZSh2YWx1ZSwgcGFyYW1zWzBdIGFzIHN0cmluZylcbiAgICBjYXNlICdiZWZvcmVPckVxdWFsJzpcbiAgICAgIHJldHVybiBiZWZvcmVPckVxdWFsUnVsZSh2YWx1ZSwgcGFyYW1zWzBdIGFzIHN0cmluZylcbiAgICBjYXNlICdhZnRlck9yRXF1YWwnOlxuICAgICAgcmV0dXJuIGFmdGVyT3JFcXVhbFJ1bGUodmFsdWUsIHBhcmFtc1swXSBhcyBzdHJpbmcpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNoZWNrOiBmYWxzZSwgbWVzc2FnZTogYFVua25vd24gcnVsZSAke25hbWV9YCwgdmFsdWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1pblJ1bGU8VD4odmFsdWU6IFQsIG1pblZhbHVlOiBudW1iZXIpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke21pblZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7bWluVmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbWF4UnVsZTxUPih2YWx1ZTogVCwgbWF4VmFsdWU6IG51bWJlcik6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6IGA6YXR0cmlidXRlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bWF4VmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPD0gbWF4VmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmV0d2VlblJ1bGU8VD4odmFsdWU6IFQsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID49IG1pblZhbHVlICYmIHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgdmFsdWUubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBlbWFpbFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcygnXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFxcXC5bYS16QS1aXXsyLH0kJywgcmVzdWx0LnZhbHVlIGFzIHN0cmluZylcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeaHR0cHM/OlxcXFwvXFxcXC8od3d3XFxcXC4pP1stYS16QS1aMC05QDolLl9cXFxcK34jPV17MSwyNTZ9XFxcXC5bYS16QS1aMC05KCldezEsNn1cXFxcYihbLWEtekEtWjAtOSgpQDolX1xcXFwrLn4jPyYvLz1dKikkfF5odHRwcz86XFxcXC9cXFxcLyhsb2NhbGhvc3R8XFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfSkoOlxcXFxkKyk/KFxcXFwvLiopPyQnLFxuICAgICAgcmVzdWx0LnZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1dWlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVVUlEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1bGlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVTElEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIC8vIFVMSUQgZm9ybWF0OiAyNiBjaGFyYWN0ZXJzLCBiYXNlMzIgZW5jb2RlZCAoMC05LCBBLVogZXhjbHVkaW5nIEksIEwsIE8sIFUpXG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15bMDEyMzQ1Njc4OUFCQ0RFRkdISktNTlBRUlNUVldYWVpdezI2fSQnLFxuICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlZ2V4UnVsZTxUPih2YWx1ZTogVCwgcGF0dGVybjogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbicsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSB2YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhwYXR0ZXJuLCByZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHVua25vd25bXSk6IFJ1bGU8VD4ge1xuICByZXR1cm4ge1xuICAgIGNoZWNrOiBwYXJhbXMuaW5jbHVkZXModmFsdWUpLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzJyxcbiAgICB2YWx1ZSxcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RJblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogdW5rbm93bltdKTogUnVsZTxUPiB7XG4gIHJldHVybiB7XG4gICAgY2hlY2s6ICFwYXJhbXMuaW5jbHVkZXModmFsdWUpLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3Qgbm90IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgaXMgcmVxdWlyZWQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXJlc3VsdC52YWx1ZSkge1xuICAgIHJlc3VsdC5tZXNzYWdlID0gJzphdHRyaWJ1dGUgaXMgbm90IG51bGxhYmxlJ1xuICAgIHJlc3VsdC5jaGVjayA9IGZhbHNlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHNvbWV0aW1lc1J1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGFycmF5UnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYW4gYXJyYXknLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG9iamVjdFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGFuIG9iamVjdCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIWlzQXJyYXkocmVzdWx0LnZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5SdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIGJvb2xlYW4nLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG51bWJlclJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgbnVtYmVyJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1J1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgc3RyaW5nJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGRhdGVSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIGRhdGUnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15cXFxcZHs0fS0oMFsxLTldfDFbMC0yXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pVChbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkOlswLTVdXFxcXGQoXFxcXC5cXFxcZHsxLDZ9KT9aJCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJlZm9yZVJ1bGU8VD4odmFsdWU6IFQsIHN0YXJ0OiBzdHJpbmcpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJlZm9yZSAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPCBzdGFydFZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDwgc3RhcnRWYWx1ZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYWZ0ZXJSdWxlPFQ+KHZhbHVlOiBULCBzdGFydDogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBhZnRlciAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPiBzdGFydFZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID4gc3RhcnRWYWx1ZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmVmb3JlT3JFcXVhbFJ1bGU8VD4odmFsdWU6IFQsIHN0YXJ0OiBzdHJpbmcpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJlZm9yZSBvciBlcXVhbCB0byAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPD0gc3RhcnRWYWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBzdGFydFZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBhZnRlck9yRXF1YWxSdWxlPFQ+KHZhbHVlOiBULCBzdGFydDogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBhZnRlciBvciBlcXVhbCB0byAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPj0gc3RhcnRWYWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBzdGFydFZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBGdWxsUnVsZSwgTmVzdGVkS2V5T2YsIFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzQXJyYXksIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKEZ1bGxSdWxlIHwgUnVsZSlbXT4+LFxuICBvcHRpb25zPzoge1xuICAgIHRyaW0/OiBib29sZWFuXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW5cbiAgfSxcbik6IFQge1xuICBsZXQgZXJyb3I6IHsgbXNnPzogc3RyaW5nLCBlcnJvclR5cGU/OiBzdHJpbmcsIGRhdGE/OiBhbnksIGVycm9ySW5mbz86IGFueSB9ID0ge31cblxuICBPYmplY3Qua2V5cyhjaGVja3MpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShvYmosIHBhdGggYXMgTmVzdGVkS2V5T2Y8VD4pXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gY2xlYW5TdHJpbmcodmFsdWUsIG9wdGlvbnMpXG4gICAgICBzZXROZXN0ZWRWYWx1ZShvYmosIHBhdGggYXMgTmVzdGVkS2V5T2Y8VD4sIHZhbHVlKVxuICAgIH1cblxuICAgIGxldCBza2lwID0gZmFsc2VcbiAgICBjaGVja3NbcGF0aCBhcyBOZXN0ZWRLZXlPZjxUPl0/LmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocnVsZSA9PT0gJ251bGxhYmxlJyAmJiB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgc2tpcCA9IHRydWVcblxuICAgICAgaWYgKHJ1bGUgPT09ICdzb21ldGltZXMnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHNraXAgPSB0cnVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycgfHwgaXNBcnJheShydWxlKSlcbiAgICAgICAgPyBydWxlcy5wYXJzZSh2YWx1ZSwgcnVsZSlcbiAgICAgICAgOiB7IC4uLnJ1bGUgfVxuXG4gICAgICBpZiAocmVzdWx0LmNoZWNrKVxuICAgICAgICByZXR1cm5cblxuICAgICAgaWYgKGVycm9yLm1zZylcbiAgICAgICAgdXRpbC5hcHBlbmRFcnJvcihlcnJvci5tc2csIGVycm9yLmVycm9yVHlwZSwgZXJyb3IuZGF0YSwgZXJyb3IuZXJyb3JJbmZvKVxuXG4gICAgICByZXN1bHQubWVzc2FnZSA9IHJlc3VsdC5tZXNzYWdlLnJlcGxhY2UoJzphdHRyaWJ1dGUnLCBmb3JtYXRBdHRyaWJ1dGVOYW1lKHBhdGgpKVxuICAgICAgZXJyb3IgPSB7XG4gICAgICAgIG1zZzogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgIGVycm9yVHlwZTogJ1ZhbGlkYXRpb25FcnJvcicsXG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9ySW5mbzogeyBwYXRoLCB2YWx1ZSB9LFxuICAgICAgfVxuXG4gICAgICBza2lwID0gdHJ1ZVxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKCFlcnJvci5tc2cpIHtcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICB1dGlsLmVycm9yKGVycm9yLm1zZywgZXJyb3IuZXJyb3JUeXBlLCBlcnJvci5kYXRhLCBlcnJvci5lcnJvckluZm8pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVWYWxpZGF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBjdHg6IENvbnRleHQ8VD4sXG4gIGNoZWNrczogUGFydGlhbDxSZWNvcmQ8TmVzdGVkS2V5T2Y8VD4sIChGdWxsUnVsZSB8IFJ1bGUpW10+PixcbiAgb3B0aW9ucz86IHtcbiAgICB0cmltPzogYm9vbGVhblxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuXG4gICAgc2tpcFRvPzogJ0VORCcgfCAnTkVYVCdcbiAgfSxcbik6IFQge1xuICBpZiAoIWlzUHJlY29nbml0aXZlUmVxdWVzdChjdHgpKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MsIG9wdGlvbnMpXG4gIH1cbiAgY29uc3QgdmFsaWRhdGlvbktleXMgPSBwcmVjb2duaXRpdmVLZXlzKGN0eClcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24nLCAndHJ1ZScpXG5cbiAgaWYgKCF2YWxpZGF0aW9uS2V5cykge1xuICAgIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MsIG9wdGlvbnMpXG4gICAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG4gIH1cblxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgdmFsaWRhdGlvbktleXMuam9pbignLCcpKVxuICBjb25zdCBwcmVjb2duaXRpb25DaGVja3MgPSB7fSBhcyBQYXJ0aWFsPHR5cGVvZiBjaGVja3M+XG4gIHZhbGlkYXRpb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHByZWNvZ25pdGlvbkNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dID0gY2hlY2tzW2tleSBhcyBOZXN0ZWRLZXlPZjxUPl1cbiAgfSlcblxuICB2YWxpZGF0ZShjdHguYXJncywgcHJlY29nbml0aW9uQ2hlY2tzLCBvcHRpb25zKVxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1TdWNjZXNzJywgJ3RydWUnKVxuICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwsIHsgc2tpcFRvOiBvcHRpb25zPy5za2lwVG8gPz8gJ0VORCcgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEF0dHJpYnV0ZU5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYywgcGFydCkgPT4ge1xuICAgIGlmICh1dGlsLm1hdGNoZXMoJ15cXGQrJCcsIHBhcnQpKSB7XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuICAgIHJldHVybiBhY2MgPyBgJHthY2N9ICR7cGFydC50b0xvd2VyQ2FzZSgpfWAgOiBwYXJ0LnRvTG93ZXJDYXNlKClcbiAgfSwgJycpXG59XG4iXSwibWFwcGluZ3MiOiI7OztBQVFBLFNBQWdCLFFBQVEsT0FBb0M7QUFDMUQsS0FBSSxPQUFPLFVBQVUsWUFBWSxDQUFDLENBQUMsU0FBUyxPQUFPLE9BQU8sT0FBTyxTQUFTLENBQ3hFLFFBQU8sT0FBUSxNQUFvQixXQUFXO0FBRWhELFFBQU87O0FBR1QsU0FBZ0IsZUFBaUMsS0FBUSxNQUEyQjtBQUNsRixRQUFPLEtBQUssTUFBTSxJQUFJLENBQUMsUUFBaUIsU0FBUyxRQUFRLEtBQUssUUFBUSxRQUFTLElBQUksR0FDOUUsUUFBc0IsT0FBTyxJQUFJLElBQ2pDLFFBQW9DLE1BQU0sSUFBSTs7QUFHckQsU0FBZ0IsZUFBaUMsS0FBUSxNQUFzQixPQUFzQjtDQUNuRyxNQUFNLE9BQU8sS0FBSyxNQUFNLElBQUk7QUFDNUIsS0FBSSxLQUFLLFdBQVcsR0FBRztBQUNyQixNQUFJLEtBQUssTUFBMEI7QUFDbkM7O0NBRUYsTUFBTSxVQUFVLEtBQUssS0FB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sot1986/appsync-precognition",
3
3
  "type": "module",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "description": "JavaScript resolver validation utilities for AWS AppSync",
6
6
  "author": "sot1986",
7
7
  "license": "MIT",