JenkinsDev/Validatinator

View on GitHub
src/validatinator.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { FormValidationConfigs, FieldValidationConfigs, ValidationMessages } from "./interfaces.js";
import { ValidationStateBuilder, ValidationState } from "./state.js";
import { HTMLFormValidations } from "./validations.js";
import { prepareValidationRules } from "./utility.js";

export class Validatinator {

  constructor(
    public readonly config: FormValidationConfigs,
    public readonly messageOverrides: ValidationMessages = {}
  ) {}

  async validate(formSelector: string): Promise<ValidationState> {
    const formFieldConfigs = this.getFormConfig(formSelector);
    if (!formFieldConfigs) throw new Error(`No validation config found for form: ${formSelector}`);

    const form = document.querySelector(formSelector);
    if (!form) throw new Error(`No form found with selector: ${formSelector}`);

    const stateBuilder = new ValidationStateBuilder(formFieldConfigs, this.messageOverrides);

    Object.keys(formFieldConfigs).forEach((fieldSelector: string) => {
      const field = form.querySelector(fieldSelector);
      if (!field) throw new Error(`No field found with selector: ${fieldSelector}`);

      const unpreparedValidationRules = formFieldConfigs[fieldSelector];
      prepareValidationRules(unpreparedValidationRules).forEach(([method, ...params]) => {
        const methodCallable = (HTMLFormValidations as any)[method];
        if (!methodCallable) throw new Error(`No validation method found with name: ${method}`);

        const result = methodCallable(form, field, ...params);
        stateBuilder.addResult(fieldSelector, method, result);
      });
    });

    return stateBuilder.build();
  }

  getFormConfig(formSelector: string): FieldValidationConfigs {
    return this.config[formSelector];
  }
}