/** * Form Schema */ export type ReservedFormStateKeys = 'valid' | 'invalid' | 'untouched' | 'touched' | 'pristine' | 'dirty'; export type ReservedFormFieldKeys = 'value' | 'validators'; export type ReservedFormKeys = ReservedFormFieldKeys | ReservedFormStateKeys | 'errors'; export type AllowedFormKeys = Exclude; export type ValidateOnEvent = 'blur' | 'change' | 'input' | 'submit'; export type FormValue = FormValue[] | object | string | number | boolean | null | undefined; export type FormValidatorFn, S extends Form = Form> = (value: FormValue, options: T & { schema?: ResolvedFormSchema | FormSchema; path: string; }) => boolean | Promise; export interface FormValidator { name: string; [key: string]: any; } export type FormField = { value?: V; validateOn?: ValidateOnEvent; validators?: Array; }; export type Form = Record; export type FormSchema = { [K in keyof T]: T[K] extends infer U ? U extends Array ? U extends FormField ? FormField : V extends object ? FormSchema[] : FormField[] | FormField : U extends object ? FormSchema : FormField : never; }; /** * Resolved Form Schema */ export interface FormError { name: string; message: string; path: string; } export interface FormState { valid: boolean; invalid: boolean; untouched: boolean; touched: boolean; pristine: boolean; dirty: boolean; errors: FormError[]; } export type ResolvedFormField = { value: V; validators: Array; } & FormState; export type ResolvedFormSchema = { [K in keyof T]: T[K] extends Array ? V extends object ? ResolvedFormSchema[] : ResolvedFormField[] : T[K] extends object ? ResolvedFormSchema : ResolvedFormField; } & FormState;