{"version":3,"file":"form-validator.mjs","sources":["../../../../src/lib/data/validation/form-validator.ts"],"sourcesContent":["/**\n * @file Form Validator\n * @description Production-grade form validation with field-level tracking,\n * async validation, validation modes, and React integration.\n *\n * Features:\n * - Field-level validation with error tracking\n * - Multiple validation modes (onChange, onBlur, onSubmit)\n * - Async validation with debouncing\n * - Cross-field validation (dependent fields)\n * - Touch and dirty state tracking\n * - Schema integration\n *\n * @example\n * ```typescript\n * import { createFormValidator, useFormValidation } from '@/lib/data/validation';\n *\n * const validator = createFormValidator({\n *   email: [required(), email()],\n *   password: [required(), minLength(8)],\n *   confirmPassword: [required(), matches('password')],\n * });\n *\n * // In component\n * const { validate, errors, isValid } = useFormValidation(validator);\n * ```\n */\n\nimport type React from 'react';\nimport { useState, useCallback, useRef, useMemo, useEffect } from 'react';\nimport type { BaseSchema, Infer } from './schema-validator';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Field validation rule function\n */\nexport type FieldRule<T = unknown> = (\n  value: T,\n  formData: Record<string, unknown>,\n  fieldName: string\n) => string | undefined | Promise<string | undefined>;\n\n/**\n * Field validation configuration\n */\nexport interface FieldConfig<T = unknown> {\n  /** Validation rules */\n  rules: FieldRule<T>[];\n  /** Async validation debounce delay (ms) */\n  debounce?: number;\n  /** Dependencies for cross-field validation */\n  dependsOn?: string[];\n  /** Custom transform before validation */\n  transform?: (value: unknown) => T;\n  /** When to validate */\n  validateOn?: ('change' | 'blur' | 'submit')[];\n}\n\n/**\n * Validation error (same as FieldError)\n */\nexport type ValidationError = FieldError;\n\n/**\n * Form validation configuration\n */\nexport type FormConfig<T extends Record<string, unknown>> = {\n  [K in keyof T]?: FieldRule<T[K]>[] | FieldConfig<T[K]>;\n};\n\n/**\n * Field error state\n */\nexport interface FieldError {\n  message: string;\n  rule?: string;\n}\n\n/**\n * Field state\n */\nexport interface FieldState {\n  /** Current value */\n  value: unknown;\n  /** Field errors */\n  errors: FieldError[];\n  /** Field has been touched (focused then blurred) */\n  touched: boolean;\n  /** Field value has changed from initial */\n  dirty: boolean;\n  /** Field is currently being validated */\n  validating: boolean;\n  /** Field is valid (no errors and has been validated) */\n  valid: boolean;\n}\n\n/**\n * Form state\n */\nexport interface FormState<T extends Record<string, unknown>> {\n  /** Field states */\n  fields: { [K in keyof T]: FieldState };\n  /** Form-level errors */\n  errors: FieldError[];\n  /** Any async validation in progress */\n  validating: boolean;\n  /** Form has been touched */\n  touched: boolean;\n  /** Form values have changed */\n  dirty: boolean;\n  /** Form is valid */\n  valid: boolean;\n  /** Form has been submitted */\n  submitted: boolean;\n  /** Submit attempt count */\n  submitCount: number;\n}\n\n/**\n * Validation mode\n */\nexport type ValidationMode = 'onChange' | 'onBlur' | 'onSubmit' | 'all';\n\n/**\n * Form validator options\n */\nexport interface FormValidatorOptions {\n  /** Primary validation mode */\n  mode?: ValidationMode;\n  /** Revalidate mode after first submit */\n  revalidateMode?: 'onChange' | 'onBlur';\n  /** Validate all fields on mount */\n  validateOnMount?: boolean;\n  /** Show errors only after first submit */\n  showErrorsAfterSubmit?: boolean;\n  /** Debounce time for async validation */\n  debounceMs?: number;\n  /** Abort validation on unmount */\n  abortOnUnmount?: boolean;\n}\n\n/**\n * Form validator instance\n */\nexport interface FormValidator<T extends Record<string, unknown>> {\n  /** Validate a single field */\n  validateField: (field: keyof T, value: unknown, formData: T) => Promise<FieldError[]>;\n  /** Validate all fields */\n  validateAll: (formData: T) => Promise<{ valid: boolean; errors: Record<keyof T, FieldError[]> }>;\n  /** Get field configuration */\n  getFieldConfig: (field: keyof T) => FieldConfig<T[keyof T]> | undefined;\n  /** Check if field has async rules */\n  hasAsyncRules: (field: keyof T) => boolean;\n}\n\n// =============================================================================\n// VALIDATION RULES\n// =============================================================================\n\n/**\n * Create a required field rule\n */\nexport function required(message = 'This field is required'): FieldRule {\n  return (value) => {\n    if (value === undefined || value === null || value === '') {\n      return message;\n    }\n    if (Array.isArray(value) && value.length === 0) {\n      return message;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a minimum length rule\n */\nexport function minLength(length: number, message?: string): FieldRule<string> {\n  return (value) => {\n    if (value.length < length) {\n      return message ?? `Must be at least ${length} characters`;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a maximum length rule\n */\nexport function maxLength(length: number, message?: string): FieldRule<string> {\n  return (value) => {\n    if (value.length > length) {\n      return message ?? `Must be at most ${length} characters`;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a minimum value rule\n */\nexport function min(minValue: number, message?: string): FieldRule<number> {\n  return (value) => {\n    if (value < minValue) {\n      return message !== undefined && message !== '' ? message : `Must be at least ${minValue}`;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a maximum value rule\n */\nexport function max(maxValue: number, message?: string): FieldRule<number> {\n  return (value) => {\n    if (value > maxValue) {\n      return message !== undefined && message !== '' ? message : `Must be at most ${maxValue}`;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a pattern matching rule\n */\nexport function pattern(regex: RegExp, message = 'Invalid format'): FieldRule<string> {\n  return (value) => {\n    if (value === '') return undefined;\n    if (!regex.test(value)) {\n      return message;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create an email validation rule\n */\nexport function email(message = 'Invalid email address'): FieldRule<string> {\n  return pattern(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/, message);\n}\n\n/**\n * Create a URL validation rule\n */\nexport function url(message = 'Invalid URL'): FieldRule<string> {\n  return (value) => {\n    if (value === '') return undefined;\n    try {\n      new URL(value);\n      return undefined;\n    } catch {\n      return message;\n    }\n  };\n}\n\n/**\n * Create a matches (confirm) rule\n */\nexport function matches(fieldName: string, message?: string): FieldRule {\n  return (value, formData) => {\n    if (value !== formData[fieldName]) {\n      return message !== undefined && message !== '' ? message : `Must match ${fieldName}`;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a custom validation rule\n */\nexport function custom<T>(\n  validator: (value: T, formData: Record<string, unknown>) => boolean | string,\n  message = 'Validation failed'\n): FieldRule<T> {\n  return (value, formData) => {\n    const result = validator(value, formData);\n    if (result === false) {\n      return message;\n    }\n    if (typeof result === 'string') {\n      return result;\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create an async validation rule\n */\nexport function asyncRule<T>(\n  validator: (value: T, formData: Record<string, unknown>) => Promise<string | undefined>,\n  options?: { debounce?: number }\n): FieldRule<T> & { _async: true; _debounce?: number } {\n  const rule = validator as unknown as FieldRule<T> & { _async: true; _debounce?: number };\n  rule._async = true;\n  rule._debounce = options?.debounce;\n  return rule;\n}\n\n/**\n * Create a schema validation rule\n */\nexport function schema<T extends BaseSchema<unknown>>(\n  schemaInstance: T,\n  message?: string\n): FieldRule<Infer<T>> {\n  return (value) => {\n    const result = schemaInstance.safeParse(value);\n    if (!result.success) {\n      const firstIssueMessage = result.issues[0]?.message;\n      return message ?? firstIssueMessage ?? 'Validation failed';\n    }\n    return undefined;\n  };\n}\n\n/**\n * Create a conditional rule\n */\nexport function when<T>(\n  condition: (formData: Record<string, unknown>) => boolean,\n  rules: FieldRule<T>[]\n): FieldRule<T> {\n  return async (value, formData, fieldName) => {\n    if (!condition(formData)) {\n      return undefined;\n    }\n    for (const rule of rules) {\n      const error = await rule(value, formData, fieldName);\n      if (error !== undefined && error !== '') return error;\n    }\n    return undefined;\n  };\n}\n\n// =============================================================================\n// FORM VALIDATOR FACTORY\n// =============================================================================\n\n/**\n * Normalize field configuration\n */\nfunction normalizeFieldConfig<T>(config: FieldRule<T>[] | FieldConfig<T>): FieldConfig<T> {\n  if (Array.isArray(config)) {\n    return { rules: config };\n  }\n  return config;\n}\n\n/**\n * Check if rule is async\n */\nfunction isAsyncRule(rule: FieldRule): boolean {\n  return '_async' in rule && rule._async === true;\n}\n\n/**\n * Create a form validator\n */\nexport function createFormValidator<T extends Record<string, unknown>>(\n  config: FormConfig<T>\n): FormValidator<T> {\n  const fieldConfigs = new Map<keyof T, FieldConfig<T[keyof T]>>();\n\n  // Normalize all field configs\n  for (const [field, fieldConfig] of Object.entries(config)) {\n    if (fieldConfig !== undefined && fieldConfig !== null) {\n      fieldConfigs.set(\n        field as keyof T,\n        normalizeFieldConfig(fieldConfig as FieldRule<T[keyof T]>[] | FieldConfig<T[keyof T]>)\n      );\n    }\n  }\n\n  return {\n    validateField: async (field, value, formData) => {\n      const fieldConfig = fieldConfigs.get(field);\n      if (!fieldConfig) return [];\n\n      const errors: FieldError[] = [];\n      const transformedValue = fieldConfig.transform ? fieldConfig.transform(value) : value;\n\n      for (const rule of fieldConfig.rules) {\n        try {\n          const error = await rule(\n            transformedValue as T[keyof T],\n            formData as Record<string, unknown>,\n            String(field)\n          );\n          if (error !== undefined && error !== '') {\n            errors.push({ message: error });\n            // Stop on first error for field\n            break;\n          }\n        } catch (err) {\n          errors.push({\n            message: err instanceof Error ? err.message : 'Validation error',\n          });\n        }\n      }\n\n      return errors;\n    },\n\n    validateAll: async (formData) => {\n      const errors: Record<keyof T, FieldError[]> = {} as Record<keyof T, FieldError[]>;\n      let valid = true;\n\n      const validationPromises = Array.from(fieldConfigs.keys()).map(async (field) => {\n        const fieldErrors = await validateField(field, formData[field], formData);\n        errors[field] = fieldErrors;\n        if (fieldErrors.length > 0) valid = false;\n      });\n\n      await Promise.all(validationPromises);\n\n      return { valid, errors };\n\n      async function validateField(field: keyof T, value: unknown, data: T): Promise<FieldError[]> {\n        const fieldConfig = fieldConfigs.get(field);\n        if (!fieldConfig) return [];\n\n        const errs: FieldError[] = [];\n        const transformedValue = fieldConfig.transform ? fieldConfig.transform(value) : value;\n\n        for (const rule of fieldConfig.rules) {\n          try {\n            const error = await rule(\n              transformedValue as T[keyof T],\n              data as Record<string, unknown>,\n              String(field)\n            );\n            if (error !== undefined && error !== '') {\n              errs.push({ message: error });\n              break;\n            }\n          } catch (err) {\n            errs.push({\n              message: err instanceof Error ? err.message : 'Validation error',\n            });\n          }\n        }\n\n        return errs;\n      }\n    },\n\n    getFieldConfig: (field) => fieldConfigs.get(field),\n\n    hasAsyncRules: (field) => {\n      const fieldConfig = fieldConfigs.get(field);\n      if (!fieldConfig) return false;\n      return fieldConfig.rules.some((rule) => isAsyncRule(rule as FieldRule));\n    },\n  };\n}\n\n// =============================================================================\n// REACT HOOK\n// =============================================================================\n\n/**\n * Initial field state\n */\nfunction createInitialFieldState(value: unknown): FieldState {\n  return {\n    value,\n    errors: [],\n    touched: false,\n    dirty: false,\n    validating: false,\n    valid: true,\n  };\n}\n\n/**\n * Form validation React hook\n */\nexport function useFormValidation<T extends Record<string, unknown>>(\n  validator: FormValidator<T>,\n  initialValues: T,\n  options: FormValidatorOptions = {}\n): {\n  values: T;\n  errors: Record<string, ValidationError[]>;\n  touched: Record<string, boolean>;\n  dirty: Record<string, boolean>;\n  isValid: boolean;\n  isValidating: boolean;\n  isSubmitting: boolean;\n  isSubmitted: boolean;\n  submitCount: number;\n  formErrors: ValidationError[];\n  setValue: (field: keyof T, value: unknown, options?: { shouldValidate?: boolean }) => void;\n  setValues: (values: Partial<T>, options?: { shouldValidate?: boolean }) => void;\n  setTouched: (field: keyof T, touched: boolean) => void;\n  setError: (field: keyof T, error: string) => void;\n  clearError: (field: keyof T) => void;\n  clearAllErrors: () => void;\n  reset: (values?: Partial<T>) => void;\n  validateField: (field: keyof T, value?: unknown) => Promise<boolean>;\n  validateAll: () => Promise<boolean>;\n  getValues: () => T;\n  handleBlur: (field: keyof T) => void;\n  handleSubmit: (\n    onSubmit: (values: T) => void | Promise<void>\n  ) => (e?: React.FormEvent) => Promise<void>;\n  registerField: (field: keyof T) => {\n    value: T[keyof T];\n    onChange: (value: unknown) => void;\n    onBlur: () => void;\n    error: string | undefined;\n    touched: boolean;\n    dirty: boolean;\n  };\n} {\n  const {\n    mode = 'onSubmit',\n    revalidateMode = 'onChange',\n    validateOnMount = false,\n    debounceMs = 300,\n  } = options;\n\n  // Initialize field states\n  const initialFieldStates = useMemo(() => {\n    const states: Record<string, FieldState> = {};\n    for (const [key, value] of Object.entries(initialValues)) {\n      states[key] = createInitialFieldState(value);\n    }\n    return states as { [K in keyof T]: FieldState };\n  }, [initialValues]);\n\n  // State\n  const [fieldStates, setFieldStates] = useState(initialFieldStates);\n  const [formErrors, setFormErrors] = useState<FieldError[]>([]);\n  const [isSubmitted, setIsSubmitted] = useState(false);\n  const [submitCount, setSubmitCount] = useState(0);\n  const [isValidating, setIsValidating] = useState(false);\n\n  // Refs for debouncing\n  const debounceTimers = useRef<Map<keyof T, ReturnType<typeof setTimeout>>>(new Map());\n  const abortControllers = useRef<Map<keyof T, AbortController>>(new Map());\n\n  // Cleanup on unmount\n  useEffect(() => {\n    const timers = debounceTimers.current;\n    const controllers = abortControllers.current;\n    return () => {\n      timers.forEach((timer) => clearTimeout(timer));\n      controllers.forEach((controller) => controller.abort());\n    };\n  }, []);\n\n  // Validate on mount if configured\n  useEffect(() => {\n    if (validateOnMount) {\n      void validateAllFields();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Get current form values\n  const getValues = useCallback((): T => {\n    const values: Record<string, unknown> = {};\n    for (const [key, state] of Object.entries(fieldStates)) {\n      values[key] = state.value;\n    }\n    return values as T;\n  }, [fieldStates]);\n\n  // Validate a single field\n  const validateFieldInternal = useCallback(\n    async (field: keyof T, value?: unknown): Promise<FieldError[]> => {\n      const currentValue = value ?? fieldStates[field as string]?.value;\n      const formData = getValues();\n\n      // Cancel any pending validation\n      const existingController = abortControllers.current.get(field);\n      if (existingController) {\n        existingController.abort();\n      }\n\n      const controller = new AbortController();\n      abortControllers.current.set(field, controller);\n\n      setFieldStates((prev) => ({\n        ...prev,\n        [field]: { ...prev[field as string], validating: true },\n      }));\n\n      try {\n        const errors = await validator.validateField(field, currentValue, formData);\n\n        if (controller.signal.aborted) return [];\n\n        setFieldStates((prev) => ({\n          ...prev,\n          [field]: {\n            ...prev[field as string],\n            errors,\n            validating: false,\n            valid: errors.length === 0,\n          },\n        }));\n\n        return errors;\n      } finally {\n        abortControllers.current.delete(field);\n      }\n    },\n    [fieldStates, getValues, validator]\n  );\n\n  // Public validate field (returns boolean)\n  const validateField = useCallback(\n    async (field: keyof T, value?: unknown): Promise<boolean> => {\n      const errors = await validateFieldInternal(field, value);\n      return errors.length === 0;\n    },\n    [validateFieldInternal]\n  );\n\n  // Validate all fields\n  const validateAllFields = useCallback(async (): Promise<boolean> => {\n    setIsValidating(true);\n\n    try {\n      const { valid, errors } = await validator.validateAll(getValues());\n\n      setFieldStates((prev) => {\n        const newStates = { ...prev } as Record<string, FieldState>;\n        for (const [field, fieldErrors] of Object.entries(errors)) {\n          const prevState = prev[field as keyof T];\n          newStates[field] = {\n            value: prevState?.value ?? null,\n            errors: fieldErrors,\n            validating: false,\n            valid: fieldErrors.length === 0,\n            touched: prevState?.touched ?? false,\n            dirty: prevState?.dirty ?? false,\n          };\n        }\n        return newStates as { [K in keyof T]: FieldState };\n      });\n\n      return valid;\n    } finally {\n      setIsValidating(false);\n    }\n  }, [getValues, validator]);\n\n  // Should validate based on mode\n  const shouldValidate = useCallback(\n    (trigger: 'change' | 'blur' | 'submit'): boolean => {\n      if (mode === 'all') return true;\n      if (mode === `on${trigger.charAt(0).toUpperCase()}${trigger.slice(1)}`) return true;\n      return (\n        isSubmitted && revalidateMode === `on${trigger.charAt(0).toUpperCase()}${trigger.slice(1)}`\n      );\n    },\n    [mode, revalidateMode, isSubmitted]\n  );\n\n  // Set field value\n  const setValue = useCallback(\n    (field: keyof T, value: unknown, options?: { shouldValidate?: boolean }) => {\n      setFieldStates((prev) => ({\n        ...prev,\n        [field]: {\n          ...prev[field as string],\n          value,\n          dirty: true,\n        },\n      }));\n\n      const shouldVal = options?.shouldValidate ?? shouldValidate('change');\n\n      if (shouldVal) {\n        // Clear existing debounce\n        const existingTimer = debounceTimers.current.get(field);\n        if (existingTimer) {\n          clearTimeout(existingTimer);\n        }\n\n        // Debounce validation\n        if (validator.hasAsyncRules(field)) {\n          const timer = setTimeout(() => {\n            void validateFieldInternal(field, value);\n          }, debounceMs);\n          debounceTimers.current.set(field, timer);\n        } else {\n          void validateFieldInternal(field, value);\n        }\n      }\n    },\n    [shouldValidate, validator, validateFieldInternal, debounceMs]\n  );\n\n  // Set multiple values\n  const setValues = useCallback(\n    (values: Partial<T>, options?: { shouldValidate?: boolean }) => {\n      for (const [field, value] of Object.entries(values)) {\n        setValue(field as keyof T, value, options);\n      }\n    },\n    [setValue]\n  );\n\n  // Mark field as touched\n  const setTouched = useCallback(\n    (field: keyof T, touched = true, options?: { shouldValidate?: boolean }) => {\n      setFieldStates((prev) => ({\n        ...prev,\n        [field]: { ...prev[field as string], touched },\n      }));\n\n      const shouldVal = options?.shouldValidate ?? shouldValidate('blur');\n      if (shouldVal && touched) {\n        void validateFieldInternal(field);\n      }\n    },\n    [shouldValidate, validateFieldInternal]\n  );\n\n  // Handle blur\n  const handleBlur = useCallback(\n    (field: keyof T) => {\n      setTouched(field, true);\n    },\n    [setTouched]\n  );\n\n  // Reset form\n  const reset = useCallback(\n    (values?: Partial<T>) => {\n      const resetValues = values ? { ...initialValues, ...values } : initialValues;\n\n      setFieldStates(() => {\n        const states: Record<string, FieldState> = {};\n        for (const [key, value] of Object.entries(resetValues)) {\n          states[key] = createInitialFieldState(value);\n        }\n        return states as { [K in keyof T]: FieldState };\n      });\n\n      setFormErrors([]);\n      setIsSubmitted(false);\n    },\n    [initialValues]\n  );\n\n  // Handle submit\n  const handleSubmit = useCallback(\n    (onSubmit: (values: T) => void | Promise<void>) => {\n      return async (e?: React.FormEvent) => {\n        if (e) {\n          e.preventDefault();\n        }\n\n        setIsSubmitted(true);\n        setSubmitCount((c) => c + 1);\n\n        const isValid = await validateAllFields();\n\n        if (isValid) {\n          try {\n            await onSubmit(getValues());\n          } catch (error) {\n            setFormErrors([\n              {\n                message: error instanceof Error ? error.message : 'Submit failed',\n              },\n            ]);\n          }\n        }\n      };\n    },\n    [validateAllFields, getValues]\n  );\n\n  // Compute derived state\n  const isValid = useMemo(() => {\n    return Object.values(fieldStates).every((state) => state.valid);\n  }, [fieldStates]);\n\n  // Get all errors (as ValidationError[])\n  const getAllErrors = useCallback((): Record<string, ValidationError[]> => {\n    const errors: Record<string, ValidationError[]> = {};\n    for (const [field] of Object.entries(fieldStates)) {\n      const state = fieldStates[field as keyof T];\n      errors[field] = state?.errors ?? [];\n    }\n    return errors;\n  }, [fieldStates]);\n\n  return {\n    // State\n    values: getValues(),\n    errors: getAllErrors(),\n    touched: Object.keys(fieldStates).reduce(\n      (acc, key) => {\n        acc[key] = fieldStates[key as keyof T]?.touched ?? false;\n        return acc;\n      },\n      {} as Record<string, boolean>\n    ),\n    dirty: Object.keys(fieldStates).reduce(\n      (acc, key) => {\n        acc[key] = fieldStates[key as keyof T]?.dirty ?? false;\n        return acc;\n      },\n      {} as Record<string, boolean>\n    ),\n    isValid,\n    isValidating,\n    isSubmitting: false,\n    isSubmitted,\n    submitCount,\n    formErrors,\n\n    // Actions\n    setValue,\n    setValues,\n    setTouched,\n    setError: (field: keyof T, error: string) => {\n      setFieldStates((prev) => ({\n        ...prev,\n        [field]: {\n          ...prev[field as string],\n          errors: [{ message: error }],\n          valid: false,\n        },\n      }));\n    },\n    clearError: (field: keyof T) => {\n      setFieldStates((prev) => ({\n        ...prev,\n        [field]: {\n          ...prev[field as string],\n          errors: [],\n          valid: true,\n        },\n      }));\n    },\n    clearAllErrors: () => {\n      setFieldStates((prev) => {\n        const newStates = { ...prev } as { [K in keyof T]: FieldState };\n        for (const key of Object.keys(newStates)) {\n          const typedKey = key as keyof T;\n          newStates[typedKey] = {\n            ...newStates[typedKey],\n            errors: [],\n            valid: true,\n          };\n        }\n        return newStates;\n      });\n    },\n    reset,\n    validateField,\n    validateAll: validateAllFields,\n    getValues,\n    handleBlur,\n    handleSubmit,\n    registerField: (field: keyof T) => {\n      const state = fieldStates[field as string];\n      return {\n        value: (state?.value ?? '') as T[keyof T],\n        onChange: (value: unknown) => setValue(field, value),\n        onBlur: () => handleBlur(field),\n        error: state?.errors[0]?.message,\n        touched: state?.touched ?? false,\n        dirty: state?.dirty ?? false,\n      };\n    },\n  };\n}\n\n// =============================================================================\n// FIELD WRAPPER HOOK\n// =============================================================================\n\n/**\n * Hook for individual field validation\n */\nexport function useField<T>(\n  name: string,\n  rules: FieldRule<T>[],\n  options?: {\n    defaultValue?: T;\n    validateOnChange?: boolean;\n    validateOnBlur?: boolean;\n    debounceMs?: number;\n  }\n): {\n  value: T | undefined;\n  setValue: (val: T | undefined) => void;\n  error: string | undefined;\n  errors: FieldError[];\n  touched: boolean;\n  setTouched: (val: boolean) => void;\n  validating: boolean;\n  onChange: (val: T | undefined) => void;\n  onBlur: () => void;\n  validate: (val?: T) => Promise<FieldError[]>;\n  reset: (newValue?: T) => void;\n} {\n  const {\n    defaultValue,\n    validateOnChange = true,\n    validateOnBlur = true,\n    debounceMs = 300,\n  } = options ?? {};\n\n  const [value, setValueState] = useState<T | undefined>(defaultValue);\n  const [errors, setErrors] = useState<FieldError[]>([]);\n  const [touched, setTouched] = useState(false);\n  const [validating, setValidating] = useState(false);\n\n  const debounceTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n  const validate = useCallback(\n    async (val: T | undefined): Promise<FieldError[]> => {\n      setValidating(true);\n      const fieldErrors: FieldError[] = [];\n\n      for (const rule of rules) {\n        try {\n          const error = await rule(val as T, {}, name);\n          if (error !== undefined && error !== '') {\n            fieldErrors.push({ message: error });\n            break;\n          }\n        } catch (err) {\n          fieldErrors.push({\n            message: err instanceof Error ? err.message : 'Validation error',\n          });\n        }\n      }\n\n      setErrors(fieldErrors);\n      setValidating(false);\n      return fieldErrors;\n    },\n    [rules, name]\n  );\n\n  const setValue = useCallback(\n    (newValue: T | undefined) => {\n      setValueState(newValue);\n      if (!touched) {\n        setTouched(true);\n      }\n\n      if (validateOnChange) {\n        if (debounceTimer.current !== undefined) {\n          clearTimeout(debounceTimer.current);\n        }\n        debounceTimer.current = setTimeout(() => {\n          void validate(newValue);\n        }, debounceMs);\n      }\n    },\n    [touched, validateOnChange, debounceMs, validate]\n  );\n\n  const handleBlur = useCallback(() => {\n    setTouched(true);\n    if (validateOnBlur) {\n      void validate(value);\n    }\n  }, [validateOnBlur, validate, value]);\n\n  const reset = useCallback(\n    (newValue?: T) => {\n      setValueState(newValue ?? defaultValue);\n      setErrors([]);\n      setTouched(false);\n    },\n    [defaultValue]\n  );\n\n  useEffect(() => {\n    return () => {\n      if (debounceTimer.current) {\n        clearTimeout(debounceTimer.current);\n      }\n    };\n  }, []);\n\n  return {\n    value,\n    setValue,\n    error: errors[0]?.message,\n    errors,\n    touched,\n    setTouched,\n    validating,\n    onChange: setValue,\n    onBlur: handleBlur,\n    validate: async () => validate(value),\n    reset,\n  };\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\nexport const rules = {\n  required,\n  minLength,\n  maxLength,\n  min,\n  max,\n  pattern,\n  email,\n  url,\n  matches,\n  custom,\n  async: asyncRule,\n  schema,\n  when,\n} as const;\n"],"names":["required","message","value","minLength","length","maxLength","min","minValue","max","maxValue","pattern","regex","email","url","matches","fieldName","formData","custom","validator","result","asyncRule","options","rule","schema","schemaInstance","firstIssueMessage","when","condition","rules","error","normalizeFieldConfig","config","isAsyncRule","createFormValidator","fieldConfigs","field","fieldConfig","errors","transformedValue","err","valid","validationPromises","fieldErrors","validateField","data","errs","createInitialFieldState","useFormValidation","initialValues","mode","revalidateMode","validateOnMount","debounceMs","initialFieldStates","useMemo","states","key","fieldStates","setFieldStates","useState","formErrors","setFormErrors","isSubmitted","setIsSubmitted","submitCount","setSubmitCount","isValidating","setIsValidating","debounceTimers","useRef","abortControllers","useEffect","timers","controllers","timer","controller","validateAllFields","getValues","useCallback","values","state","validateFieldInternal","currentValue","existingController","prev","newStates","prevState","shouldValidate","trigger","setValue","existingTimer","setValues","setTouched","touched","handleBlur","reset","resetValues","handleSubmit","onSubmit","e","c","isValid","getAllErrors","acc","typedKey","useField","name","defaultValue","validateOnChange","validateOnBlur","setValueState","setErrors","validating","setValidating","debounceTimer","validate","val","newValue"],"mappings":"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"}