@sot1986/appsync-precognition 0.0.1 → 0.0.3
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 +16 -3
- package/dist/index.js +129 -34
- package/package.json +7 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { Context } from "@aws-appsync/utils";
|
|
2
|
+
|
|
3
|
+
//#region rolldown:runtime
|
|
1
4
|
//#endregion
|
|
2
5
|
//#region src/types.d.ts
|
|
3
6
|
interface Rule<T = unknown> {
|
|
@@ -13,22 +16,32 @@ interface HasConstructor {
|
|
|
13
16
|
}
|
|
14
17
|
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;
|
|
15
18
|
declare namespace rules_d_exports {
|
|
16
|
-
export { names, parse };
|
|
19
|
+
export { names, parse, requiredRule };
|
|
17
20
|
}
|
|
18
21
|
declare const names: {
|
|
22
|
+
readonly required: "required";
|
|
23
|
+
readonly nullable: "nullable";
|
|
24
|
+
readonly sometimes: "sometimes";
|
|
19
25
|
readonly min: "min";
|
|
20
26
|
readonly max: "max";
|
|
21
27
|
readonly between: "between";
|
|
22
28
|
readonly email: "email";
|
|
23
29
|
readonly url: "url";
|
|
24
30
|
readonly uuid: "uuid";
|
|
31
|
+
readonly ulid: "ulid";
|
|
25
32
|
readonly regex: "regex";
|
|
26
33
|
readonly in: "in";
|
|
34
|
+
readonly notIn: "notIn";
|
|
35
|
+
readonly before: "before";
|
|
36
|
+
readonly after: "after";
|
|
27
37
|
};
|
|
28
38
|
declare function parse<T>(value: T, rule: ShortRule<keyof typeof names>): Rule<T>;
|
|
39
|
+
declare function requiredRule<T>(value: T, ..._params: string[]): Rule<T>;
|
|
29
40
|
//#endregion
|
|
30
41
|
//#region src/index.d.ts
|
|
31
42
|
declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
|
|
43
|
+
declare function precognitiveValidation<T extends object>(ctx: Context<T>, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
|
|
44
|
+
declare function formatAttributeName(path: string): string;
|
|
32
45
|
//#endregion
|
|
33
|
-
export { validate };
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
46
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
47
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcnVsZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7VUFFaUI7OztTQUdSOztLQUdHLDhCQUE4QixPQUFPO0tBRTVDLGlDQUNELG9DQUNFLFVBQVU7S0FPWCwrQkFDRCxzQkFDRSxVQUFVLFdBQ0o7VUFFRixjQUFBOzs7S0FJRSxpQkFBaUIsVUFBVSw2QkFDbkMsVUFBVSx5QkFFUixVQUFVLDBEQUdMLFdBQVcsTUFBTSxFQUFFLHlCQUNiLFdBQVcsS0FBSyxHQUFHLFNBQVMsWUFBWSxFQUFFLFVBQzdDLHNCQUNFLDRDQUVFLHdDQUNlLFlBQVk7Ozs7Y0NwQ2hDOzs7Ozs7Ozs7Ozs7Ozs7OztpQkFrQkcsZ0JBQWdCLFNBQVMsdUJBQXVCLFNBQVMsS0FBSztpQkEwTTlELHVCQUF1QiwwQkFBMEIsS0FBSzs7O2lCQzFOdEQsZ0NBQ1QsV0FDRyxRQUFRLE9BQU8sWUFBWSxLQUFLLHVCQUF1Qiw0QkFBa0IsWUFDaEY7aUJBNENhLDhDQUNULFFBQVEsWUFDTCxRQUFRLE9BQU8sWUFBWSxLQUFLLHVCQUF1Qiw0QkFBa0IsWUFDaEY7aUJBd0JhLG1CQUFBIn0=
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { util } from "@aws-appsync/utils";
|
|
1
|
+
import { runtime, util } from "@aws-appsync/utils";
|
|
2
2
|
|
|
3
3
|
//#region src/utils.ts
|
|
4
4
|
function isArray(value) {
|
|
@@ -18,20 +18,40 @@ function setNestedValue(obj, path, value) {
|
|
|
18
18
|
const parentObject = getNestedValue(obj, keys.join("."));
|
|
19
19
|
if (typeof parentObject === "object" && !!parentObject) parentObject[lastKey] = value;
|
|
20
20
|
}
|
|
21
|
+
function getHeader(name, ctx) {
|
|
22
|
+
return Object.entries(ctx.request.headers).reduce((prev, [key, value]) => typeof prev === "string" ? prev : key.toLowerCase() === name.toLowerCase() && typeof value === "string" ? value : null, null);
|
|
23
|
+
}
|
|
24
|
+
function isPrecognitiveRequest(ctx) {
|
|
25
|
+
return getHeader("precognition", ctx) === "true";
|
|
26
|
+
}
|
|
27
|
+
function precognitiveKeys(ctx) {
|
|
28
|
+
const keys = getHeader("Precognition-Validate-Only", ctx);
|
|
29
|
+
return keys ? keys.split(",").map((key) => key.trim()) : null;
|
|
30
|
+
}
|
|
31
|
+
function cleanString(value) {
|
|
32
|
+
let parsed = value.trim();
|
|
33
|
+
if (parsed === "") parsed = null;
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
21
36
|
|
|
22
37
|
//#endregion
|
|
23
38
|
//#region src/rules.ts
|
|
24
39
|
function parse(value, rule) {
|
|
25
40
|
const [ruleName, params] = rule.includes(":") ? rule.split(":", 2) : [rule, ""];
|
|
26
41
|
switch (ruleName) {
|
|
42
|
+
case "required": return requiredRule(value);
|
|
43
|
+
case "nullable": return nullableRule(value);
|
|
44
|
+
case "sometimes": return sometimesRule(value);
|
|
27
45
|
case "min": return minRule(value, ...params.split(","));
|
|
28
|
-
case "max": return maxRule(value, ...params.split(",
|
|
29
|
-
case "between": return betweenRule(value, ...params.split(",
|
|
46
|
+
case "max": return maxRule(value, ...params.split(","));
|
|
47
|
+
case "between": return betweenRule(value, ...params.split(","));
|
|
30
48
|
case "email": return emailRule(value);
|
|
31
49
|
case "url": return urlRule(value);
|
|
32
50
|
case "uuid": return uuidRule(value);
|
|
51
|
+
case "ulid": return ulidRule(value);
|
|
33
52
|
case "regex": return regexRule(value, params);
|
|
34
|
-
case "in": return inRule(value, ...params.split(",
|
|
53
|
+
case "in": return inRule(value, ...params.split(","));
|
|
54
|
+
case "notIn": return notInRule(value, ...params.split(","));
|
|
35
55
|
default: return {
|
|
36
56
|
check: false,
|
|
37
57
|
message: `Unknown rule ${ruleName}`,
|
|
@@ -43,14 +63,11 @@ function minRule(value, ...params) {
|
|
|
43
63
|
const minValue = Number(params[0] ?? "0");
|
|
44
64
|
const result = {
|
|
45
65
|
check: false,
|
|
46
|
-
message:
|
|
66
|
+
message: `:attribute must be greater than or equal to ${minValue}`,
|
|
47
67
|
value
|
|
48
68
|
};
|
|
49
69
|
if (typeof value === "number") result.check = value >= minValue;
|
|
50
|
-
if (typeof result.value === "string")
|
|
51
|
-
result.value = result.value.trim();
|
|
52
|
-
result.check = result.value.length >= minValue;
|
|
53
|
-
}
|
|
70
|
+
if (typeof result.value === "string") result.check = result.value.length >= minValue;
|
|
54
71
|
if (isArray(value)) {
|
|
55
72
|
result.check = value.length >= minValue;
|
|
56
73
|
result.message = `Array must contain at least ${minValue} elements`;
|
|
@@ -61,12 +78,11 @@ function maxRule(value, ...params) {
|
|
|
61
78
|
const maxValue = Number(params[0] ?? "0");
|
|
62
79
|
const result = {
|
|
63
80
|
check: false,
|
|
64
|
-
message:
|
|
81
|
+
message: `:attribute must be less than or equal to ${maxValue}`,
|
|
65
82
|
value
|
|
66
83
|
};
|
|
67
84
|
if (typeof value === "number") result.check = value <= maxValue;
|
|
68
85
|
if (typeof result.value === "string") {
|
|
69
|
-
result.value = result.value.trim();
|
|
70
86
|
result.check = result.value.length <= maxValue;
|
|
71
87
|
result.message = `String must contain at most ${maxValue} characters`;
|
|
72
88
|
}
|
|
@@ -81,12 +97,11 @@ function betweenRule(value, ...params) {
|
|
|
81
97
|
const maxValue = Number(params[1] ?? "0");
|
|
82
98
|
const result = {
|
|
83
99
|
check: false,
|
|
84
|
-
message:
|
|
100
|
+
message: `:attribute must be between ${minValue} and ${maxValue}`,
|
|
85
101
|
value
|
|
86
102
|
};
|
|
87
103
|
if (typeof value === "number") result.check = value >= minValue && value <= maxValue;
|
|
88
104
|
if (typeof result.value === "string") {
|
|
89
|
-
result.value = result.value.trim();
|
|
90
105
|
result.check = result.value.length >= minValue && result.value.length <= maxValue;
|
|
91
106
|
result.message = `String must contain between ${minValue} and ${maxValue} characters`;
|
|
92
107
|
}
|
|
@@ -99,41 +114,44 @@ function betweenRule(value, ...params) {
|
|
|
99
114
|
function emailRule(value) {
|
|
100
115
|
const result = {
|
|
101
116
|
check: false,
|
|
102
|
-
message: "
|
|
117
|
+
message: ":attribute must be a valid email address",
|
|
103
118
|
value
|
|
104
119
|
};
|
|
105
|
-
if (typeof value === "string") {
|
|
106
|
-
result.value = value.trim();
|
|
107
|
-
result.check = util.matches("^[^s@]+@[^s@]+.[^s@]+$", result.value);
|
|
108
|
-
}
|
|
120
|
+
if (typeof value === "string") result.check = util.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", result.value);
|
|
109
121
|
return result;
|
|
110
122
|
}
|
|
111
123
|
function urlRule(value) {
|
|
112
124
|
const result = {
|
|
113
125
|
check: false,
|
|
114
|
-
message: "
|
|
126
|
+
message: ":attribute must be a valid URL",
|
|
115
127
|
value
|
|
116
128
|
};
|
|
117
|
-
if (typeof value === "string") {
|
|
118
|
-
result.value = value.trim();
|
|
119
|
-
result.check = util.matches("^(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$", result.value);
|
|
120
|
-
}
|
|
129
|
+
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);
|
|
121
130
|
return result;
|
|
122
131
|
}
|
|
123
132
|
function uuidRule(value) {
|
|
124
133
|
const result = {
|
|
125
134
|
check: false,
|
|
126
|
-
message: "
|
|
135
|
+
message: ":attribute must be a valid UUID",
|
|
127
136
|
value
|
|
128
137
|
};
|
|
129
138
|
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);
|
|
130
139
|
return result;
|
|
131
140
|
}
|
|
141
|
+
function ulidRule(value) {
|
|
142
|
+
const result = {
|
|
143
|
+
check: false,
|
|
144
|
+
message: ":attribute must be a valid ULID",
|
|
145
|
+
value
|
|
146
|
+
};
|
|
147
|
+
if (typeof result.value === "string") result.check = util.matches("^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$", value);
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
132
150
|
function regexRule(value, ...params) {
|
|
133
151
|
const regex = params[0] ?? "";
|
|
134
152
|
const result = {
|
|
135
153
|
check: false,
|
|
136
|
-
message: "
|
|
154
|
+
message: ":attribute must match the specified regular expression",
|
|
137
155
|
value
|
|
138
156
|
};
|
|
139
157
|
if (typeof result.value === "string") {
|
|
@@ -145,16 +163,60 @@ function regexRule(value, ...params) {
|
|
|
145
163
|
function inRule(value, ...params) {
|
|
146
164
|
const result = {
|
|
147
165
|
check: false,
|
|
148
|
-
message: "
|
|
166
|
+
message: ":attribute must be one of the specified values",
|
|
149
167
|
value
|
|
150
168
|
};
|
|
151
|
-
if (typeof result.value === "string")
|
|
152
|
-
result.value = result.value.trim();
|
|
153
|
-
result.check = params.includes(result.value);
|
|
154
|
-
}
|
|
169
|
+
if (typeof result.value === "string") result.check = params.includes(result.value);
|
|
155
170
|
if (typeof value === "number") result.check = params.map(Number).includes(value);
|
|
156
171
|
return result;
|
|
157
172
|
}
|
|
173
|
+
function notInRule(value, ...params) {
|
|
174
|
+
const result = {
|
|
175
|
+
check: false,
|
|
176
|
+
message: ":attribute must not be one of the specified values",
|
|
177
|
+
value
|
|
178
|
+
};
|
|
179
|
+
if (typeof result.value === "string") result.check = !params.includes(result.value);
|
|
180
|
+
if (typeof value === "number") result.check = !params.map(Number).includes(value);
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
function requiredRule(value, ..._params) {
|
|
184
|
+
const result = {
|
|
185
|
+
check: true,
|
|
186
|
+
message: ":attribute is required",
|
|
187
|
+
value
|
|
188
|
+
};
|
|
189
|
+
if (typeof result.value === "string") result.check = result.value.length > 0;
|
|
190
|
+
if (isArray(result.value)) result.check = result.value.length > 0;
|
|
191
|
+
if (typeof result.value === "number") result.check = true;
|
|
192
|
+
if (typeof value === "boolean") result.check = true;
|
|
193
|
+
if (typeof result.value === "object" && !result.value) {
|
|
194
|
+
result.message = ":attribute is not nullable";
|
|
195
|
+
result.check = false;
|
|
196
|
+
}
|
|
197
|
+
if (typeof result.value === "undefined") result.check = false;
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
function nullableRule(value, ..._params) {
|
|
201
|
+
return {
|
|
202
|
+
check: true,
|
|
203
|
+
message: "",
|
|
204
|
+
value
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function sometimesRule(value, ..._params) {
|
|
208
|
+
const result = {
|
|
209
|
+
check: true,
|
|
210
|
+
message: "",
|
|
211
|
+
value
|
|
212
|
+
};
|
|
213
|
+
if (typeof result.value === "undefined") return result;
|
|
214
|
+
if (typeof result.value === "object" && !result.value) {
|
|
215
|
+
result.message = ":attribute is not nullable";
|
|
216
|
+
result.check = false;
|
|
217
|
+
}
|
|
218
|
+
return requiredRule(value, ..._params);
|
|
219
|
+
}
|
|
158
220
|
|
|
159
221
|
//#endregion
|
|
160
222
|
//#region src/index.ts
|
|
@@ -162,23 +224,56 @@ function validate(obj, checks) {
|
|
|
162
224
|
let hasErrors = false;
|
|
163
225
|
const errorMessages = [];
|
|
164
226
|
Object.keys(checks).forEach((path) => {
|
|
165
|
-
|
|
166
|
-
if (typeof value === "string")
|
|
227
|
+
let value = getNestedValue(obj, path);
|
|
228
|
+
if (typeof value === "string") {
|
|
229
|
+
value = cleanString(value);
|
|
230
|
+
setNestedValue(obj, path, value);
|
|
231
|
+
}
|
|
232
|
+
let skip = false;
|
|
167
233
|
checks[path]?.forEach((rule) => {
|
|
234
|
+
if (skip) return;
|
|
235
|
+
if (rule === "nullable" && value === null) skip = true;
|
|
236
|
+
if (rule === "sometimes" && typeof value === "undefined") skip = true;
|
|
168
237
|
const result = typeof rule === "string" ? parse(value, rule) : { ...rule };
|
|
169
238
|
if (result.check) return;
|
|
170
239
|
hasErrors = true;
|
|
240
|
+
result.message = result.message.replace(":attribute", formatAttributeName(path));
|
|
171
241
|
errorMessages.push(result.message);
|
|
172
242
|
util.appendError(result.message, "ValidationError", null, {
|
|
173
243
|
path,
|
|
174
244
|
value
|
|
175
245
|
});
|
|
246
|
+
if (rule === "required") skip = true;
|
|
176
247
|
});
|
|
177
248
|
});
|
|
178
249
|
if (hasErrors) util.error(errorMessages[0], "ValidationError");
|
|
179
250
|
return obj;
|
|
180
251
|
}
|
|
252
|
+
function precognitiveValidation(ctx, checks) {
|
|
253
|
+
if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks);
|
|
254
|
+
const validationKeys = precognitiveKeys(ctx);
|
|
255
|
+
util.http.addResponseHeader("Precognition", "true");
|
|
256
|
+
if (!validationKeys) {
|
|
257
|
+
validate(ctx.args, checks);
|
|
258
|
+
util.http.addResponseHeader("Precognition-Success", "true");
|
|
259
|
+
runtime.earlyReturn(null);
|
|
260
|
+
}
|
|
261
|
+
util.http.addResponseHeader("Precognition-Validate-Only", validationKeys.join(","));
|
|
262
|
+
const precognitionChecks = {};
|
|
263
|
+
validationKeys.forEach((key) => {
|
|
264
|
+
precognitionChecks[key] = checks[key];
|
|
265
|
+
});
|
|
266
|
+
validate(ctx.args, precognitionChecks);
|
|
267
|
+
util.http.addResponseHeader("Precognition-Success", "true");
|
|
268
|
+
runtime.earlyReturn(null);
|
|
269
|
+
}
|
|
270
|
+
function formatAttributeName(path) {
|
|
271
|
+
return path.split(".").reduce((acc, part) => {
|
|
272
|
+
if (util.matches("^d+$", part)) return acc;
|
|
273
|
+
return acc ? `${acc} ${part.toLowerCase()}` : part.toLowerCase();
|
|
274
|
+
}, "");
|
|
275
|
+
}
|
|
181
276
|
|
|
182
277
|
//#endregion
|
|
183
|
-
export { validate };
|
|
184
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUnVsZSwgU2hvcnRSdWxlIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGNvbnN0IG5hbWVzID0ge1xuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHJlZ2V4OiAncmVnZXgnLFxuICBpbjogJ2luJyxcbn0gYXMgY29uc3RcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFQ+KHZhbHVlOiBULCBydWxlOiBTaG9ydFJ1bGU8a2V5b2YgdHlwZW9mIG5hbWVzPik6IFJ1bGU8VD4ge1xuICBjb25zdCBbcnVsZU5hbWUsIHBhcmFtc10gPSBydWxlLmluY2x1ZGVzKCc6JykgPyBydWxlLnNwbGl0KCc6JywgMikgOiBbcnVsZSwgJyddXG5cbiAgc3dpdGNoIChydWxlTmFtZSBhcyBrZXlvZiB0eXBlb2YgbmFtZXMpIHtcbiAgICBjYXNlICdtaW4nOlxuICAgICAgcmV0dXJuIG1pblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCcpKVxuICAgIGNhc2UgJ21heCc6XG4gICAgICByZXR1cm4gbWF4UnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsICcpKVxuICAgIGNhc2UgJ2JldHdlZW4nOlxuICAgICAgcmV0dXJuIGJldHdlZW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywgJykpXG4gICAgY2FzZSAnZW1haWwnOlxuICAgICAgcmV0dXJuIGVtYWlsUnVsZSh2YWx1ZSlcbiAgICBjYXNlICd1cmwnOlxuICAgICAgcmV0dXJuIHVybFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXVpZCc6XG4gICAgICByZXR1cm4gdXVpZFJ1bGUodmFsdWUpXG4gICAgY2FzZSAncmVnZXgnOlxuICAgICAgcmV0dXJuIHJlZ2V4UnVsZSh2YWx1ZSwgcGFyYW1zKVxuICAgIGNhc2UgJ2luJzpcbiAgICAgIHJldHVybiBpblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCAnKSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgY2hlY2s6IGZhbHNlLCBtZXNzYWdlOiBgVW5rbm93biBydWxlICR7cnVsZU5hbWV9YCwgdmFsdWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1pblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW5WYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSAocmVzdWx0LnZhbHVlIGFzIHN0cmluZykubGVuZ3RoID49IG1pblZhbHVlXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7bWluVmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbWF4UnVsZTxUPih2YWx1ZTogVCwgLi4ucGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCBtYXhWYWx1ZSA9IE51bWJlcihwYXJhbXNbMF0gPz8gJzAnKVxuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6IGBWYWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LnZhbHVlID0gcmVzdWx0LnZhbHVlLnRyaW0oKSBhcyBUXG4gICAgcmVzdWx0LmNoZWNrID0gKHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmV0d2VlblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIocGFyYW1zWzFdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IChyZXN1bHQudmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPj0gbWluVmFsdWUgJiYgKHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gY2hhcmFjdGVyc2BcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgdmFsdWUubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gZW1haWxSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJ1ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJyxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LnZhbHVlID0gdmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMoJ15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJCcsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1cmxSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJ1ZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkwnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LnZhbHVlID0gdmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMoXG4gICAgICAnXihodHRwfGh0dHBzKTpcXFxcL1xcXFwvW1xcXFx3XFxcXC1fXSsoXFxcXC5bXFxcXHdcXFxcLV9dKykrKFtcXFxcd1xcXFwtXFxcXC4sQD9ePSUmOi9+XFxcXCsjXSpbXFxcXHdcXFxcLVxcXFxAP149JSYvflxcXFwrI10pPyQnLFxuICAgICAgcmVzdWx0LnZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1dWlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICdWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQnLFxuICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlZ2V4UnVsZTxUPih2YWx1ZTogVCwgLi4ucGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZWdleCA9IHBhcmFtc1swXSA/PyAnJ1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICdWYWx1ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnVmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC52YWx1ZSA9IHJlc3VsdC52YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5pbmNsdWRlcyhyZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLm1hcChOdW1iZXIpLmluY2x1ZGVzKHZhbHVlKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cbiIsImltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YsIFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0ICogYXMgcnVsZXMgZnJvbSAnLi9ydWxlcydcbmltcG9ydCB7IGdldE5lc3RlZFZhbHVlLCBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuICBjaGVja3M6IFBhcnRpYWw8UmVjb3JkPE5lc3RlZEtleU9mPFQ+LCAoU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBydWxlc1snbmFtZXMnXT4gfCBSdWxlKVtdPj4sXG4pOiBUIHtcbiAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlXG4gIGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gW11cblxuICBPYmplY3Qua2V5cyhjaGVja3MpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKG9iaiwgcGF0aCBhcyBOZXN0ZWRLZXlPZjxUPilcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZS50cmltKCkpXG4gICAgfVxuXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSA/IHJ1bGVzLnBhcnNlKHZhbHVlLCBydWxlKSA6IHsgLi4ucnVsZSB9XG4gICAgICBpZiAocmVzdWx0LmNoZWNrKVxuICAgICAgICByZXR1cm5cbiAgICAgIGhhc0Vycm9ycyA9IHRydWVcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChyZXN1bHQubWVzc2FnZSlcbiAgICAgIHV0aWwuYXBwZW5kRXJyb3IocmVzdWx0Lm1lc3NhZ2UsICdWYWxpZGF0aW9uRXJyb3InLCBudWxsLCB7IHBhdGgsIHZhbHVlIH0pXG4gICAgfSlcbiAgfSlcblxuICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgdXRpbC5lcnJvcihlcnJvck1lc3NhZ2VzWzBdLCAnVmFsaWRhdGlvbkVycm9yJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsU0FBZ0IsUUFBUSxPQUFvQztBQUMxRCxLQUFJLE9BQU8sVUFBVSxZQUFZLENBQUMsQ0FBQyxTQUFTLE9BQU8sT0FBTyxPQUFPLFNBQVMsQ0FDeEUsUUFBTyxPQUFRLE1BQW9CLFdBQVc7QUFFaEQsUUFBTzs7QUFHVCxTQUFnQixlQUFpQyxLQUFRLE1BQTJCO0FBQ2xGLFFBQU8sS0FBSyxNQUFNLElBQUksQ0FBQyxRQUFpQixTQUFTLFFBQVEsS0FBSyxRQUFRLFFBQVMsSUFBSSxHQUM5RSxRQUFzQixPQUFPLElBQUksSUFD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
|
|
278
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
279
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogQ29udGV4dCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3R4LnJlcXVlc3QuaGVhZGVycylcbiAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0pID0+IHR5cGVvZiBwcmV2ID09PSAnc3RyaW5nJ1xuICAgICAgPyBwcmV2XG4gICAgICA6IChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBudWxsKSwgbnVsbCBhcyBzdHJpbmcgfCBudWxsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb2duaXRpdmVSZXF1ZXN0KGN0eDogQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0SGVhZGVyKCdwcmVjb2duaXRpb24nLCBjdHgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGl2ZUtleXMoY3R4OiBDb250ZXh0KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuICByZXR1cm4gcGFyc2VkXG59XG4iLCJpbXBvcnQgdHlwZSB7IFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBuYW1lcyA9IHtcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIG51bGxhYmxlOiAnbnVsbGFibGUnLFxuICBzb21ldGltZXM6ICdzb21ldGltZXMnLFxuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHVsaWQ6ICd1bGlkJyxcbiAgcmVnZXg6ICdyZWdleCcsXG4gIGluOiAnaW4nLFxuICBub3RJbjogJ25vdEluJyxcbiAgYmVmb3JlOiAnYmVmb3JlJyxcbiAgYWZ0ZXI6ICdhZnRlcicsXG59IGFzIGNvbnN0XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUPih2YWx1ZTogVCwgcnVsZTogU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBuYW1lcz4pOiBSdWxlPFQ+IHtcbiAgY29uc3QgW3J1bGVOYW1lLCBwYXJhbXNdID0gcnVsZS5pbmNsdWRlcygnOicpID8gcnVsZS5zcGxpdCgnOicsIDIpIDogW3J1bGUsICcnXVxuXG4gIHN3aXRjaCAocnVsZU5hbWUgYXMga2V5b2YgdHlwZW9mIG5hbWVzKSB7XG4gICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgcmV0dXJuIHJlcXVpcmVkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdudWxsYWJsZSc6XG4gICAgICByZXR1cm4gbnVsbGFibGVSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3NvbWV0aW1lcyc6XG4gICAgICByZXR1cm4gc29tZXRpbWVzUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdtaW4nOlxuICAgICAgcmV0dXJuIG1pblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCcpKVxuICAgIGNhc2UgJ21heCc6XG4gICAgICByZXR1cm4gbWF4UnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsJykpXG4gICAgY2FzZSAnYmV0d2Vlbic6XG4gICAgICByZXR1cm4gYmV0d2VlblJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCcpKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3VsaWQnOlxuICAgICAgcmV0dXJuIHVsaWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtcylcbiAgICBjYXNlICdpbic6XG4gICAgICByZXR1cm4gaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBjYXNlICdub3RJbic6XG4gICAgICByZXR1cm4gbm90SW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgY2hlY2s6IGZhbHNlLCBtZXNzYWdlOiBgVW5rbm93biBydWxlICR7cnVsZU5hbWV9YCwgdmFsdWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1pblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke21pblZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IChyZXN1bHQudmFsdWUpLmxlbmd0aCA+PSBtaW5WYWx1ZVxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAke21pblZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG1heFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmV0d2VlblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIocGFyYW1zWzBdID8/ICcwJylcbiAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIocGFyYW1zWzFdID8/ICcwJylcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID49IG1pblZhbHVlICYmIHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiAocmVzdWx0LnZhbHVlKS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9IGNoYXJhY3RlcnNgXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlICYmIHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGVtYWlsUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJyxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKCdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnLCByZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gdXJsUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVUkwnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15odHRwcz86XFxcXC9cXFxcLyh3d3dcXFxcLik/Wy1hLXpBLVowLTlAOiUuX1xcXFwrfiM9XXsxLDI1Nn1cXFxcLlthLXpBLVowLTkoKV17MSw2fVxcXFxiKFstYS16QS1aMC05KClAOiVfXFxcXCsufiM/Ji8vPV0qKSR8Xmh0dHBzPzpcXFxcL1xcXFwvKGxvY2FsaG9zdHxcXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9KSg6XFxcXGQrKT8oXFxcXC8uKik/JCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHV1aWRSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIFVVSUQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1bGlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVTElEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBVTElEIGZvcm1hdDogMjYgY2hhcmFjdGVycywgYmFzZTMyIGVuY29kZWQgKDAtOSwgQS1aIGV4Y2x1ZGluZyBJLCBMLCBPLCBVKVxuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXXsyNn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWdleFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVnZXggPSBwYXJhbXNbMF0gPz8gJydcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLmluY2x1ZGVzKHJlc3VsdC52YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5tYXAoTnVtYmVyKS5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG5vdEluUnVsZTxUPih2YWx1ZTogVCwgLi4ucGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3Qgbm90IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gIXBhcmFtcy5pbmNsdWRlcyhyZXN1bHQudmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSAhcGFyYW1zLm1hcChOdW1iZXIpLmluY2x1ZGVzKHZhbHVlKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkUnVsZTxUPih2YWx1ZTogVCwgLi4uX3BhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIGlzIHJlcXVpcmVkJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSByZXN1bHQudmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmIChpc0FycmF5KHJlc3VsdC52YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSByZXN1bHQudmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJlc3VsdC5jaGVjayA9IGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBudWxsYWJsZVJ1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHNvbWV0aW1lc1J1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUsIC4uLl9wYXJhbXMpXG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mLCBSdWxlLCBTaG9ydFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgcnVsZXNbJ25hbWVzJ10+IHwgUnVsZSlbXT4+LFxuKTogVCB7XG4gIGxldCBoYXNFcnJvcnMgPSBmYWxzZVxuICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpIDogeyAuLi5ydWxlIH1cbiAgICAgIGlmIChyZXN1bHQuY2hlY2spXG4gICAgICAgIHJldHVyblxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSByZXN1bHQubWVzc2FnZS5yZXBsYWNlKCc6YXR0cmlidXRlJywgZm9ybWF0QXR0cmlidXRlTmFtZShwYXRoKSlcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChyZXN1bHQubWVzc2FnZSlcbiAgICAgIHV0aWwuYXBwZW5kRXJyb3IocmVzdWx0Lm1lc3NhZ2UsICdWYWxpZGF0aW9uRXJyb3InLCBudWxsLCB7IHBhdGgsIHZhbHVlIH0pXG4gICAgICBpZiAocnVsZSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICBza2lwID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKGhhc0Vycm9ycykge1xuICAgIHV0aWwuZXJyb3IoZXJyb3JNZXNzYWdlc1swXSwgJ1ZhbGlkYXRpb25FcnJvcicpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVWYWxpZGF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBjdHg6IENvbnRleHQ8VD4sXG4gIGNoZWNrczogUGFydGlhbDxSZWNvcmQ8TmVzdGVkS2V5T2Y8VD4sIChTaG9ydFJ1bGU8a2V5b2YgdHlwZW9mIHJ1bGVzWyduYW1lcyddPiB8IFJ1bGUpW10+Pixcbik6IFQge1xuICBpZiAoIWlzUHJlY29nbml0aXZlUmVxdWVzdChjdHgpKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MpXG4gIH1cbiAgY29uc3QgdmFsaWRhdGlvbktleXMgPSBwcmVjb2duaXRpdmVLZXlzKGN0eClcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24nLCAndHJ1ZScpXG5cbiAgaWYgKCF2YWxpZGF0aW9uS2V5cykge1xuICAgIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MpXG4gICAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG4gIH1cblxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgdmFsaWRhdGlvbktleXMuam9pbignLCcpKVxuICBjb25zdCBwcmVjb2duaXRpb25DaGVja3MgPSB7fSBhcyBQYXJ0aWFsPHR5cGVvZiBjaGVja3M+XG4gIHZhbGlkYXRpb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHByZWNvZ25pdGlvbkNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dID0gY2hlY2tzW2tleSBhcyBOZXN0ZWRLZXlPZjxUPl1cbiAgfSlcblxuICB2YWxpZGF0ZShjdHguYXJncywgcHJlY29nbml0aW9uQ2hlY2tzKVxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1TdWNjZXNzJywgJ3RydWUnKVxuICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBdHRyaWJ1dGVOYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IHtcbiAgICBpZiAodXRpbC5tYXRjaGVzKCdeXFxkKyQnLCBwYXJ0KSkge1xuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cbiAgICByZXR1cm4gYWNjID8gYCR7YWNjfSAke3BhcnQudG9Mb3dlckNhc2UoKX1gIDogcGFydC50b0xvd2VyQ2FzZSgpXG4gIH0sICcnKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFRQSxTQUFnQixRQUFRLE9BQW9DO0FBQzFELEtBQUksT0FBTyxVQUFVLFlBQVksQ0FBQyxDQUFDLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxDQUN4RSxRQUFPLE9BQVEsTUFBb0IsV0FBVztBQUVoRCxRQUFPOztBQUdULFNBQWdCLGVBQWlDLEtBQVEsTUFBMkI7QUFDbEYsUUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQWlCLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUyxJQUFJLEdBQzlFLFFBQXNCLE9BQU8sSUFBSSxJQUNqQyxRQUFvQyxNQUFNLElBQUk7O0FBR3JELFNBQWdCLGVBQWlDLEtBQVEsTUFBc0IsT0FBc0I7Q0FDbkcsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQzVCLEtBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsTUFBSSxLQUFLLE1BQTBCO0FBQ25DOztDQUVGLE1BQU0sVUFBVSxLQUFLLEtBQUs7Q0FDMUIsTUFBTSxlQUFlLGVBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFtQjtBQUMxRSxLQUFJLE9BQU8saUJBQWlCLFlBQVksQ0FBQyxDQUFDLGFBQ3hDLGNBQWEsV0FBVzs7QUFJNUIsU0FBZ0IsVUFBVSxNQUFjLEtBQTZCO0FBQ25FLFFB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
|
package/package.json
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sot1986/appsync-precognition",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.3",
|
|
5
5
|
"description": "JavaScript resolver validation utilities for AWS AppSync",
|
|
6
6
|
"author": "sot1986",
|
|
7
7
|
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/sot1986/appsync-precognition.git"
|
|
11
|
+
},
|
|
8
12
|
"keywords": [
|
|
9
13
|
"appsync",
|
|
10
14
|
"validation",
|
|
11
15
|
"resolver",
|
|
12
|
-
"aws"
|
|
16
|
+
"aws",
|
|
17
|
+
"precognition"
|
|
13
18
|
],
|
|
14
19
|
"exports": {
|
|
15
20
|
".": {
|
|
@@ -28,7 +33,6 @@
|
|
|
28
33
|
"scripts": {
|
|
29
34
|
"build": "tsdown --format esm --config tsdown.config.ts",
|
|
30
35
|
"bundle": "cd playground && ./bundle-resolvers.sh && cd .. && eslint --ext playground/resolvers/**/*.{ts,js} . --fix",
|
|
31
|
-
"prepublishOnly": "pnpm run build",
|
|
32
36
|
"test": "vitest",
|
|
33
37
|
"lint:resolvers": "eslint --ext playground/resolvers/**/*.{ts,js} . --fix"
|
|
34
38
|
},
|