@@ -8,4 +8,70 @@ You can use zod [extend API](https://github.com/colinhacks/zod#extend).
8
8
const AttributeInputSchemaWithCUID = AttributeInputSchema ().extend ({
9
9
key: z .string ().cuid (),
10
10
});
11
+ ```
12
+
13
+ ## Apply input validator via ts decorator
14
+
15
+ Validate the input object via typescript decorators when implementing resolvers. See: #190
16
+
17
+ ### Usage
18
+
19
+ ``` ts
20
+ class Mutation {
21
+ @validateInput (SignupInputSchema )
22
+ async signup(
23
+ _root : Record <string , never >,
24
+ { input : { email , password } }: MutationSignupArgs ,
25
+ context : Context
26
+ ): Promise <SignupPayload > {
27
+ // The input here is automatically valid to adhere to SignupInputSchema
28
+ }
29
+ }
30
+ ```
31
+
32
+ ### Implementation:
33
+
34
+ ``` ts
35
+ type ZodResolver <T extends ZodType <any , any , any >> = ResolverFn <
36
+ any ,
37
+ any ,
38
+ any ,
39
+ { input: TypeOf <T > }
40
+ >
41
+
42
+ /**
43
+ * Method decorator that validates the argument of the target function against the given schema.
44
+ *
45
+ * @export
46
+ * @template T The type of the zod schema.
47
+ * @param {T} arg The zod schema used for the validation.
48
+ * @return {MethodDecorator} A {@link MethodDecorator } .
49
+ */
50
+ export function validateInput<T extends AnyZodObject >(
51
+ arg : T | (() => T )
52
+ ): MethodDecorator <ZodResolver <T >> {
53
+ return function (_target , _propertyKey , descriptor ) {
54
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
55
+ const originalMethod = descriptor .value !
56
+ // @ts-expect-error: should be fine
57
+ descriptor .value = function (root , { input }, context , info ) {
58
+ const schema = typeof arg === ' function' ? arg () : arg
59
+ const result = schema .safeParse (input )
60
+
61
+ if (result .success ) {
62
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
63
+ return originalMethod .call (
64
+ this ,
65
+ root ,
66
+ { input: result .data },
67
+ context ,
68
+ info
69
+ )
70
+ } else {
71
+ return { problems: result .error .issues }
72
+ }
73
+ }
74
+ return descriptor
75
+ }
76
+ }
11
77
```
0 commit comments