@sot1986/appsync-precognition 0.1.2 → 0.2.0
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 +3 -16
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -382
- package/dist/index.js.map +1 -0
- package/dist/types-1ORDfyL5.d.ts +16 -0
- package/dist/types-1ORDfyL5.d.ts.map +1 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +1 -0
- package/dist/utils.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
check: boolean;
|
|
4
|
-
message: string;
|
|
5
|
-
value: T;
|
|
6
|
-
}
|
|
7
|
-
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];
|
|
8
|
-
type ArrayKeys<T extends unknown[]> = T extends [unknown, ...unknown[]] ? T extends Record<infer Index, unknown> ? Index extends `${number}` ? Index : never : never : `${number}`;
|
|
9
|
-
type ObjectKeys<T extends object> = T extends unknown[] ? ArrayKeys<T> : keyof T & string;
|
|
10
|
-
interface HasConstructor {
|
|
11
|
-
new (...args: unknown[]): unknown;
|
|
12
|
-
}
|
|
13
|
-
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;
|
|
14
|
-
//#endregion
|
|
1
|
+
import { n as NestedKeyOf, r as Rule, t as FullRule } from "./types-1ORDfyL5.js";
|
|
2
|
+
|
|
15
3
|
//#region src/index.d.ts
|
|
16
4
|
declare function validate<T extends { [key in keyof T & string]: T[key] }>(obj: Partial<T>, checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule<T>)[]>>, options?: {
|
|
17
5
|
trim?: boolean;
|
|
@@ -29,5 +17,4 @@ declare function precognitiveValidation<T extends { [key in keyof T & string]: T
|
|
|
29
17
|
}): T;
|
|
30
18
|
declare function formatAttributeName(path: string): string;
|
|
31
19
|
//#endregion
|
|
32
|
-
export { formatAttributeName, precognitiveValidation, validate };
|
|
33
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6IjtBQUVpQixVQUFBLElBQUEsQ0FBQSxJQUdSLE9BQUEsQ0FBQSxDQUFBO0VBR1QsS0FBWSxFQUFBLE9BQUE7RUF1QkwsT0FFRixFQUFBLE1BQUE7RUFDRCxLQUFBLEVBN0JLLENBNkJMOztBQUNZLEtBM0JKLFFBQUEsR0EyQkksVUFBQSxHQUFBLFVBQUEsR0FBQSxXQUFBLEdBQUEsUUFBQSxHQUFBLFNBQUEsR0FBQSxRQUFBLEdBQUEsT0FBQSxHQUFBLFFBQUEsR0FBQSxNQUFBLEdBQUEsQ0FBQSxLQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxLQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxTQUFBLEVBQUEsTUFBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLE9BQUEsR0FBQSxLQUFBLEdBQUEsTUFBQSxHQUFBLE1BQUEsR0FBQSxDQUFBLE9BQUEsRUFBQSxNQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsRUFBQSxHQUFBLENBQUEsTUFBQSxHQUFBLE1BQUEsR0FBQSxPQUFBLEdBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsT0FBQSxFQUFBLEdBQUEsQ0FBQSxNQUFBLEdBQUEsTUFBQSxHQUFBLE9BQUEsR0FBQSxJQUFBLENBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxPQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxRQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxjQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxlQUFBLEVBQUEsTUFBQSxDQUFBO0tBRlgsU0FFVyxDQUFBLFVBQUEsT0FBQSxFQUFBLENBQUEsR0FEWixDQUNZLFNBQUEsQ0FBQSxPQUFBLEVBQUEsR0FBQSxPQUFBLEVBQUEsQ0FBQSxHQUFWLENBQVUsU0FBQSxNQUFBLENBQUEsS0FB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
|
|
20
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;iBAKgB,mCAAmC,aAAa,EAAE,aAC3D,QAAQ,YACL,QAAQ,OAAO,YAAY,KAAK,WAAW,KAAK,gBAFP;;EAAnD,gBAAgB,CAAA,EAAA,OAAA;CAAmC,CAAA,EAOhD,CAPgD;AAAa,iBAqDhD,sBArDgD,CAAA,UAAA,UAAA,MAsDpC,CAtDoC,GAAA,MAAA,GAsDvB,CAtDuB,CAsDrB,GAtDqB,CAAA,EAAA,CAAA,CAAA,GAAA,EAAA;EAAE,OAAA,EAAA;IACnD,OAAA,EAAA,GAAA;EAAR,CAAA;EAC8B,IAAA,EAsDK,OAtDL,CAsDa,CAtDb,CAAA;CAAZ,EAAA,MAAA,EAuDf,OAvDe,CAuDP,MAvDO,CAuDA,WAvDA,CAuDY,CAvDZ,CAAA,EAAA,CAuDiB,QAvDjB,GAuD4B,IAvD5B,CAuDiC,CAvDjC,CAAA,CAAA,EAAA,CAAA,CAAA,EAAA,OAAP,CAAO,EAAA;EAAiB,IAAA,CAAA,EAAA,OAAA;EAAgB,gBAAA,CAAA,EAAA,OAAA;EAAL,MAAA,CAAA,EAAA,KAAA,GAAA,MAAA;CAAnC,CAAA,EA6Df,CA7De;AAAR,iBAqFM,mBAAA,CArFN,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,382 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
//#region src/utils.ts
|
|
4
|
-
function isArray(value) {
|
|
5
|
-
if (typeof value === "object" && !!value && Object.hasOwn(value, "length")) return typeof value.length === "number";
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
function getNestedValue(obj, path) {
|
|
9
|
-
return path.split(".").reduce((current, key) => util.matches("^d+$", key) ? current[Number(key)] : current[key], obj);
|
|
10
|
-
}
|
|
11
|
-
function setNestedValue(obj, path, value) {
|
|
12
|
-
const keys = path.split(".");
|
|
13
|
-
if (keys.length === 1) {
|
|
14
|
-
obj[keys[0]] = value;
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
const lastKey = keys.pop();
|
|
18
|
-
const parentObject = getNestedValue(obj, keys.join("."));
|
|
19
|
-
if (typeof parentObject === "object" && !!parentObject) parentObject[lastKey] = value;
|
|
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, options) {
|
|
32
|
-
if (options?.trim === false) return value;
|
|
33
|
-
let parsed = value.trim();
|
|
34
|
-
if (options?.allowEmptyString) return parsed;
|
|
35
|
-
if (parsed === "") parsed = null;
|
|
36
|
-
return parsed;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region src/rules.ts
|
|
41
|
-
function parse(value, rule) {
|
|
42
|
-
const [name, ...params] = typeof rule === "string" ? [rule, void 0] : [rule[0], ...rule.slice(1)];
|
|
43
|
-
switch (name) {
|
|
44
|
-
case "required": return requiredRule(value);
|
|
45
|
-
case "nullable": return nullableRule(value);
|
|
46
|
-
case "sometimes": return sometimesRule(value);
|
|
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]);
|
|
50
|
-
case "email": return emailRule(value);
|
|
51
|
-
case "url": return urlRule(value);
|
|
52
|
-
case "uuid": return uuidRule(value);
|
|
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]);
|
|
67
|
-
default: return {
|
|
68
|
-
check: false,
|
|
69
|
-
message: `Unknown rule ${name}`,
|
|
70
|
-
value
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function minRule(value, minValue) {
|
|
75
|
-
const result = {
|
|
76
|
-
check: false,
|
|
77
|
-
message: `:attribute must be greater than or equal to ${minValue}`,
|
|
78
|
-
value
|
|
79
|
-
};
|
|
80
|
-
if (typeof value === "number") result.check = value >= minValue;
|
|
81
|
-
if (typeof value === "string") result.check = value.length >= minValue;
|
|
82
|
-
if (isArray(value)) {
|
|
83
|
-
result.check = value.length >= minValue;
|
|
84
|
-
result.message = `Array must contain at least ${minValue} elements`;
|
|
85
|
-
}
|
|
86
|
-
return result;
|
|
87
|
-
}
|
|
88
|
-
function maxRule(value, maxValue) {
|
|
89
|
-
const result = {
|
|
90
|
-
check: false,
|
|
91
|
-
message: `:attribute must be less than or equal to ${maxValue}`,
|
|
92
|
-
value
|
|
93
|
-
};
|
|
94
|
-
if (typeof value === "number") result.check = value <= maxValue;
|
|
95
|
-
if (typeof value === "string") {
|
|
96
|
-
result.check = value.length <= maxValue;
|
|
97
|
-
result.message = `String must contain at most ${maxValue} characters`;
|
|
98
|
-
}
|
|
99
|
-
if (isArray(value)) {
|
|
100
|
-
result.check = value.length <= maxValue;
|
|
101
|
-
result.message = `Array must contain at most ${maxValue} elements`;
|
|
102
|
-
}
|
|
103
|
-
return result;
|
|
104
|
-
}
|
|
105
|
-
function betweenRule(value, minValue, maxValue) {
|
|
106
|
-
const result = {
|
|
107
|
-
check: false,
|
|
108
|
-
message: `:attribute must be between ${minValue} and ${maxValue}`,
|
|
109
|
-
value
|
|
110
|
-
};
|
|
111
|
-
if (typeof value === "number") result.check = value >= minValue && value <= maxValue;
|
|
112
|
-
if (typeof value === "string") {
|
|
113
|
-
result.check = value.length >= minValue && value.length <= maxValue;
|
|
114
|
-
result.message = `String must contain between ${minValue} and ${maxValue} characters`;
|
|
115
|
-
}
|
|
116
|
-
if (isArray(value)) {
|
|
117
|
-
result.check = value.length >= minValue && value.length <= maxValue;
|
|
118
|
-
result.message = `Array must contain between ${minValue} and ${maxValue} elements`;
|
|
119
|
-
}
|
|
120
|
-
return result;
|
|
121
|
-
}
|
|
122
|
-
function emailRule(value) {
|
|
123
|
-
const result = {
|
|
124
|
-
check: false,
|
|
125
|
-
message: ":attribute must be a valid email address",
|
|
126
|
-
value
|
|
127
|
-
};
|
|
128
|
-
if (typeof value === "string") result.check = util.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", value);
|
|
129
|
-
return result;
|
|
130
|
-
}
|
|
131
|
-
function urlRule(value) {
|
|
132
|
-
const result = {
|
|
133
|
-
check: false,
|
|
134
|
-
message: ":attribute must be a valid URL",
|
|
135
|
-
value
|
|
136
|
-
};
|
|
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);
|
|
138
|
-
return result;
|
|
139
|
-
}
|
|
140
|
-
function uuidRule(value) {
|
|
141
|
-
const result = {
|
|
142
|
-
check: false,
|
|
143
|
-
message: ":attribute must be a valid UUID",
|
|
144
|
-
value
|
|
145
|
-
};
|
|
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);
|
|
156
|
-
return result;
|
|
157
|
-
}
|
|
158
|
-
function regexRule(value, pattern) {
|
|
159
|
-
const result = {
|
|
160
|
-
check: false,
|
|
161
|
-
message: ":attribute must match the specified regular expression",
|
|
162
|
-
value
|
|
163
|
-
};
|
|
164
|
-
if (typeof value === "string") {
|
|
165
|
-
result.value = value.trim();
|
|
166
|
-
result.check = util.matches(pattern, result.value);
|
|
167
|
-
}
|
|
168
|
-
return result;
|
|
169
|
-
}
|
|
170
|
-
function inRule(value, ...params) {
|
|
171
|
-
return {
|
|
172
|
-
check: params.includes(value),
|
|
173
|
-
message: ":attribute must be one of the specified values",
|
|
174
|
-
value
|
|
175
|
-
};
|
|
176
|
-
}
|
|
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) {
|
|
185
|
-
const result = {
|
|
186
|
-
check: true,
|
|
187
|
-
message: ":attribute is required",
|
|
188
|
-
value
|
|
189
|
-
};
|
|
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;
|
|
199
|
-
return result;
|
|
200
|
-
}
|
|
201
|
-
function nullableRule(value) {
|
|
202
|
-
return {
|
|
203
|
-
check: true,
|
|
204
|
-
message: "",
|
|
205
|
-
value
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
function sometimesRule(value) {
|
|
209
|
-
const result = {
|
|
210
|
-
check: true,
|
|
211
|
-
message: "",
|
|
212
|
-
value
|
|
213
|
-
};
|
|
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;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
//#endregion
|
|
322
|
-
//#region src/index.ts
|
|
323
|
-
function validate(obj, checks, options) {
|
|
324
|
-
let error = {};
|
|
325
|
-
Object.keys(checks).forEach((path) => {
|
|
326
|
-
let value = getNestedValue(obj, path);
|
|
327
|
-
if (typeof value === "string") {
|
|
328
|
-
value = cleanString(value, options);
|
|
329
|
-
setNestedValue(obj, path, value);
|
|
330
|
-
}
|
|
331
|
-
let skip = false;
|
|
332
|
-
checks[path]?.forEach((rule) => {
|
|
333
|
-
if (skip) return;
|
|
334
|
-
if (rule === "nullable" && value === null) skip = true;
|
|
335
|
-
if (rule === "sometimes" && typeof value === "undefined") skip = true;
|
|
336
|
-
const result = typeof rule === "string" || isArray(rule) ? parse(value, rule) : { ...rule };
|
|
337
|
-
if (result.check) return;
|
|
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;
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
if (!error.msg) return obj;
|
|
353
|
-
util.error(error.msg, error.errorType, error.data, error.errorInfo);
|
|
354
|
-
}
|
|
355
|
-
function precognitiveValidation(ctx, checks, options) {
|
|
356
|
-
if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks, options);
|
|
357
|
-
const validationKeys = precognitiveKeys(ctx);
|
|
358
|
-
util.http.addResponseHeader("Precognition", "true");
|
|
359
|
-
if (!validationKeys) {
|
|
360
|
-
validate(ctx.args, checks, options);
|
|
361
|
-
util.http.addResponseHeader("Precognition-Success", "true");
|
|
362
|
-
runtime.earlyReturn(null);
|
|
363
|
-
}
|
|
364
|
-
util.http.addResponseHeader("Precognition-Validate-Only", validationKeys.join(","));
|
|
365
|
-
const precognitionChecks = {};
|
|
366
|
-
validationKeys.forEach((key) => {
|
|
367
|
-
precognitionChecks[key] = checks[key];
|
|
368
|
-
});
|
|
369
|
-
validate(ctx.args, precognitionChecks, options);
|
|
370
|
-
util.http.addResponseHeader("Precognition-Success", "true");
|
|
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
|
-
}, "");
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
//#endregion
|
|
381
|
-
export { formatAttributeName, precognitiveValidation, validate };
|
|
382
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvcjogeyBtc2c/OiBzdHJpbmcsIGVycm9yVHlwZT86IHN0cmluZywgZGF0YT86IGFueSwgZXJyb3JJbmZvPzogYW55IH0iLCJydWxlcy5wYXJzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9ydWxlcy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5rbm93bltdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISF2YWx1ZSAmJiBPYmplY3QuaGFzT3duKHZhbHVlLCAnbGVuZ3RoJykpIHtcbiAgICByZXR1cm4gdHlwZW9mICh2YWx1ZSBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gJ251bWJlcidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlPFQgZXh0ZW5kcyB7IFtrZXkgaW4ga2V5b2YgVCAmIHN0cmluZ106IFRba2V5XSB9PihvYmo6IFBhcnRpYWw8VD4sIHBhdGg6IE5lc3RlZEtleU9mPFQ+KTogYW55IHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2U8dW5rbm93bj4oKGN1cnJlbnQsIGtleSkgPT4gdXRpbC5tYXRjaGVzKCdeXFxkKyQnLCBrZXkpXG4gICAgPyAoY3VycmVudCBhcyB1bmtub3duW10pW051bWJlcihrZXkpXVxuICAgIDogKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sIG9iailcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQgZXh0ZW5kcyB7IFtrZXkgaW4ga2V5b2YgVCAmIHN0cmluZ106IFRba2V5XSB9PihvYmo6IFBhcnRpYWw8VD4sIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogeyByZXF1ZXN0OiB7IGhlYWRlcnM6IGFueSB9IH0pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGN0eC5yZXF1ZXN0LmhlYWRlcnMpXG4gICAgLnJlZHVjZSgocHJldiwgW2tleSwgdmFsdWVdKSA9PiB0eXBlb2YgcHJldiA9PT0gJ3N0cmluZydcbiAgICAgID8gcHJldlxuICAgICAgOiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogbnVsbCksIG51bGwgYXMgc3RyaW5nIHwgbnVsbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlY29nbml0aXZlUmVxdWVzdChjdHg6IHsgcmVxdWVzdDogeyBoZWFkZXJzOiBhbnkgfSB9KTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRIZWFkZXIoJ3ByZWNvZ25pdGlvbicsIGN0eCkgPT09ICd0cnVlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlY29nbml0aXZlS2V5cyhjdHg6IHsgcmVxdWVzdDogeyBoZWFkZXJzOiBhbnkgfSB9KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzoge1xuICB0cmltPzogYm9vbGVhblxuICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhblxufSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucz8udHJpbSA9PT0gZmFsc2UpXG4gICAgcmV0dXJuIHZhbHVlXG5cbiAgbGV0IHBhcnNlZDogc3RyaW5nIHwgbnVsbCA9IHZhbHVlLnRyaW0oKVxuXG4gIGlmIChvcHRpb25zPy5hbGxvd0VtcHR5U3RyaW5nKVxuICAgIHJldHVybiBwYXJzZWRcblxuICBpZiAocGFyc2VkID09PSAnJylcbiAgICBwYXJzZWQgPSBudWxsXG5cbiAgcmV0dXJuIHBhcnNlZFxufVxuIiwiaW1wb3J0IHR5cGUgeyBGdWxsUnVsZSwgUnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUPih2YWx1ZTogVCwgcnVsZTogRnVsbFJ1bGUpOiBSdWxlPFQ+IHtcbiAgY29uc3QgW25hbWUsIC4uLnBhcmFtc10gPSB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICA/IFtydWxlLCB1bmRlZmluZWRdXG4gICAgOiBbcnVsZVswXSwgLi4ucnVsZS5zbGljZSgxKV1cblxuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdyZXF1aXJlZCc6XG4gICAgICByZXR1cm4gcmVxdWlyZWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ251bGxhYmxlJzpcbiAgICAgIHJldHVybiBudWxsYWJsZVJ1bGUodmFsdWUpXG4gICAgY2FzZSAnc29tZXRpbWVzJzpcbiAgICAgIHJldHVybiBzb21ldGltZXNSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ21pbic6XG4gICAgICByZXR1cm4gbWluUnVsZSh2YWx1ZSwgKHBhcmFtc1swXSEgYXMgbnVtYmVyKSlcbiAgICBjYXNlICdtYXgnOlxuICAgICAgcmV0dXJuIG1heFJ1bGUodmFsdWUsIChwYXJhbXNbMF0gYXMgbnVtYmVyKSlcbiAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgIHJldHVybiBiZXR3ZWVuUnVsZSh2YWx1ZSwgKHBhcmFtc1swXSBhcyBudW1iZXIpLCBwYXJhbXNbMV0gYXMgbnVtYmVyKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3VsaWQnOlxuICAgICAgcmV0dXJuIHVsaWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtc1swXSBhcyBzdHJpbmcpXG4gICAgY2FzZSAnaW4nOlxuICAgICAgcmV0dXJuIGluUnVsZSh2YWx1ZSwgLi4ucGFyYW1zKVxuICAgIGNhc2UgJ25vdEluJzpcbiAgICAgIHJldHVybiBub3RJblJ1bGUodmFsdWUsIC4uLnBhcmFtcylcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4gYXJyYXlSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICByZXR1cm4gb2JqZWN0UnVsZSh2YWx1ZSlcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiBib29sZWFuUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIG51bWJlclJ1bGUodmFsdWUpXG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHJldHVybiBzdHJpbmdSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgcmV0dXJuIGRhdGVSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ2JlZm9yZSc6XG4gICAgICByZXR1cm4gYmVmb3JlUnVsZSh2YWx1ZSwgcGFyYW1zWzBdIGFzIHN0cmluZylcbiAgICBjYXNlICdhZnRlcic6XG4gICAgICByZXR1cm4gYWZ0ZXJSdWxlKHZhbHVlLCBwYXJhbXNbMF0gYXMgc3RyaW5nKVxuICAgIGNhc2UgJ2JlZm9yZU9yRXF1YWwnOlxuICAgICAgcmV0dXJuIGJlZm9yZU9yRXF1YWxSdWxlKHZhbHVlLCBwYXJhbXNbMF0gYXMgc3RyaW5nKVxuICAgIGNhc2UgJ2FmdGVyT3JFcXVhbCc6XG4gICAgICByZXR1cm4gYWZ0ZXJPckVxdWFsUnVsZSh2YWx1ZSwgcGFyYW1zWzBdIGFzIHN0cmluZylcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgY2hlY2s6IGZhbHNlLCBtZXNzYWdlOiBgVW5rbm93biBydWxlICR7bmFtZX1gLCB2YWx1ZSB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWluUnVsZTxUPih2YWx1ZTogVCwgbWluVmFsdWU6IG51bWJlcik6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6IGA6YXR0cmlidXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bWluVmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID49IG1pblZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWVcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5WYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBtYXhSdWxlPFQ+KHZhbHVlOiBULCBtYXhWYWx1ZTogbnVtYmVyKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXhWYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGNoYXJhY3RlcnNgXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGF0IG1vc3QgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBiZXR3ZWVuUnVsZTxUPih2YWx1ZTogVCwgbWluVmFsdWU6IG51bWJlciwgbWF4VmFsdWU6IG51bWJlcik6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6IGA6YXR0cmlidXRlIG11c3QgYmUgYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWUgJiYgdmFsdWUgPD0gbWF4VmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9IGNoYXJhY3RlcnNgXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlICYmIHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGVtYWlsUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJyxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKCdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnLCB2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeaHR0cHM/OlxcXFwvXFxcXC8od3d3XFxcXC4pP1stYS16QS1aMC05QDolLl9cXFxcK34jPV17MSwyNTZ9XFxcXC5bYS16QS1aMC05KCldezEsNn1cXFxcYihbLWEtekEtWjAtOSgpQDolX1xcXFwrLn4jPyYvLz1dKikkfF5odHRwcz86XFxcXC9cXFxcLyhsb2NhbGhvc3R8XFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfSkoOlxcXFxkKyk/KFxcXFwvLiopPyQnLFxuICAgICAgcmVzdWx0LnZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1dWlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVVUlEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1bGlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVTElEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIC8vIFVMSUQgZm9ybWF0OiAyNiBjaGFyYWN0ZXJzLCBiYXNlMzIgZW5jb2RlZCAoMC05LCBBLVogZXhjbHVkaW5nIEksIEwsIE8sIFUpXG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15bMDEyMzQ1Njc4OUFCQ0RFRkdISktNTlBRUlNUVldYWVpdezI2fSQnLFxuICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlZ2V4UnVsZTxUPih2YWx1ZTogVCwgcGF0dGVybjogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbicsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSB2YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhwYXR0ZXJuLCByZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHVua25vd25bXSk6IFJ1bGU8VD4ge1xuICByZXR1cm4ge1xuICAgIGNoZWNrOiBwYXJhbXMuaW5jbHVkZXModmFsdWUpLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzJyxcbiAgICB2YWx1ZSxcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RJblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogdW5rbm93bltdKTogUnVsZTxUPiB7XG4gIHJldHVybiB7XG4gICAgY2hlY2s6ICFwYXJhbXMuaW5jbHVkZXModmFsdWUpLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3Qgbm90IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgaXMgcmVxdWlyZWQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXJlc3VsdC52YWx1ZSkge1xuICAgIHJlc3VsdC5tZXNzYWdlID0gJzphdHRyaWJ1dGUgaXMgbm90IG51bGxhYmxlJ1xuICAgIHJlc3VsdC5jaGVjayA9IGZhbHNlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHNvbWV0aW1lc1J1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGFycmF5UnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYW4gYXJyYXknLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG9iamVjdFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGFuIG9iamVjdCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIWlzQXJyYXkocmVzdWx0LnZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5SdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIGJvb2xlYW4nLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG51bWJlclJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgbnVtYmVyJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1J1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgc3RyaW5nJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGRhdGVSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIGRhdGUnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15cXFxcZHs0fS0oMFsxLTldfDFbMC0yXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pVChbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkOlswLTVdXFxcXGQoXFxcXC5cXFxcZHsxLDZ9KT9aJCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJlZm9yZVJ1bGU8VD4odmFsdWU6IFQsIHN0YXJ0OiBzdHJpbmcpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJlZm9yZSAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPCBzdGFydFZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDwgc3RhcnRWYWx1ZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYWZ0ZXJSdWxlPFQ+KHZhbHVlOiBULCBzdGFydDogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBhZnRlciAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPiBzdGFydFZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID4gc3RhcnRWYWx1ZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmVmb3JlT3JFcXVhbFJ1bGU8VD4odmFsdWU6IFQsIHN0YXJ0OiBzdHJpbmcpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJlZm9yZSBvciBlcXVhbCB0byAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPD0gc3RhcnRWYWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBzdGFydFZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBhZnRlck9yRXF1YWxSdWxlPFQ+KHZhbHVlOiBULCBzdGFydDogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBhZnRlciBvciBlcXVhbCB0byAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPj0gc3RhcnRWYWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBzdGFydFZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiaW1wb3J0IHR5cGUgeyBGdWxsUnVsZSwgTmVzdGVkS2V5T2YsIFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzQXJyYXksIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIHsgW2tleSBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtrZXldIH0+KFxuICBvYmo6IFBhcnRpYWw8VD4sXG4gIGNoZWNrczogUGFydGlhbDxSZWNvcmQ8TmVzdGVkS2V5T2Y8VD4sIChGdWxsUnVsZSB8IFJ1bGU8VD4pW10+PixcbiAgb3B0aW9ucz86IHtcbiAgICB0cmltPzogYm9vbGVhblxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuXG4gIH0sXG4pOiBUIHtcbiAgbGV0IGVycm9yOiB7IG1zZz86IHN0cmluZywgZXJyb3JUeXBlPzogc3RyaW5nLCBkYXRhPzogYW55LCBlcnJvckluZm8/OiBhbnkgfSA9IHt9XG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlLCBvcHRpb25zKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpXG4gICAgICAgIHNraXAgPSB0cnVlXG5cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICBza2lwID0gdHJ1ZVxuXG4gICAgICBjb25zdCByZXN1bHQgPSAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnIHx8IGlzQXJyYXkocnVsZSkpXG4gICAgICAgID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpXG4gICAgICAgIDogeyAuLi5ydWxlIH1cblxuICAgICAgaWYgKHJlc3VsdC5jaGVjaylcbiAgICAgICAgcmV0dXJuXG5cbiAgICAgIGlmIChlcnJvci5tc2cpXG4gICAgICAgIHV0aWwuYXBwZW5kRXJyb3IoZXJyb3IubXNnLCBlcnJvci5lcnJvclR5cGUsIGVycm9yLmRhdGEsIGVycm9yLmVycm9ySW5mbylcblxuICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSByZXN1bHQubWVzc2FnZS5yZXBsYWNlKCc6YXR0cmlidXRlJywgZm9ybWF0QXR0cmlidXRlTmFtZShwYXRoKSlcbiAgICAgIGVycm9yID0ge1xuICAgICAgICBtc2c6IHJlc3VsdC5tZXNzYWdlLFxuICAgICAgICBlcnJvclR5cGU6ICdWYWxpZGF0aW9uRXJyb3InLFxuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBlcnJvckluZm86IHsgcGF0aCwgdmFsdWUgfSxcbiAgICAgIH1cblxuICAgICAgc2tpcCA9IHRydWVcbiAgICB9KVxuICB9KVxuXG4gIGlmICghZXJyb3IubXNnKSB7XG4gICAgcmV0dXJuIG9iaiBhcyBUXG4gIH1cblxuICB1dGlsLmVycm9yKGVycm9yLm1zZywgZXJyb3IuZXJyb3JUeXBlLCBlcnJvci5kYXRhLCBlcnJvci5lcnJvckluZm8pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVWYWxpZGF0aW9uPFxuICBUIGV4dGVuZHMgeyBba2V5IGluIGtleW9mIFQgJiBzdHJpbmddOiBUW2tleV0gfSxcbj4oXG4gIGN0eDogeyByZXF1ZXN0OiB7IGhlYWRlcnM6IGFueSB9LCBhcmdzOiBQYXJ0aWFsPFQ+IH0sXG4gIGNoZWNrczogUGFydGlhbDxSZWNvcmQ8TmVzdGVkS2V5T2Y8VD4sIChGdWxsUnVsZSB8IFJ1bGU8VD4pW10+PixcbiAgb3B0aW9ucz86IHtcbiAgICB0cmltPzogYm9vbGVhblxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuXG4gICAgc2tpcFRvPzogJ0VORCcgfCAnTkVYVCdcbiAgfSxcbik6IFQge1xuICBpZiAoIWlzUHJlY29nbml0aXZlUmVxdWVzdChjdHgpKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlPFQ+KGN0eC5hcmdzLCBjaGVja3MsIG9wdGlvbnMpXG4gIH1cbiAgY29uc3QgdmFsaWRhdGlvbktleXMgPSBwcmVjb2duaXRpdmVLZXlzKGN0eClcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24nLCAndHJ1ZScpXG5cbiAgaWYgKCF2YWxpZGF0aW9uS2V5cykge1xuICAgIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MsIG9wdGlvbnMpXG4gICAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG4gIH1cblxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgdmFsaWRhdGlvbktleXMuam9pbignLCcpKVxuICBjb25zdCBwcmVjb2duaXRpb25DaGVja3MgPSB7fSBhcyBQYXJ0aWFsPHR5cGVvZiBjaGVja3M+XG4gIHZhbGlkYXRpb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHByZWNvZ25pdGlvbkNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dID0gY2hlY2tzW2tleSBhcyBOZXN0ZWRLZXlPZjxUPl1cbiAgfSlcblxuICB2YWxpZGF0ZShjdHguYXJncywgcHJlY29nbml0aW9uQ2hlY2tzLCBvcHRpb25zKVxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1TdWNjZXNzJywgJ3RydWUnKVxuICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwsIHsgc2tpcFRvOiBvcHRpb25zPy5za2lwVG8gPz8gJ0VORCcgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEF0dHJpYnV0ZU5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYywgcGFydCkgPT4ge1xuICAgIGlmICh1dGlsLm1hdGNoZXMoJ15cXFxcZCskJywgcGFydCkpIHtcbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG4gICAgcmV0dXJuIGFjYyA/IGAke2FjY30gJHtwYXJ0LnRvTG93ZXJDYXNlKCl9YCA6IHBhcnQudG9Mb3dlckNhc2UoKVxuICB9LCAnJylcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsU0FBZ0IsUUFBUSxPQUFvQztBQUMxRCxLQUFJLE9BQU8sVUFBVSxZQUFZLENBQUMsQ0FBQyxTQUFTLE9BQU8sT0FBTyxPQUFPLFNBQVMsQ0FDeEUsUUFBTyxPQUFRLE1BQW9CLFdBQVc7QUFFaEQsUUFBTzs7QUFHVCxTQUFnQixlQUFnRSxLQUFpQixNQUEyQjtBQUMxSCxRQUFPLEtBQUssTUFBTSxJQUFJLENBQUMsUUFBaUIsU0FBUyxRQUFRLEtBQUssUUFBUSxRQUFTLElBQUksR0FDOUUsUUFBc0IsT0FBTyxJQUFJLElBQ2pDLFFB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
|
|
1
|
+
import{cleanString as e,getHeader as t,getNestedValue as n,isArray as r,setNestedValue as i}from"./utils.js";import{runtime as a,util as o}from"@aws-appsync/utils";function s(e,t){let[n,...r]=typeof t==`string`?[t,void 0]:[t[0],...t.slice(1)];switch(n){case`required`:return m(e);case`nullable`:return h(e);case`sometimes`:return g(e);case`min`:return c(e,r[0]);case`max`:return l(e,r[0]);case`between`:return u(e,r[0],r[1]);case`regex`:return d(e,...r);case`in`:return f(e,...r);case`notIn`:return p(e,...r);case`array`:return _(e);case`object`:return v(e);case`boolean`:return y(e);case`number`:return b(e);case`string`:return x(e);case`before`:return S(e,r[0]);case`after`:return C(e,r[0]);case`beforeOrEqual`:return w(e,r[0]);case`afterOrEqual`:return T(e,r[0]);default:return{check:!1,message:`Unknown rule ${n}`,value:e}}}function c(e,t){let n={check:!1,message:`:attribute must be greater than or equal to ${t}`,value:e};return typeof e==`number`&&(n.check=e>=t),typeof e==`string`&&(n.check=e.length>=t),r(e)&&(n.check=e.length>=t,n.message=`Array must contain at least ${t} elements`),n}function l(e,t){let n={check:!1,message:`:attribute must be less than or equal to ${t}`,value:e};return typeof e==`number`&&(n.check=e<=t),typeof e==`string`&&(n.check=e.length<=t,n.message=`String must contain at most ${t} characters`),r(e)&&(n.check=e.length<=t,n.message=`Array must contain at most ${t} elements`),n}function u(e,t,n){let i={check:!1,message:`:attribute must be between ${t} and ${n}`,value:e};return typeof e==`number`&&(i.check=e>=t&&e<=n),typeof e==`string`&&(i.check=e.length>=t&&e.length<=n,i.message=`String must contain between ${t} and ${n} characters`),r(e)&&(i.check=e.length>=t&&e.length<=n,i.message=`Array must contain between ${t} and ${n} elements`),i}function d(e,...t){let n={check:!1,message:`:attribute must match the specified regular expression`,value:e};return typeof e==`string`&&(n.check=t.some(t=>o.matches(t,e))),n}function f(e,...t){return{check:t.includes(e),message:`:attribute must be one of the specified values`,value:e}}function p(e,...t){return{check:!t.includes(e),message:`:attribute must not be one of the specified values`,value:e}}function m(e){let t={check:!0,message:`:attribute is required`,value:e,skipNext:!0};return typeof e==`string`&&(t.check=e.length>0),r(e)&&(t.check=e.length>0),typeof e==`number`&&(t.check=!0),typeof e==`boolean`&&(t.check=!0),typeof e==`object`&&!t.value&&(t.message=`:attribute is not nullable`,t.check=!1),e===void 0&&(t.check=!1),t.skipNext=!t.check,t}function h(e){return{check:!0,message:``,value:e,skipNext:typeof e==`object`&&!e}}function g(e){let t={check:!0,message:``,value:e};return e===void 0?(t.skipNext=!0,t):typeof e==`object`&&!t.value?(t.message=`:attribute is not nullable`,t.check=!1,t.skipNext=!0,t):m(e)}function _(e){let t={check:!1,message:`:attribute must be an array`,value:e};return r(e)&&(t.check=!0),t}function v(e){let t={check:!1,message:`:attribute must be an object`,value:e};return typeof e==`object`&&!r(t.value)&&(t.check=!0),t}function y(e){let t={check:!1,message:`:attribute must be a boolean`,value:e};return typeof e==`boolean`&&(t.check=!0),t}function b(e){let t={check:!1,message:`:attribute must be a number`,value:e};return typeof e==`number`&&(t.check=!0),t}function x(e){let t={check:!1,message:`:attribute must be a string`,value:e};return typeof e==`string`&&(t.check=!0),t}function S(e,t){let n={check:!1,message:`:attribute must be before ${t}`,value:e},r=o.time.parseISO8601ToEpochMilliSeconds(t);return typeof e==`string`&&(n.check=o.time.parseISO8601ToEpochMilliSeconds(e)<r),typeof e==`number`&&(n.check=e<r),n}function C(e,t){let n={check:!1,message:`:attribute must be after ${t}`,value:e},r=o.time.parseISO8601ToEpochMilliSeconds(t);return typeof e==`string`&&(n.check=o.time.parseISO8601ToEpochMilliSeconds(e)>r),typeof e==`number`&&(n.check=e>r),n}function w(e,t){let n={check:!1,message:`:attribute must be before or equal to ${t}`,value:e},r=o.time.parseISO8601ToEpochMilliSeconds(t);return typeof e==`string`&&(n.check=o.time.parseISO8601ToEpochMilliSeconds(e)<=r),typeof e==`number`&&(n.check=e<=r),n}function T(e,t){let n={check:!1,message:`:attribute must be after or equal to ${t}`,value:e},r=o.time.parseISO8601ToEpochMilliSeconds(t);return typeof e==`string`&&(n.check=o.time.parseISO8601ToEpochMilliSeconds(e)>=r),typeof e==`number`&&(n.check=e>=r),n}function E(t,a,c){let l={};if(Object.keys(a).forEach(u=>{let d=n(t,u);typeof d==`string`&&(d=e(d,c),i(t,u,d));let f=!1;a[u]?.forEach(e=>{if(f)return;let t=typeof e==`string`||r(e)?s(d,e):{...e};f=t.skipNext??!1,!t.check&&(l.msg&&o.appendError(l.msg,l.errorType,l.data,l.errorInfo),t.message=t.message.replace(`:attribute`,O(u)),l={msg:t.message,errorType:`ValidationError`,data:null,errorInfo:{path:u,value:d}},f=!0)})}),!l.msg)return t;o.error(l.msg,l.errorType,l.data,l.errorInfo)}function D(e,n,r){if(t(`precognition`,e)!==`true`)return E(e.args,n,r);let i=t(`Precognition-Validate-Only`,e)?.split(`,`).map(e=>e.trim());o.http.addResponseHeader(`Precognition`,`true`),i||(E(e.args,n,r),o.http.addResponseHeader(`Precognition-Success`,`true`),a.earlyReturn(null)),o.http.addResponseHeader(`Precognition-Validate-Only`,i.join(`,`));let s={};i.forEach(e=>{s[e]=n[e]}),E(e.args,s,r),o.http.addResponseHeader(`Precognition-Success`,`true`),a.earlyReturn(null,{skipTo:r?.skipTo??`END`})}function O(e){return e.split(`.`).reduce((e,t)=>o.matches(`^\\d+$`,t)?e:e?`${e} ${t.toLowerCase()}`:t.toLowerCase(),``)}export{O as formatAttributeName,D as precognitiveValidation,E as validate};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["result: Rule<T>","error: { msg?: string, errorType?: string, data?: any, errorInfo?: any }","rules.parse"],"sources":["../src/rules.ts","../src/index.ts"],"sourcesContent":["import type { FullRule, Rule } from './types'\nimport { util } from '@aws-appsync/utils'\nimport { isArray } from './utils'\n\nexport function parse<T>(value: T, rule: FullRule): Rule<T> {\n const [name, ...params] = typeof rule === 'string'\n ? [rule, undefined]\n : [rule[0], ...rule.slice(1)]\n\n switch (name) {\n case 'required':\n return requiredRule(value)\n case 'nullable':\n return nullableRule(value)\n case 'sometimes':\n return sometimesRule(value)\n case 'min':\n return minRule(value, (params[0]! as number))\n case 'max':\n return maxRule(value, (params[0] as number))\n case 'between':\n return betweenRule(value, (params[0] as number), params[1] as number)\n case 'regex':\n return regexRule(value, ...params as string[])\n case 'in':\n return inRule(value, ...params)\n case 'notIn':\n return notInRule(value, ...params)\n case 'array':\n return arrayRule(value)\n case 'object':\n return objectRule(value)\n case 'boolean':\n return booleanRule(value)\n case 'number':\n return numberRule(value)\n case 'string':\n return stringRule(value)\n case 'before':\n return beforeRule(value, params[0] as string)\n case 'after':\n return afterRule(value, params[0] as string)\n case 'beforeOrEqual':\n return beforeOrEqualRule(value, params[0] as string)\n case 'afterOrEqual':\n return afterOrEqualRule(value, params[0] as string)\n default:\n return { check: false, message: `Unknown rule ${name}`, value }\n }\n}\n\nfunction minRule<T>(value: T, minValue: number): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be greater than or equal to ${minValue}`,\n value,\n }\n if (typeof value === 'number') {\n result.check = value >= minValue\n }\n if (typeof value === 'string') {\n result.check = value.length >= minValue\n }\n if (isArray(value)) {\n result.check = value.length >= minValue\n result.message = `Array must contain at least ${minValue} elements`\n }\n return result\n}\n\nfunction maxRule<T>(value: T, maxValue: number): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be less than or equal to ${maxValue}`,\n value,\n }\n\n if (typeof value === 'number') {\n result.check = value <= maxValue\n }\n if (typeof value === 'string') {\n result.check = value.length <= maxValue\n result.message = `String must contain at most ${maxValue} characters`\n }\n if (isArray(value)) {\n result.check = value.length <= maxValue\n result.message = `Array must contain at most ${maxValue} elements`\n }\n return result\n}\n\nfunction betweenRule<T>(value: T, minValue: number, maxValue: number): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be between ${minValue} and ${maxValue}`,\n value,\n }\n if (typeof value === 'number') {\n result.check = value >= minValue && value <= maxValue\n }\n if (typeof value === 'string') {\n result.check = value.length >= minValue && value.length <= maxValue\n result.message = `String must contain between ${minValue} and ${maxValue} characters`\n }\n if (isArray(value)) {\n result.check = value.length >= minValue && value.length <= maxValue\n result.message = `Array must contain between ${minValue} and ${maxValue} elements`\n }\n return result\n}\n\nfunction regexRule<T>(value: T, ...patterns: string[]): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: ':attribute must match the specified regular expression',\n value,\n }\n if (typeof value === 'string') {\n result.check = patterns.some(pattern => util.matches(pattern, value))\n }\n return result\n}\n\nfunction inRule<T>(value: T, ...params: unknown[]): Rule<T> {\n return {\n check: params.includes(value),\n message: ':attribute must be one of the specified values',\n value,\n }\n}\n\nfunction notInRule<T>(value: T, ...params: unknown[]): Rule<T> {\n return {\n check: !params.includes(value),\n message: ':attribute must not be one of the specified values',\n value,\n }\n}\n\nexport function requiredRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: true,\n message: ':attribute is required',\n value,\n skipNext: true,\n }\n if (typeof value === 'string')\n result.check = value.length > 0\n if (isArray(value))\n result.check = value.length > 0\n if (typeof value === 'number')\n result.check = true\n if (typeof value === 'boolean')\n result.check = true\n if (typeof value === 'object' && !result.value) {\n result.message = ':attribute is not nullable'\n result.check = false\n }\n if (typeof value === 'undefined')\n result.check = false\n result.skipNext = !result.check\n return result\n}\n\nfunction nullableRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: true,\n message: '',\n value,\n skipNext: typeof value === 'object' && !value,\n }\n return result\n}\n\nfunction sometimesRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: true,\n message: '',\n value,\n }\n if (typeof value === 'undefined') {\n result.skipNext = true\n return result\n }\n if (typeof value === 'object' && !result.value) {\n result.message = ':attribute is not nullable'\n result.check = false\n result.skipNext = true\n return result\n }\n return requiredRule(value)\n}\n\nfunction arrayRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: ':attribute must be an array',\n value,\n }\n if (isArray(value)) {\n result.check = true\n }\n return result\n}\n\nfunction objectRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: ':attribute must be an object',\n value,\n }\n if (typeof value === 'object' && !isArray(result.value)) {\n result.check = true\n }\n return result\n}\n\nfunction booleanRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: ':attribute must be a boolean',\n value,\n }\n if (typeof value === 'boolean') {\n result.check = true\n }\n return result\n}\n\nfunction numberRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: ':attribute must be a number',\n value,\n }\n if (typeof value === 'number') {\n result.check = true\n }\n return result\n}\n\nfunction stringRule<T>(value: T): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: ':attribute must be a string',\n value,\n }\n if (typeof value === 'string') {\n result.check = true\n }\n return result\n}\n\nfunction beforeRule<T>(value: T, start: string): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be before ${start}`,\n value,\n }\n const startValue = util.time.parseISO8601ToEpochMilliSeconds(start)\n\n if (typeof value === 'string') {\n const date = util.time.parseISO8601ToEpochMilliSeconds(value)\n result.check = date < startValue\n }\n\n if (typeof value === 'number') {\n result.check = value < startValue\n }\n return result\n}\n\nfunction afterRule<T>(value: T, start: string): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be after ${start}`,\n value,\n }\n const startValue = util.time.parseISO8601ToEpochMilliSeconds(start)\n\n if (typeof value === 'string') {\n const date = util.time.parseISO8601ToEpochMilliSeconds(value)\n result.check = date > startValue\n }\n\n if (typeof value === 'number') {\n result.check = value > startValue\n }\n return result\n}\n\nfunction beforeOrEqualRule<T>(value: T, start: string): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be before or equal to ${start}`,\n value,\n }\n const startValue = util.time.parseISO8601ToEpochMilliSeconds(start)\n\n if (typeof value === 'string') {\n const date = util.time.parseISO8601ToEpochMilliSeconds(value)\n result.check = date <= startValue\n }\n\n if (typeof value === 'number') {\n result.check = value <= startValue\n }\n return result\n}\n\nfunction afterOrEqualRule<T>(value: T, start: string): Rule<T> {\n const result: Rule<T> = {\n check: false,\n message: `:attribute must be after or equal to ${start}`,\n value,\n }\n const startValue = util.time.parseISO8601ToEpochMilliSeconds(start)\n\n if (typeof value === 'string') {\n const date = util.time.parseISO8601ToEpochMilliSeconds(value)\n result.check = date >= startValue\n }\n\n if (typeof value === 'number') {\n result.check = value >= startValue\n }\n return result\n}\n","import type { FullRule, NestedKeyOf, Rule } from './types'\nimport { runtime, util } from '@aws-appsync/utils'\nimport * as rules from './rules'\nimport { cleanString, getHeader, getNestedValue, isArray, setNestedValue } from './utils'\n\nexport function validate<T extends { [key in keyof T & string]: T[key] }>(\n obj: Partial<T>,\n checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule<T>)[]>>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n },\n): T {\n let error: { msg?: string, errorType?: string, data?: any, errorInfo?: any } = {}\n\n Object.keys(checks).forEach((path) => {\n let value = getNestedValue(obj, path as NestedKeyOf<T>)\n if (typeof value === 'string') {\n value = cleanString(value, options)\n setNestedValue(obj, path as NestedKeyOf<T>, value)\n }\n\n let skip = false\n checks[path as NestedKeyOf<T>]?.forEach((rule) => {\n if (skip)\n return\n\n const result = (typeof rule === 'string' || isArray(rule))\n ? rules.parse(value, rule)\n : { ...rule }\n\n skip = result.skipNext ?? false\n\n if (result.check)\n return\n\n if (error.msg)\n util.appendError(error.msg, error.errorType, error.data, error.errorInfo)\n\n result.message = result.message.replace(':attribute', formatAttributeName(path))\n error = {\n msg: result.message,\n errorType: 'ValidationError',\n data: null,\n errorInfo: { path, value },\n }\n\n skip = true\n })\n })\n\n if (!error.msg) {\n return obj as T\n }\n\n util.error(error.msg, error.errorType, error.data, error.errorInfo)\n}\n\nexport function precognitiveValidation<\n T extends { [key in keyof T & string]: T[key] },\n>(\n ctx: { request: { headers: any }, args: Partial<T> },\n checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule<T>)[]>>,\n options?: {\n trim?: boolean\n allowEmptyString?: boolean\n skipTo?: 'END' | 'NEXT'\n },\n): T {\n if (getHeader('precognition', ctx) !== 'true') {\n return validate<T>(ctx.args, checks, options)\n }\n const validationKeys = getHeader('Precognition-Validate-Only', ctx)?.split(',').map(key => key.trim())\n util.http.addResponseHeader('Precognition', 'true')\n\n if (!validationKeys) {\n validate(ctx.args, checks, options)\n util.http.addResponseHeader('Precognition-Success', 'true')\n runtime.earlyReturn(null)\n }\n\n util.http.addResponseHeader('Precognition-Validate-Only', validationKeys.join(','))\n const precognitionChecks = {} as Partial<typeof checks>\n validationKeys.forEach((key) => {\n precognitionChecks[key as NestedKeyOf<T>] = checks[key as NestedKeyOf<T>]\n })\n\n validate(ctx.args, precognitionChecks, options)\n util.http.addResponseHeader('Precognition-Success', 'true')\n runtime.earlyReturn(null, { skipTo: options?.skipTo ?? 'END' })\n}\n\nexport function formatAttributeName(path: string): string {\n return path.split('.').reduce((acc, part) => {\n if (util.matches('^\\\\d+$', part)) {\n return acc\n }\n return acc ? `${acc} ${part.toLowerCase()}` : part.toLowerCase()\n }, '')\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/types.d.ts
|
|
2
|
+
interface Rule<T = unknown> {
|
|
3
|
+
check: boolean;
|
|
4
|
+
message: string;
|
|
5
|
+
value: T;
|
|
6
|
+
skipNext?: boolean;
|
|
7
|
+
}
|
|
8
|
+
type FullRule = "required" | "nullable" | "sometimes" | "number" | "boolean" | "string" | "array" | "object" | ["min", number] | ["max", number] | ["between", number, number] | ["regex", ...string[]] | ["in", ...(string | number | boolean | null)[]] | ["notIn", ...(string | number | boolean | null)[]] | ["after", string] | ["before", string] | ["afterOrEqual", string] | ["beforeOrEqual", string];
|
|
9
|
+
type ArrayKeys<T extends unknown[]> = T extends [unknown, ...unknown[]] ? T extends Record<infer Index, unknown> ? Index extends `${number}` ? Index : never : never : `${number}`;
|
|
10
|
+
type ObjectKeys<T extends object> = T extends unknown[] ? ArrayKeys<T> : keyof T & string;
|
|
11
|
+
interface HasConstructor {
|
|
12
|
+
new (...args: unknown[]): unknown;
|
|
13
|
+
}
|
|
14
|
+
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
|
+
//#endregion
|
|
16
|
+
export { NestedKeyOf as n, Rule as r, FullRule as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-1ORDfyL5.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";AAEiB,UAAA,IAAA,CAAA,IAGR,OAAA,CAAA,CAAA;EAIT,KAAY,EAAA,OAAA;EAkBL,OAEF,EAAA,MAAA;EACD,KAAA,EAzBK,CAyBL;EACE,QAAA,CAAA,EAAA,OAAA;;AAAU,KAtBJ,QAAA,GAsBI,UAAA,GAAA,UAAA,GAAA,WAAA,GAAA,QAAA,GAAA,SAAA,GAAA,QAAA,GAAA,OAAA,GAAA,QAAA,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,GAAA,CAAA,KAAA,EAAA,MAAA,CAAA,GAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA,GAAA,CAAA,OAAA,EAAA,GAAA,MAAA,EAAA,CAAA,GAAA,CAAA,IAAA,EAAA,GAAA,CAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,OAAA,EAAA,GAAA,CAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,IAAA,CAAA,EAAA,CAAA,GAAA,CAAA,OAAA,EAAA,MAAA,CAAA,GAAA,CAAA,QAAA,EAAA,MAAA,CAAA,GAAA,CAAA,cAAA,EAAA,MAAA,CAAA,GAAA,CAAA,eAAA,EAAA,MAAA,CAAA;AAAA,KAFX,SASA,CAAA,UAAA,OAAA,EAAA,CAAA,GARD,CAQC,SAAA,CAAA,OAAA,EAAA,GAAA,OAAA,EAAA,CAAA,GAPC,CAOD,SAPW,MAOX,CAAA,KAAA,MAAA,EAAA,OAAA,CAAA,GAAA,KAAA,SAAA,GAAA,MAAA,EAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,GAAA,MAAA,EAAA;KAAA,UACD,CAAA,UAAA,MAAA,CAAA,GAAA,CAAA,SAAA,OAAA,EAAA,GACE,SADF,CACY,CADZ,CAAA,GAAA,MAEQ,CAFR,GAAA,MAAA;UAIM,cAAA,CAHM;EAAV,KAAA,GAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,OAAA;;AACM,KAMA,WANA,CAAA,CAAA,CAAA,GAMiB,CANjB,SAM2B,MAN3B,CAAA,KAAA,IAAA,EAAA,OAAA,CAAA,GAOR,CAPQ,SAOE,cAPF,GAAA,KAAA,GASN,CATM,SASI,gBATJ,GAAA,KAAA,GAAA,GAAA,SAAA,MAAA,GAAA,MAAA,GAAA,CAYD,UAZC,CAYU,CAZV,CAAA,GAAA,CAYgB,CAZhB,CAYkB,GAZlB,CAAA,SAAA,MAAA,GAAA,GAaK,UAbL,CAagB,IAbhB,CAaqB,CAbrB,EAawB,GAbxB,CAAA,CAAA,IAaiC,WAbjC,CAa6C,CAb7C,CAa+C,GAb/C,CAAA,CAAA,EAAA,GAcE,CAdF,SAAA,OAAA,EAAA,GAeI,CAfJ,SAAA,CAAA,OAAA,EAAA,GAAA,OAAA,EAAA,CAAA,GAAA,KAAA,GAiBM,CAjBN,CAAA,MAAA,CAAA,SAAA,MAAA,GAAA,GAAA,MAAA,IAkBqB,WAlBrB,CAkBiC,CAlBjC,CAAA,MAAA,CAAA,CAAA,EAAA,GAAA,KAAA,GAAA,KAAA,CAAA,CAAA,GAAA,KAAA,GAAA,KAAA"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { n as NestedKeyOf } from "./types-1ORDfyL5.js";
|
|
2
|
+
|
|
3
|
+
//#region src/utils.d.ts
|
|
4
|
+
declare function isArray(value: unknown): value is unknown[];
|
|
5
|
+
declare function getNestedValue<T extends { [key in keyof T & string]: T[key] }>(obj: Partial<T>, path: NestedKeyOf<T>): any;
|
|
6
|
+
declare function setNestedValue<T extends { [key in keyof T & string]: T[key] }>(obj: Partial<T>, path: NestedKeyOf<T>, value: unknown): void;
|
|
7
|
+
declare function getHeader(name: string, ctx: {
|
|
8
|
+
request: {
|
|
9
|
+
headers: any;
|
|
10
|
+
};
|
|
11
|
+
}): string | null;
|
|
12
|
+
declare function cleanString(value: string, options?: {
|
|
13
|
+
trim?: boolean;
|
|
14
|
+
allowEmptyString?: boolean;
|
|
15
|
+
}): string | null;
|
|
16
|
+
declare const uuid = "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$";
|
|
17
|
+
declare const ulid = "^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$";
|
|
18
|
+
declare const url = "^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+)?(\\/.*)?$";
|
|
19
|
+
declare const email = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
|
|
20
|
+
declare const phone = "^\\+[1-9]\\d{1,20}$";
|
|
21
|
+
declare const date = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$";
|
|
22
|
+
declare const time = "^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z?$";
|
|
23
|
+
declare const datetime = "^\\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$";
|
|
24
|
+
declare const numeric = "^-?\\d+(\\.\\d+)?$";
|
|
25
|
+
declare const integer = "^-?\\d+$";
|
|
26
|
+
//#endregion
|
|
27
|
+
export { cleanString, date, datetime, email, getHeader, getNestedValue, integer, isArray, numeric, phone, setNestedValue, time, ulid, url, uuid };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","names":[],"sources":["../src/utils.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,OAAA;iBAIA,yCAAyC,aAAa,EAAE,aAAa,QAAQ,UAAU,YAAY;AAJnG,iBAUA,cAVA,CAAA,UAAA,UAAA,MAUyC,CAVzC,GAAA,MAAA,GAUsD,CAVtD,CAUwD,GAVxD,CAAA,EAAA,CAAA,CAAA,GAAA,EAUqE,OAVrE,CAU6E,CAV7E,CAAA,EAAA,IAAA,EAUuF,WAVvF,CAUmG,CAVnG,CAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,IAAA;AAIA,iBAmBA,SAAA,CAnBA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA;EAAyC,OAAA,EAAA;IAAa,OAAA,EAAA,GAAA;EAAE,CAAA;CAAqB,CAAA,EAAA,MAAA,GAAA,IAAA;AAAR,iBA4BrE,WAAA,CA5BqE,KAAA,EAAA,MAAA,EAAA,OAAkB,CAAlB,EAAA;EAA8B,IAAA,CAAA,EAAA,OAAA;EAAZ,gBAAA,CAAA,EAAA,OAAA;CAAA,CAAA,EAAA,MAAA,GAAA,IAAA;AAMvF,cAkCH,IAAA,GAlCG,2EAAA;AAAyC,cAmC5C,IAAA,GAnC4C,0CAAA;AAAa,cAoCzD,GAAA,GApCyD,qMAAA;AAAE,cAqC3D,KAAA,GArC2D,mDAAA;AAAqB,cAsChF,KAAA,GAtCgF,qBAAA;AAAR,cAuCxE,IAAA,GAvCwE,iDAAA;AAA8B,cAwCtG,IAAA,GAxCsG,sDAAA;AAAZ,cAyC1F,QAAA,GAzC0F,mGAAA;AAAA,cA0C1F,OAAA,GA1C0F,oBAAA;AAavF,cA8BH,OAAA,GA9BG,UAAA"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{util as e}from"@aws-appsync/utils";function t(e){return typeof e==`object`&&!!e&&Object.hasOwn(e,`length`)&&typeof e.length==`number`}function n(t,n){return n.split(`.`).reduce((t,n)=>e.matches(`^d+$`,n)?t[Number(n)]:t[n],t)}function r(e,t,r){let i=t.split(`.`);if(i.length===1){e[i[0]]=r;return}let a=i.pop(),o=n(e,i.join(`.`));typeof o==`object`&&o&&(o[a]=r)}function i(e,t){return Object.entries(t.request.headers).reduce((t,[n,r])=>typeof t==`string`?t:n.toLowerCase()===e.toLowerCase()&&typeof r==`string`?r:null,null)}function a(e,t){if(t?.trim===!1)return e;let n=e.trim();return t?.allowEmptyString?n:n===``?null:n}const o=`^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`,s=`^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$`,c=`^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+)?(\\/.*)?$`,l=`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`,u=`^\\+[1-9]\\d{1,20}$`,d=`^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$`,f=`^([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z?$`,p=`^\\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$`,m=`^-?\\d+(\\.\\d+)?$`,h=`^-?\\d+$`;export{a as cleanString,d as date,p as datetime,l as email,i as getHeader,n as getNestedValue,h as integer,t as isArray,m as numeric,u as phone,r as setNestedValue,f as time,s as ulid,c as url,o as uuid};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":["parsed: string | null"],"sources":["../src/utils.ts"],"sourcesContent":["import type { NestedKeyOf } from './types'\nimport { util } from '@aws-appsync/utils'\n\nexport function isArray(value: unknown): value is unknown[] {\n return (typeof value === 'object' && !!value && Object.hasOwn(value, 'length')) && typeof (value as unknown[]).length === 'number'\n}\n\nexport function getNestedValue<T extends { [key in keyof T & string]: T[key] }>(obj: Partial<T>, path: NestedKeyOf<T>): any {\n return path.split('.').reduce<unknown>((current, key) => util.matches('^\\d+$', key)\n ? (current as unknown[])[Number(key)]\n : (current as Record<string, unknown>)[key], obj)\n}\n\nexport function setNestedValue<T extends { [key in keyof T & string]: T[key] }>(obj: Partial<T>, path: NestedKeyOf<T>, value: unknown): void {\n const keys = path.split('.')\n if (keys.length === 1) {\n obj[keys[0] as keyof typeof obj] = value as any\n return\n }\n const lastKey = keys.pop() as string\n const parentObject = getNestedValue(obj, keys.join('.') as NestedKeyOf<T>)\n if (typeof parentObject === 'object' && !!parentObject) {\n parentObject[lastKey] = value\n }\n}\n\nexport function getHeader(name: string, ctx: { request: { headers: any } }): string | null {\n return Object.entries(ctx.request.headers)\n .reduce((prev, [key, value]) => typeof prev === 'string'\n ? prev\n : (key.toLowerCase() === name.toLowerCase() && typeof value === 'string'\n ? value\n : null), null as string | null)\n}\n\nexport function cleanString(value: string, options?: {\n trim?: boolean\n allowEmptyString?: boolean\n}): string | null {\n if (options?.trim === false)\n return value\n const parsed: string | null = value.trim()\n if (options?.allowEmptyString)\n return parsed\n return parsed === '' ? null : parsed\n}\n\nexport const uuid = '^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$'\nexport const ulid = '^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$'\nexport const url = '^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+)?(\\\\/.*)?$'\nexport const email = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$'\nexport const phone = '^\\\\+[1-9]\\\\d{1,20}$'\nexport const date = '^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])$'\nexport const time = '^([01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(\\\\.\\\\d{1,6})?Z?$'\nexport const datetime = '^\\\\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$'\nexport const numeric = '^-?\\\\d+(\\\\.\\\\d+)?$'\nexport const integer = '^-?\\\\d+$'\n"],"mappings":"0CAGA,SAAgB,EAAQ,EAAoC,CAC1D,OAAQ,OAAO,GAAU,UAAY,CAAC,CAAC,GAAS,OAAO,OAAO,EAAO,SAAS,EAAK,OAAQ,EAAoB,QAAW,SAG5H,SAAgB,EAAgE,EAAiB,EAA2B,CAC1H,OAAO,EAAK,MAAM,IAAI,CAAC,QAAiB,EAAS,IAAQ,EAAK,QAAQ,OAAS,EAAI,CAC9E,EAAsB,OAAO,EAAI,EACjC,EAAoC,GAAM,EAAI,CAGrD,SAAgB,EAAgE,EAAiB,EAAsB,EAAsB,CAC3I,IAAM,EAAO,EAAK,MAAM,IAAI,CAC5B,GAAI,EAAK,SAAW,EAAG,CACrB,EAAI,EAAK,IAA0B,EACnC,OAEF,IAAM,EAAU,EAAK,KAAK,CACpB,EAAe,EAAe,EAAK,EAAK,KAAK,IAAI,CAAmB,CACtE,OAAO,GAAiB,UAAc,IACxC,EAAa,GAAW,GAI5B,SAAgB,EAAU,EAAc,EAAmD,CACzF,OAAO,OAAO,QAAQ,EAAI,QAAQ,QAAQ,CACvC,QAAQ,EAAM,CAAC,EAAK,KAAW,OAAO,GAAS,SAC5C,EACC,EAAI,aAAa,GAAK,EAAK,aAAa,EAAI,OAAO,GAAU,SAC1D,EACA,KAAO,KAAsB,CAGzC,SAAgB,EAAY,EAAe,EAGzB,CAChB,GAAI,GAAS,OAAS,GACpB,OAAO,EACT,IAAMA,EAAwB,EAAM,MAAM,CAG1C,OAFI,GAAS,iBACJ,EACF,IAAW,GAAK,KAAO,EAGhC,MAAa,EAAO,4EACP,EAAO,2CACP,EAAM,sMACN,EAAQ,oDACR,EAAQ,sBACR,EAAO,kDACP,EAAO,uDACP,EAAW,oGACX,EAAU,qBACV,EAAU"}
|