Download node_modules/@hookform/resolvers/fluentvalidation-ts/src/fluentvalidation-ts.ts from metarm/QMetaRam: direct link, hf CLI and curl.
- Browser
- Download file 2.91 kB
-
https://huggingface.co/metarm/QMetaRam/resolve/main/node_modules/%40hookform/resolvers/fluentvalidation-ts/src/fluentvalidation-ts.ts
- Command line
-
hf download hf://metarm/QMetaRam/node_modules/@hookform/resolvers/fluentvalidation-ts/src/fluentvalidation-ts.ts
-
curl -L -o fluentvalidation-ts.ts https://huggingface.co/metarm/QMetaRam/resolve/main/node_modules/%40hookform/resolvers/fluentvalidation-ts/src/fluentvalidation-ts.ts
2.91 kB
| import { toNestErrors, validateFieldsNatively } from '@hookform/resolvers'; | |
| import { | |
| AsyncValidator, | |
| ValidationErrors, | |
| Validator, | |
| } from 'fluentvalidation-ts'; | |
| import { FieldError, FieldValues, Resolver } from 'react-hook-form'; | |
| function traverseObject<T>( | |
| object: ValidationErrors<T>, | |
| errors: Record<string, FieldError>, | |
| parentIndices: (string | number)[] = [], | |
| ) { | |
| for (const key in object) { | |
| const currentIndex = [...parentIndices, key]; | |
| const currentValue = object[key]; | |
| if (Array.isArray(currentValue)) { | |
| currentValue.forEach((item: any, index: number) => { | |
| traverseObject(item, errors, [...currentIndex, index]); | |
| }); | |
| } else if (typeof currentValue === 'object' && currentValue !== null) { | |
| traverseObject(currentValue, errors, currentIndex); | |
| } else if (typeof currentValue === 'string') { | |
| errors[currentIndex.join('.')] = { | |
| type: 'validation', | |
| message: currentValue, | |
| }; | |
| } | |
| } | |
| } | |
| const parseErrorSchema = <T>( | |
| validationErrors: ValidationErrors<T>, | |
| validateAllFieldCriteria: boolean, | |
| ) => { | |
| if (validateAllFieldCriteria) { | |
| // TODO: check this but i think its always one validation error | |
| } | |
| const errors: Record<string, FieldError> = {}; | |
| traverseObject(validationErrors, errors); | |
| return errors; | |
| }; | |
| export function fluentValidationResolver<TFieldValues extends FieldValues>( | |
| validator: Validator<TFieldValues>, | |
| ): Resolver<TFieldValues> { | |
| return async (values, _context, options) => { | |
| const validationResult = validator.validate(values); | |
| const isValid = Object.keys(validationResult).length === 0; | |
| options.shouldUseNativeValidation && validateFieldsNatively({}, options); | |
| return isValid | |
| ? { | |
| values: values, | |
| errors: {}, | |
| } | |
| : { | |
| values: {}, | |
| errors: toNestErrors( | |
| parseErrorSchema( | |
| validationResult, | |
| !options.shouldUseNativeValidation && | |
| options.criteriaMode === 'all', | |
| ), | |
| options, | |
| ), | |
| }; | |
| }; | |
| } | |
| export function fluentAsyncValidationResolver< | |
| TFieldValues extends FieldValues, | |
| TValidator extends AsyncValidator<TFieldValues>, | |
| >(validator: TValidator): Resolver<TFieldValues> { | |
| return async (values, _context, options) => { | |
| const validationResult = await validator.validateAsync(values); | |
| const isValid = Object.keys(validationResult).length === 0; | |
| options.shouldUseNativeValidation && validateFieldsNatively({}, options); | |
| return isValid | |
| ? { | |
| values: values, | |
| errors: {}, | |
| } | |
| : { | |
| values: {}, | |
| errors: toNestErrors( | |
| parseErrorSchema( | |
| validationResult, | |
| !options.shouldUseNativeValidation && | |
| options.criteriaMode === 'all', | |
| ), | |
| options, | |
| ), | |
| }; | |
| }; | |
| } | |