import { type MessageParams, type UiMessages } from './i18n.js'; import type { FormDataValues, FormErrors } from './formContext.js'; export type BuiltinRule = 'required' | 'email' | 'url' | `minLength:${number}` | `maxLength:${number}` | `min:${number}` | `max:${number}`; export type CustomRule = (value: unknown, data: T) => string | undefined | null | false; export type PatternRule = { pattern: RegExp; message?: string; }; export type FieldRule = BuiltinRule | PatternRule | CustomRule; export type FormRules = { [K in keyof T]?: FieldRule | FieldRule[]; }; export interface ValidateOptions { /** Locale for built-in messages (`es`, `en`, …) */ locale?: string; /** Override validation copy */ messages?: Partial; /** Translate helper (e.g. `i18n.t`) */ t?: (key: keyof UiMessages, params?: MessageParams) => string; } /** * Declarative validation → `FormErrors` for `
`. * * @example * ```ts * errors = validateForm(data, { * email: ['required', 'email'], * password: ['required', 'minLength:8'], * age: ['min:18'] * }, { locale: 'es' }); * ``` */ export declare function validateForm(data: T, rules: FormRules, options?: ValidateOptions): FormErrors; /** True when `current` differs from `initial` (shallow JSON compare). */ export declare function isFormDirty(current: T, initial: T): boolean; /** First error message, or `undefined` when valid. */ export declare function firstFormError(errors: FormErrors): string | undefined;