UNPKG

fluent-vuelidate

Version:

A fluent, typescript-first validation library for Vue3

60 lines (59 loc) 2.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useValidator = void 0; const vue_1 = require("vue"); const field_state_controller_1 = require("./field-state-controller"); const field_type_factory_1 = require("./field-type-factory"); const types_1 = require("./types"); const validation_runner_1 = require("./validation-runner"); /** * Returns an instance of the validation builder. * @param instance An instance of the model to be validated * @returns ValidationBuilder<T> */ const useValidator = (instance) => { const builder = {}; const modelValidations = {}; const { fieldStateController, fieldStates } = (0, field_state_controller_1.useFieldStateController)(instance); const isValid = (0, vue_1.computed)(() => { const hasUntouchedFields = fieldStateController.hasUntouchedFields(); if (hasUntouchedFields) { (0, validation_runner_1.runValidations)(modelValidations, fieldStateController); } return fieldStateController.areAllFieldsValid(); }); const fieldValidation = (property) => { const fieldValidator = (0, field_type_factory_1.useFieldValidationFactory)(instance, property, modelValidations); (0, vue_1.watch)(() => instance[property], () => { if (fieldStates[property].isUntouched) return; const errors = []; modelValidations[property].forEach((action) => { const validationResult = action(); if (validationResult.state === types_1.FieldState.Invalid) { errors.push(validationResult.error); } fieldStateController.set(property, { isValid: validationResult.state === types_1.FieldState.Valid, isUntouched: false, errors, notValid: validationResult.state !== types_1.FieldState.Valid, }); }); }, { flush: 'sync', immediate: true, }); fieldValidator.isValid = isValid; fieldValidator.fields = fieldStates; fieldValidator.next = builder; fieldValidator.model = instance; return fieldValidator; }; builder.isValid = isValid; builder.fields = fieldStates; builder.for = fieldValidation; builder.model = instance; return builder; }; exports.useValidator = useValidator;