{"version":3,"file":"useDataValidation.mjs","sources":["../../../../src/lib/data/hooks/useDataValidation.ts"],"sourcesContent":["/**\n * @file useDataValidation Hook\n * @description Comprehensive React hook for data validation with support for\n * schema validation, runtime checks, and form validation.\n *\n * Features:\n * - Schema-based validation with Zod-style API\n * - Runtime type checking\n * - Form validation with field-level control\n * - Async validation support\n * - Validation caching and debouncing\n *\n * @example\n * ```typescript\n * import { useDataValidation, v } from '@/lib/data';\n *\n * const userSchema = v.object({\n *   name: v.string().min(1),\n *   email: v.string().email(),\n *   age: v.number().min(18).optional(),\n * });\n *\n * function UserForm() {\n *   const {\n *     validate,\n *     isValid,\n *     errors,\n *     fieldErrors,\n *     validateField,\n *   } = useDataValidation(userSchema);\n *\n *   const handleSubmit = (data) => {\n *     const result = validate(data);\n *     if (result.success) {\n *       // Submit data\n *     }\n *   };\n * }\n * ```\n */\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type { Schema, ValidationResult, ValidationIssue } from '../validation/schema-validator';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Validation mode\n */\nexport type ValidationMode = 'onChange' | 'onBlur' | 'onSubmit' | 'all';\n\n/**\n * Field error state\n */\nexport interface FieldErrors {\n  [field: string]: string[];\n}\n\n/**\n * Validation state\n */\nexport interface ValidationState<T> {\n  /** Whether validation has been performed */\n  isDirty: boolean;\n  /** Whether validation is in progress */\n  isValidating: boolean;\n  /** Whether data is valid */\n  isValid: boolean;\n  /** Last validated data */\n  lastValidatedData: T | null;\n  /** Validation errors */\n  errors: ValidationIssue[];\n  /** Field-level errors */\n  fieldErrors: FieldErrors;\n  /** Timestamp of last validation */\n  lastValidatedAt: number | null;\n}\n\n/**\n * Validation hook options\n */\nexport interface UseDataValidationOptions<T> {\n  /** Initial data */\n  initialData?: T;\n  /** Validation mode */\n  mode?: ValidationMode;\n  /** Debounce delay in ms */\n  debounceMs?: number;\n  /** Custom field extraction */\n  getFieldValue?: (data: T, field: string) => unknown;\n  /** Transform before validation */\n  transformBeforeValidation?: (data: T) => T;\n  /** Callback on validation success */\n  onValid?: (data: T) => void;\n  /** Callback on validation failure */\n  onInvalid?: (errors: ValidationIssue[]) => void;\n}\n\n/**\n * Validation hook return type\n */\nexport interface UseDataValidationReturn<T> {\n  /** Validate data */\n  validate: (data: T) => ValidationResult<T>;\n  /** Validate asynchronously */\n  validateAsync: (data: T) => Promise<ValidationResult<T>>;\n  /** Validate single field */\n  validateField: (field: string, value: unknown) => ValidationResult<unknown>;\n  /** Clear validation state */\n  clearValidation: () => void;\n  /** Reset to initial state */\n  reset: () => void;\n  /** Current validation state */\n  state: ValidationState<T>;\n  /** Whether data is valid */\n  isValid: boolean;\n  /** Whether validation is dirty */\n  isDirty: boolean;\n  /** Whether validating */\n  isValidating: boolean;\n  /** All errors */\n  errors: ValidationIssue[];\n  /** Field errors */\n  fieldErrors: FieldErrors;\n  /** Get errors for specific field */\n  getFieldErrors: (field: string) => string[];\n  /** Check if field has errors */\n  hasFieldError: (field: string) => boolean;\n  /** Touch a field (mark as dirty) */\n  touchField: (field: string) => void;\n  /** Touched fields */\n  touchedFields: Set<string>;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Hook for data validation\n *\n * @param schema - Validation schema\n * @param options - Hook options\n * @returns Validation state and methods\n */\nexport function useDataValidation<T>(\n  schema: Schema<T>,\n  options: UseDataValidationOptions<T> = {}\n): UseDataValidationReturn<T> {\n  const { initialData, transformBeforeValidation, onValid, onInvalid } = options;\n\n  // State\n  const [state, setState] = useState<ValidationState<T>>({\n    isDirty: false,\n    isValidating: false,\n    isValid: true,\n    lastValidatedData: null,\n    errors: [],\n    fieldErrors: {},\n    lastValidatedAt: null,\n  });\n\n  const [touchedFields, setTouchedFields] = useState<Set<string>>(new Set());\n\n  // Refs\n  const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const schemaRef = useRef(schema);\n\n  // Update ref without causing re-renders\n  useEffect(() => {\n    schemaRef.current = schema;\n  }, [schema]);\n\n  // Extract field errors from validation issues\n  const extractFieldErrors = useCallback((issues: ValidationIssue[]): FieldErrors => {\n    const fieldErrors: FieldErrors = {};\n\n    for (const issue of issues) {\n      const path = issue.path.join('.');\n      fieldErrors[path] ??= [];\n      fieldErrors[path].push(issue.message);\n    }\n\n    return fieldErrors;\n  }, []);\n\n  // Validate data\n  const validate = useCallback(\n    (data: T): ValidationResult<T> => {\n      const dataToValidate = transformBeforeValidation ? transformBeforeValidation(data) : data;\n      const result = schemaRef.current.safeParse(dataToValidate);\n\n      const fieldErrors = result.success ? {} : extractFieldErrors(result.issues);\n\n      setState((prev) => ({\n        ...prev,\n        isDirty: true,\n        isValidating: false,\n        isValid: result.success,\n        lastValidatedData: data,\n        errors: result.success ? [] : result.issues,\n        fieldErrors,\n        lastValidatedAt: Date.now(),\n      }));\n\n      if (result.success) {\n        onValid?.(result.data);\n      } else {\n        onInvalid?.(result.issues);\n      }\n\n      return result;\n    },\n    [transformBeforeValidation, extractFieldErrors, onValid, onInvalid]\n  );\n\n  // Validate asynchronously\n  const validateAsync = useCallback(\n    async (data: T): Promise<ValidationResult<T>> => {\n      setState((prev) => ({ ...prev, isValidating: true }));\n\n      const dataToValidate = transformBeforeValidation ? transformBeforeValidation(data) : data;\n      const result = await schemaRef.current.safeParseAsync(dataToValidate);\n\n      const fieldErrors = result.success ? {} : extractFieldErrors(result.issues);\n\n      setState((prev) => ({\n        ...prev,\n        isDirty: true,\n        isValidating: false,\n        isValid: result.success,\n        lastValidatedData: data,\n        errors: result.success ? [] : result.issues,\n        fieldErrors,\n        lastValidatedAt: Date.now(),\n      }));\n\n      if (result.success) {\n        onValid?.(result.data);\n      } else {\n        onInvalid?.(result.issues);\n      }\n\n      return result;\n    },\n    [transformBeforeValidation, extractFieldErrors, onValid, onInvalid]\n  );\n\n  // Validate single field\n  const validateField = useCallback((field: string, value: unknown): ValidationResult<unknown> => {\n    // Create a temporary object with just this field for validation\n    const testData = { [field]: value } as T;\n    const result = schemaRef.current.safeParse(testData);\n\n    if (result.success) {\n      setState((prev) => {\n        const newFieldErrors = { ...prev.fieldErrors };\n        delete newFieldErrors[field];\n        return {\n          ...prev,\n          fieldErrors: newFieldErrors,\n        };\n      });\n      return { success: true, data: value, issues: [] };\n    }\n\n    // Filter to only errors for this field\n    const fieldIssues = result.issues.filter(\n      (issue: { path: (string | number)[]; message: string }) =>\n        issue.path[0] === field || issue.path.join('.') === field\n    );\n\n    if (fieldIssues.length === 0) {\n      setState((prev) => {\n        const newFieldErrors = { ...prev.fieldErrors };\n        delete newFieldErrors[field];\n        return {\n          ...prev,\n          fieldErrors: newFieldErrors,\n        };\n      });\n      return { success: true, data: value, issues: [] };\n    }\n\n    setState((prev) => ({\n      ...prev,\n      fieldErrors: {\n        ...prev.fieldErrors,\n        [field]: fieldIssues.map((i: { message: string }) => i.message),\n      },\n    }));\n\n    return {\n      success: false,\n      data: undefined,\n      issues: fieldIssues,\n    };\n  }, []);\n\n  // Clear validation\n  const clearValidation = useCallback(() => {\n    setState({\n      isDirty: false,\n      isValidating: false,\n      isValid: true,\n      lastValidatedData: null,\n      errors: [],\n      fieldErrors: {},\n      lastValidatedAt: null,\n    });\n    setTouchedFields(new Set());\n  }, []);\n\n  // Reset to initial state\n  const reset = useCallback(() => {\n    clearValidation();\n    if (initialData !== undefined && initialData !== null) {\n      validate(initialData);\n    }\n  }, [clearValidation, initialData, validate]);\n\n  // Get field errors\n  const getFieldErrors = useCallback(\n    (field: string): string[] => {\n      return state.fieldErrors[field] ?? [];\n    },\n    [state.fieldErrors]\n  );\n\n  // Check if field has errors\n  const hasFieldError = useCallback(\n    (field: string): boolean => {\n      return (state.fieldErrors[field]?.length ?? 0) > 0;\n    },\n    [state.fieldErrors]\n  );\n\n  // Touch a field\n  const touchField = useCallback((field: string) => {\n    setTouchedFields((prev) => new Set(prev).add(field));\n  }, []);\n\n  // Cleanup debounce on unmount\n  useEffect(() => {\n    const currentDebounce = debounceRef.current;\n    return () => {\n      if (currentDebounce != null) {\n        clearTimeout(currentDebounce);\n      }\n    };\n  }, []);\n\n  return {\n    validate,\n    validateAsync,\n    validateField,\n    clearValidation,\n    reset,\n    state,\n    isValid: state.isValid,\n    isDirty: state.isDirty,\n    isValidating: state.isValidating,\n    errors: state.errors,\n    fieldErrors: state.fieldErrors,\n    getFieldErrors,\n    hasFieldError,\n    touchField,\n    touchedFields,\n  };\n}\n\n// =============================================================================\n// SPECIALIZED HOOKS\n// =============================================================================\n\n/**\n * Hook for validating data on change with debouncing\n *\n * @param schema - Validation schema\n * @param data - Data to validate\n * @param debounceMs - Debounce delay\n * @returns Validation state\n */\nexport function useValidateOnChange<T>(\n  schema: Schema<T>,\n  data: T,\n  debounceMs: number = 300\n): {\n  isValid: boolean;\n  errors: ValidationIssue[];\n  isValidating: boolean;\n} {\n  const [result, setResult] = useState<{\n    isValid: boolean;\n    errors: ValidationIssue[];\n    lastValidatedData: T | null;\n    isValidating: boolean;\n  }>({ isValid: true, errors: [], lastValidatedData: null, isValidating: false });\n\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  useEffect(() => {\n    const timeout = timeoutRef.current;\n    if (timeout !== null) {\n      clearTimeout(timeout);\n    }\n\n    timeoutRef.current = setTimeout(() => {\n      const validationResult = schema.safeParse(data);\n      setResult({\n        isValid: validationResult.success,\n        errors: validationResult.success ? [] : validationResult.issues,\n        lastValidatedData: data,\n        isValidating: false,\n      });\n    }, debounceMs);\n\n    return () => {\n      const cleanupTimeout = timeoutRef.current;\n      if (cleanupTimeout !== null) {\n        clearTimeout(cleanupTimeout);\n      }\n    };\n  }, [schema, data, debounceMs]);\n\n  // Derive isValidating from whether data has changed since last validation\n  const isValidating = result.lastValidatedData !== data;\n\n  return {\n    isValid: result.isValid,\n    errors: result.errors,\n    isValidating,\n  };\n}\n\n/**\n * Hook for validating a single value\n *\n * @param schema - Validation schema\n * @param value - Value to validate\n * @returns Validation result\n */\nexport function useValidateValue<T>(\n  schema: Schema<T>,\n  value: T\n): {\n  isValid: boolean;\n  error: string | null;\n} {\n  return useMemo(() => {\n    const result = schema.safeParse(value);\n    return {\n      isValid: result.success,\n      error: result.success ? null : (result.issues[0]?.message ?? 'Invalid value'),\n    };\n  }, [schema, value]);\n}\n\n/**\n * Hook for async validation\n *\n * @param validateFn - Async validation function\n * @param data - Data to validate\n * @param deps - Dependencies to trigger re-validation\n * @returns Validation state\n */\nexport function useAsyncValidation<T>(\n  validateFn: (data: T) => Promise<ValidationResult<T>>,\n  data: T,\n  deps: unknown[] = []\n): {\n  isValid: boolean | null;\n  isValidating: boolean;\n  errors: ValidationIssue[];\n  validate: () => Promise<ValidationResult<T>>;\n} {\n  const [state, setState] = useState<{\n    isValid: boolean | null;\n    isValidating: boolean;\n    errors: ValidationIssue[];\n  }>({\n    isValid: null,\n    isValidating: false,\n    errors: [],\n  });\n\n  const dataRef = useRef(data);\n\n  // Update ref without causing re-renders\n  useEffect(() => {\n    dataRef.current = data;\n  }, [data]);\n\n  const validate = useCallback(async () => {\n    setState((prev) => ({ ...prev, isValidating: true }));\n\n    const result = await validateFn(dataRef.current);\n\n    setState({\n      isValid: result.success,\n      isValidating: false,\n      errors: result.success ? [] : result.issues,\n    });\n\n    return result;\n  }, [validateFn]);\n\n  useEffect(() => {\n    void validate();\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [...deps, validate]);\n\n  return {\n    ...state,\n    validate,\n  };\n}\n"],"names":["useDataValidation","schema","options","initialData","transformBeforeValidation","onValid","onInvalid","state","setState","useState","touchedFields","setTouchedFields","debounceRef","useRef","schemaRef","useEffect","extractFieldErrors","useCallback","issues","fieldErrors","issue","path","validate","data","dataToValidate","result","prev","validateAsync","validateField","field","value","testData","newFieldErrors","fieldIssues","i","clearValidation","reset","getFieldErrors","hasFieldError","touchField","currentDebounce","useValidateOnChange","debounceMs","setResult","timeoutRef","timeout","validationResult","cleanupTimeout","isValidating","useValidateValue","useMemo","useAsyncValidation","validateFn","deps","dataRef"],"mappings":"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"}