@de-formed/node-validations
Version:
Modular, Function-driven Validations
117 lines (101 loc) • 2.82 kB
text/typescript
import {
calculateIsValid,
createGetAllErrors,
createGetError,
createGetFieldValid,
createResetValidationState,
createValidate,
createValidateAll,
createValidateAllIfTrue,
createValidateIfTrue,
createValidateOnBlur,
createValidateOnChange,
createValidationState,
gatherValidationErrors,
ValidationObject,
ValidationSchema,
ValidationState,
} from '@de-formed/base';
// Use whatever kind of statemanagement you like, or use something simple like this
const useCache = (
initial: ValidationState,
): [() => ValidationState, (data: ValidationState) => ValidationState] => {
let state = initial;
const setValidationState = (data: ValidationState) => {
state = data;
return data;
};
const getValidationState = () => state;
return [getValidationState, setValidationState];
};
export function Validation<S>(validationSchema: ValidationSchema<S>) {
const [getValidationState, setValidationState] = useCache(
createValidationState(validationSchema),
);
const resetValidationState = createResetValidationState(
validationSchema,
setValidationState,
);
const validate = createValidate(
validationSchema,
getValidationState,
setValidationState,
);
const validateAll = createValidateAll(
validationSchema,
getValidationState,
setValidationState,
);
const validateAllIfTrue = createValidateAllIfTrue(
validationSchema,
getValidationState,
setValidationState,
);
const validateIfTrue = createValidateIfTrue(
validationSchema,
getValidationState,
setValidationState,
);
const validateOnBlur = createValidateOnBlur(
validationSchema,
getValidationState,
setValidationState,
);
const validateOnChange = createValidateOnChange(
validationSchema,
getValidationState,
setValidationState,
);
const getError = createGetError<S>(getValidationState);
const getAllErrors = createGetAllErrors<S>(getValidationState);
const getFieldValid = createGetFieldValid<S>(getValidationState);
const validationObject: ValidationObject<S> = {
getAllErrors,
getError,
getFieldValid,
isValid: true,
resetValidationState,
setValidationState,
validate,
validateAll,
validateAllIfTrue,
validateIfTrue,
validateOnBlur,
validateOnChange,
validationErrors: [],
validationState: {},
};
Object.defineProperty(validationObject, 'isValid', {
get: () => calculateIsValid(getValidationState),
enumerable: true,
});
Object.defineProperty(validationObject, 'validationState', {
get: getValidationState,
enumerable: true,
});
Object.defineProperty(validationObject, 'validationErrors', {
get: () => gatherValidationErrors(getValidationState),
enumerable: true,
});
return validationObject;
}