/
yup.ts
67 lines (65 loc) 路 1.68 KB
/
yup.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
import { appendErrors, transformToNestObject, Resolver } from 'react-hook-form';
import Yup from 'yup';
const parseErrorSchema = (
error: Yup.ValidationError,
validateAllFieldCriteria: boolean,
) =>
Array.isArray(error.inner)
? error.inner.reduce(
(previous: Record<string, any>, { path, message, type }) => ({
...previous,
...(path
? previous[path] && validateAllFieldCriteria
? {
[path]: appendErrors(
path,
validateAllFieldCriteria,
previous,
type,
message,
),
}
: {
[path]: previous[path] || {
message,
type,
...(validateAllFieldCriteria
? {
types: { [type]: message || true },
}
: {}),
},
}
: {}),
}),
{},
)
: {
[error.path]: { message: error.message, type: error.type },
};
export const yupResolver = <TFieldValues extends Record<string, any>>(
schema: Yup.ObjectSchema,
options: Yup.ValidateOptions = {
abortEarly: false,
},
): Resolver<TFieldValues> => async (
values,
_,
validateAllFieldCriteria = false,
) => {
try {
return {
values: (await schema.validate(values, {
...options,
})) as any,
errors: {},
};
} catch (e) {
return {
values: {},
errors: transformToNestObject(
parseErrorSchema(e, validateAllFieldCriteria),
),
};
}
};