@sot1986/appsync-precognition 0.0.1
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/README.md +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +184 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# appsync-precognition
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#endregion
|
|
2
|
+
//#region src/types.d.ts
|
|
3
|
+
interface Rule<T = unknown> {
|
|
4
|
+
check: boolean;
|
|
5
|
+
message: string;
|
|
6
|
+
value: T;
|
|
7
|
+
}
|
|
8
|
+
type ShortRule<T extends string> = T | `${T}:${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
|
+
declare namespace rules_d_exports {
|
|
16
|
+
export { names, parse };
|
|
17
|
+
}
|
|
18
|
+
declare const names: {
|
|
19
|
+
readonly min: "min";
|
|
20
|
+
readonly max: "max";
|
|
21
|
+
readonly between: "between";
|
|
22
|
+
readonly email: "email";
|
|
23
|
+
readonly url: "url";
|
|
24
|
+
readonly uuid: "uuid";
|
|
25
|
+
readonly regex: "regex";
|
|
26
|
+
readonly in: "in";
|
|
27
|
+
};
|
|
28
|
+
declare function parse<T>(value: T, rule: ShortRule<keyof typeof names>): Rule<T>;
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/index.d.ts
|
|
31
|
+
declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (ShortRule<keyof typeof rules_d_exports["names"]> | Rule)[]>>): T;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { validate };
|
|
34
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvcnVsZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7VUFFaUI7OztTQUdSOztLQUdHLDhCQUE4QixPQUFPO0tBRTVDLGlDQUNELG9DQUNFLFVBQVU7S0FPWCwrQkFDRCxzQkFDRSxVQUFVLFdBQ0o7VUFFRixjQUFBOzs7S0FJRSxpQkFBaUIsVUFBVSw2QkFDbkMsVUFBVSx5QkFFUixVQUFVLDBEQUdMLFdBQVcsTUFBTSxFQUFFLHlCQUNiLFdBQVcsS0FBSyxHQUFHLFNBQVMsWUFBWSxFQUFFLFVBQzdDLHNCQUNFLDRDQUVFLHdDQUNlLFlBQVk7Ozs7Y0NwQ2hDOzs7Ozs7Ozs7O2lCQVdHLGdCQUFnQixTQUFTLHVCQUF1QixTQUFTLEtBQUs7OztpQkNWOUQsZ0NBQ1QsV0FDRyxRQUFRLE9BQU8sWUFBWSxLQUFLLHVCQUF1Qiw0QkFBa0IsWUFDaEYifQ==
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { util } from "@aws-appsync/utils";
|
|
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
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/rules.ts
|
|
24
|
+
function parse(value, rule) {
|
|
25
|
+
const [ruleName, params] = rule.includes(":") ? rule.split(":", 2) : [rule, ""];
|
|
26
|
+
switch (ruleName) {
|
|
27
|
+
case "min": return minRule(value, ...params.split(","));
|
|
28
|
+
case "max": return maxRule(value, ...params.split(", "));
|
|
29
|
+
case "between": return betweenRule(value, ...params.split(", "));
|
|
30
|
+
case "email": return emailRule(value);
|
|
31
|
+
case "url": return urlRule(value);
|
|
32
|
+
case "uuid": return uuidRule(value);
|
|
33
|
+
case "regex": return regexRule(value, params);
|
|
34
|
+
case "in": return inRule(value, ...params.split(", "));
|
|
35
|
+
default: return {
|
|
36
|
+
check: false,
|
|
37
|
+
message: `Unknown rule ${ruleName}`,
|
|
38
|
+
value
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function minRule(value, ...params) {
|
|
43
|
+
const minValue = Number(params[0] ?? "0");
|
|
44
|
+
const result = {
|
|
45
|
+
check: false,
|
|
46
|
+
message: `Value must be greater than or equal to ${minValue}`,
|
|
47
|
+
value
|
|
48
|
+
};
|
|
49
|
+
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
|
+
}
|
|
54
|
+
if (isArray(value)) {
|
|
55
|
+
result.check = value.length >= minValue;
|
|
56
|
+
result.message = `Array must contain at least ${minValue} elements`;
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
function maxRule(value, ...params) {
|
|
61
|
+
const maxValue = Number(params[0] ?? "0");
|
|
62
|
+
const result = {
|
|
63
|
+
check: false,
|
|
64
|
+
message: `Value must be less than or equal to ${maxValue}`,
|
|
65
|
+
value
|
|
66
|
+
};
|
|
67
|
+
if (typeof value === "number") result.check = value <= maxValue;
|
|
68
|
+
if (typeof result.value === "string") {
|
|
69
|
+
result.value = result.value.trim();
|
|
70
|
+
result.check = result.value.length <= maxValue;
|
|
71
|
+
result.message = `String must contain at most ${maxValue} characters`;
|
|
72
|
+
}
|
|
73
|
+
if (isArray(value)) {
|
|
74
|
+
result.check = value.length <= maxValue;
|
|
75
|
+
result.message = `Array must contain at most ${maxValue} elements`;
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function betweenRule(value, ...params) {
|
|
80
|
+
const minValue = Number(params[0] ?? "0");
|
|
81
|
+
const maxValue = Number(params[1] ?? "0");
|
|
82
|
+
const result = {
|
|
83
|
+
check: false,
|
|
84
|
+
message: `Value must be between ${minValue} and ${maxValue}`,
|
|
85
|
+
value
|
|
86
|
+
};
|
|
87
|
+
if (typeof value === "number") result.check = value >= minValue && value <= maxValue;
|
|
88
|
+
if (typeof result.value === "string") {
|
|
89
|
+
result.value = result.value.trim();
|
|
90
|
+
result.check = result.value.length >= minValue && result.value.length <= maxValue;
|
|
91
|
+
result.message = `String must contain between ${minValue} and ${maxValue} characters`;
|
|
92
|
+
}
|
|
93
|
+
if (isArray(value)) {
|
|
94
|
+
result.check = value.length >= minValue && value.length <= maxValue;
|
|
95
|
+
result.message = `Array must contain between ${minValue} and ${maxValue} elements`;
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
function emailRule(value) {
|
|
100
|
+
const result = {
|
|
101
|
+
check: false,
|
|
102
|
+
message: "Value must be a valid email address",
|
|
103
|
+
value
|
|
104
|
+
};
|
|
105
|
+
if (typeof value === "string") {
|
|
106
|
+
result.value = value.trim();
|
|
107
|
+
result.check = util.matches("^[^s@]+@[^s@]+.[^s@]+$", result.value);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
function urlRule(value) {
|
|
112
|
+
const result = {
|
|
113
|
+
check: false,
|
|
114
|
+
message: "Value must be a valid URL",
|
|
115
|
+
value
|
|
116
|
+
};
|
|
117
|
+
if (typeof value === "string") {
|
|
118
|
+
result.value = value.trim();
|
|
119
|
+
result.check = util.matches("^(http|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$", result.value);
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
function uuidRule(value) {
|
|
124
|
+
const result = {
|
|
125
|
+
check: false,
|
|
126
|
+
message: "Value must be a valid UUID",
|
|
127
|
+
value
|
|
128
|
+
};
|
|
129
|
+
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
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
function regexRule(value, ...params) {
|
|
133
|
+
const regex = params[0] ?? "";
|
|
134
|
+
const result = {
|
|
135
|
+
check: false,
|
|
136
|
+
message: "Value must match the specified regular expression",
|
|
137
|
+
value
|
|
138
|
+
};
|
|
139
|
+
if (typeof result.value === "string") {
|
|
140
|
+
result.value = result.value.trim();
|
|
141
|
+
result.check = util.matches(regex, result.value);
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
function inRule(value, ...params) {
|
|
146
|
+
const result = {
|
|
147
|
+
check: false,
|
|
148
|
+
message: "Value must be one of the specified values",
|
|
149
|
+
value
|
|
150
|
+
};
|
|
151
|
+
if (typeof result.value === "string") {
|
|
152
|
+
result.value = result.value.trim();
|
|
153
|
+
result.check = params.includes(result.value);
|
|
154
|
+
}
|
|
155
|
+
if (typeof value === "number") result.check = params.map(Number).includes(value);
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
//#endregion
|
|
160
|
+
//#region src/index.ts
|
|
161
|
+
function validate(obj, checks) {
|
|
162
|
+
let hasErrors = false;
|
|
163
|
+
const errorMessages = [];
|
|
164
|
+
Object.keys(checks).forEach((path) => {
|
|
165
|
+
const value = getNestedValue(obj, path);
|
|
166
|
+
if (typeof value === "string") setNestedValue(obj, path, value.trim());
|
|
167
|
+
checks[path]?.forEach((rule) => {
|
|
168
|
+
const result = typeof rule === "string" ? parse(value, rule) : { ...rule };
|
|
169
|
+
if (result.check) return;
|
|
170
|
+
hasErrors = true;
|
|
171
|
+
errorMessages.push(result.message);
|
|
172
|
+
util.appendError(result.message, "ValidationError", null, {
|
|
173
|
+
path,
|
|
174
|
+
value
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
if (hasErrors) util.error(errorMessages[0], "ValidationError");
|
|
179
|
+
return obj;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//#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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
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sot1986/appsync-precognition",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"description": "JavaScript resolver validation utilities for AWS AppSync",
|
|
6
|
+
"author": "sot1986",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"appsync",
|
|
10
|
+
"validation",
|
|
11
|
+
"resolver",
|
|
12
|
+
"aws"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist/**/*"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsdown --format esm --config tsdown.config.ts",
|
|
30
|
+
"bundle": "cd playground && ./bundle-resolvers.sh && cd .. && eslint --ext playground/resolvers/**/*.{ts,js} . --fix",
|
|
31
|
+
"prepublishOnly": "pnpm run build",
|
|
32
|
+
"test": "vitest",
|
|
33
|
+
"lint:resolvers": "eslint --ext playground/resolvers/**/*.{ts,js} . --fix"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@aws-appsync/utils": "^2.0.3"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@antfu/eslint-config": "^6.7.3",
|
|
40
|
+
"@aws-appsync/eslint-plugin": "^2.0.2",
|
|
41
|
+
"@types/node": "^25.0.3",
|
|
42
|
+
"@typescript-eslint/parser": "^8.50.1",
|
|
43
|
+
"esbuild": "^0.27.2",
|
|
44
|
+
"eslint": "^9.39.2",
|
|
45
|
+
"tsdown": "^0.18.3",
|
|
46
|
+
"tsx": "^4.21.0",
|
|
47
|
+
"typescript": "^5.0.0",
|
|
48
|
+
"typescript-eslint": "^8.50.1",
|
|
49
|
+
"vitest": "^4.0.16"
|
|
50
|
+
}
|
|
51
|
+
}
|