import { get } from "lodash"; import FieldInterface from "../models/FieldInterface"; import FormInterface from "../models/FormInterface"; import StateInterface from "../models/StateInterface"; import { ZodSchema } from "zod"; import { ValidationPlugin, ValidationPluginConfig, ValidationPluginConstructor, ValidationPluginInterface, } from "../models/ValidatorInterface"; class ZOD implements ValidationPluginInterface { promises: Promise[]; config: ValidationPluginConfig; state: StateInterface; extend?: (args: { validator: TValidator; form: FormInterface }) => void; validator: any; schema: ZodSchema; constructor({ config, state = null, promises = [], }: ValidationPluginConstructor) { this.state = state; this.promises = promises; this.config = config; this.extend = config?.extend; this.validator = config.package; this.schema = config.schema as ZodSchema; this.extendValidator(); } extendValidator(): void { if (typeof this.extend === "function") { this.extend({ validator: this.validator, form: this.state.form, }); } } validate(field: FieldInterface): void { const result = this.schema.safeParse(field.state.form.flatMapValues); if (result.success) return; const fieldErrors = get( (result as any).error.format(), field.path )?._errors; if (fieldErrors?.length) { field.validationErrorStack = fieldErrors; } } } export default ( config?: ValidationPluginConfig ): ValidationPlugin => ({ class: ZOD, config, });