fluent-vuelidate
Version:
A fluent, typescript-first validation library for Vue3
60 lines (59 loc) • 2.51 kB
JavaScript
;
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;