-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathzodSchemaIsAsync.ts
125 lines (116 loc) · 3.79 KB
/
zodSchemaIsAsync.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { ZodEffects, ZodObject, type ZodType, ZodArray, ZodCatch, ZodDefault, ZodIntersection, ZodLazy, ZodOptional, ZodReadonly, ZodRecord, ZodTuple, ZodUnion, ZodPipeline, ZodNullable, ZodPromise, ZodSet, ZodMap } from "zod";
export function zodSchemaIsAsync(zodSchema: unknown, lazyMap = new Set()): boolean {
if (lazyMap.has(zodSchema)) {
return false;
}
lazyMap.add(zodSchema);
if (zodSchema instanceof ZodArray) {
return zodSchemaIsAsync(zodSchema._def.type, lazyMap);
} else if (zodSchema instanceof ZodCatch) {
return zodSchemaIsAsync(zodSchema._def.innerType, lazyMap);
} else if (zodSchema instanceof ZodDefault) {
return zodSchemaIsAsync(zodSchema._def.innerType, lazyMap);
} else if (zodSchema instanceof ZodEffects) {
if (
(
zodSchema._def.effect.type === "transform"
|| zodSchema._def.effect.type === "preprocess"
)
&& zodSchema._def.effect.transform.constructor.name === "AsyncFunction"
) {
return true;
} else if (
zodSchema._def.effect.type === "refinement"
&& zodSchema._def.effect.refinement.constructor.name === "AsyncFunction"
) {
return true;
} else if (zodSchemaIsAsync(zodSchema._def.schema, lazyMap)) {
return true;
} else {
const effectFunction = zodSchema._def.effect.type === "refinement"
? zodSchema._def.effect.refinement
: zodSchema._def.effect.transform;
function anyFunction() {
return void undefined;
}
const impossibleErrorProxy: any = new Proxy(
anyFunction,
{
get() {
return impossibleErrorProxy;
},
construct() {
anyFunction();
return impossibleErrorProxy;
},
set() {
return true;
},
apply() {
return impossibleErrorProxy;
},
},
);
try {
const result = effectFunction(
impossibleErrorProxy,
{
addIssue: () => void undefined,
path: [],
},
);
if (result instanceof Promise) {
result.catch(() => void undefined);
}
return result instanceof Promise;
} catch {
return false;
}
}
} else if (
zodSchema instanceof ZodIntersection
&& (
zodSchemaIsAsync(zodSchema._def.left, lazyMap)
|| zodSchemaIsAsync(zodSchema._def.right, lazyMap)
)
) {
return true;
} else if (zodSchema instanceof ZodLazy) {
return zodSchemaIsAsync(zodSchema._def.getter(), lazyMap);
} else if (zodSchema instanceof ZodMap) {
return zodSchemaIsAsync(zodSchema._def.keyType, lazyMap)
|| zodSchemaIsAsync(zodSchema._def.valueType, lazyMap);
} else if (zodSchema instanceof ZodNullable) {
return zodSchemaIsAsync(zodSchema._def.innerType, lazyMap);
} else if (zodSchema instanceof ZodObject) {
return !Object.values(zodSchema._def.shape() as ZodType)
.every((value) => !zodSchemaIsAsync(value, lazyMap));
} else if (zodSchema instanceof ZodOptional) {
return zodSchemaIsAsync(zodSchema._def.innerType, lazyMap);
} else if (zodSchema instanceof ZodPipeline) {
return zodSchemaIsAsync(zodSchema._def.in, lazyMap)
|| zodSchemaIsAsync(zodSchema._def.out, lazyMap);
} else if (zodSchema instanceof ZodPromise) {
return true;
} else if (zodSchema instanceof ZodReadonly) {
return zodSchemaIsAsync(zodSchema._def.innerType, lazyMap);
} else if (
zodSchema instanceof ZodRecord
&& (
zodSchemaIsAsync(zodSchema._def.keyType, lazyMap)
|| zodSchemaIsAsync(zodSchema._def.valueType, lazyMap)
)
) {
return true;
} else if (zodSchema instanceof ZodSet) {
return zodSchemaIsAsync(zodSchema._def.valueType, lazyMap);
} else if (zodSchema instanceof ZodTuple) {
return !(zodSchema._def.items as ZodType[])
.every((value) => !zodSchemaIsAsync(value, lazyMap))
|| zodSchemaIsAsync(zodSchema._def.rest, lazyMap);
} else if (zodSchema instanceof ZodUnion) {
return !(zodSchema._def.options as ZodType[])
.every((value) => !zodSchemaIsAsync(value, lazyMap));
}
return false;
}