47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers';
|
|
import type { ShapeErrors } from 'nope-validator/lib/cjs/types';
|
|
import type { FieldError, FieldErrors } from 'react-hook-form';
|
|
import type { Resolver } from './types';
|
|
|
|
const parseErrors = (
|
|
errors: ShapeErrors,
|
|
parsedErrors: FieldErrors = {},
|
|
path = '',
|
|
) => {
|
|
return Object.keys(errors).reduce((acc, key) => {
|
|
const _path = path ? `${path}.${key}` : key;
|
|
const error = errors[key];
|
|
|
|
if (typeof error === 'string') {
|
|
acc[_path] = {
|
|
message: error,
|
|
} as FieldError;
|
|
} else {
|
|
parseErrors(error, acc, _path);
|
|
}
|
|
|
|
return acc;
|
|
}, parsedErrors);
|
|
};
|
|
|
|
export const nopeResolver: Resolver =
|
|
(
|
|
schema,
|
|
schemaOptions = {
|
|
abortEarly: false,
|
|
},
|
|
) =>
|
|
(values, context, options) => {
|
|
const result = schema.validate(values, context, schemaOptions) as
|
|
| ShapeErrors
|
|
| undefined;
|
|
|
|
if (result) {
|
|
return { values: {}, errors: toNestErrors(parseErrors(result), options) };
|
|
}
|
|
|
|
options.shouldUseNativeValidation && validateFieldsNatively({}, options);
|
|
|
|
return { values, errors: {} };
|
|
};
|