@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 ADDED
@@ -0,0 +1 @@
1
+ # appsync-precognition
@@ -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
+ }