{"version":3,"file":"validate-values.mjs","names":[],"sources":["../../src/validate/validate-values.ts"],"sourcesContent":["import { filterErrors } from '../hooks/use-form-errors/filter-errors/filter-errors';\nimport { getPath } from '../paths';\nimport {\n  FormErrors,\n  FormRule,\n  FormRulesRecord,\n  FormValidateInput,\n  FormValidationResult,\n} from '../types';\n\nexport const formRootRule = Symbol('root-rule');\n\nfunction getValidationResults(errors: FormErrors): FormValidationResult {\n  const filteredErrors = filterErrors(errors);\n  return { hasErrors: Object.keys(filteredErrors).length > 0, errors: filteredErrors };\n}\n\nfunction validateRulesRecord<T>(\n  rules: FormRulesRecord<T> | undefined,\n  values: T,\n  resolveValidationError: (error: unknown) => React.ReactNode,\n  signal: AbortSignal,\n  path = '',\n  errors: FormErrors = {}\n): FormErrors | Promise<FormErrors> {\n  if (typeof rules !== 'object' || rules === null) {\n    return errors;\n  }\n\n  const asyncTasks: Array<{ rulePath: string; promise: Promise<React.ReactNode> }> = [];\n  const pendingRecursions: Array<Promise<FormErrors>> = [];\n\n  for (const ruleKey of Object.keys(rules)) {\n    const rule: FormRule<any, any> = (rules as any)[ruleKey];\n    const rulePath = `${path === '' ? '' : `${path}.`}${ruleKey}`;\n    const value = getPath(rulePath, values);\n    let arrayValidation = false;\n\n    if (typeof rule === 'function') {\n      const result = rule(value, values, rulePath, signal);\n      if (result instanceof Promise) {\n        asyncTasks.push({ rulePath, promise: result });\n      } else {\n        errors[rulePath] = result;\n      }\n    }\n\n    if (typeof rule === 'object' && Array.isArray(value)) {\n      arrayValidation = true;\n      for (let index = 0; index < value.length; index++) {\n        const recursionResult = validateRulesRecord(\n          rule,\n          values,\n          resolveValidationError,\n          signal,\n          `${rulePath}.${index}`,\n          errors\n        );\n        if (recursionResult instanceof Promise) {\n          pendingRecursions.push(recursionResult);\n        }\n      }\n\n      if (formRootRule in rule) {\n        const rootResult = (rule as any)[formRootRule](value, values, rulePath, signal);\n        if (rootResult instanceof Promise) {\n          asyncTasks.push({ rulePath, promise: rootResult });\n        } else {\n          errors[rulePath] = rootResult;\n        }\n      }\n    }\n\n    if (typeof rule === 'object' && typeof value === 'object' && value !== null) {\n      if (!arrayValidation) {\n        const recursionResult = validateRulesRecord(\n          rule,\n          values,\n          resolveValidationError,\n          signal,\n          rulePath,\n          errors\n        );\n        if (recursionResult instanceof Promise) {\n          pendingRecursions.push(recursionResult);\n        }\n      }\n\n      if (formRootRule in rule) {\n        const rootResult = (rule as any)[formRootRule](value, values, rulePath, signal);\n        if (rootResult instanceof Promise) {\n          asyncTasks.push({ rulePath, promise: rootResult });\n        } else {\n          errors[rulePath] = rootResult;\n        }\n      }\n    }\n  }\n\n  if (asyncTasks.length === 0 && pendingRecursions.length === 0) {\n    return errors;\n  }\n\n  return (async () => {\n    await Promise.all(pendingRecursions);\n\n    if (asyncTasks.length > 0) {\n      const settled = await Promise.allSettled(asyncTasks.map((t) => t.promise));\n      settled.forEach((result, index) => {\n        const { rulePath } = asyncTasks[index];\n        if (result.status === 'fulfilled') {\n          errors[rulePath] = result.value;\n        } else {\n          errors[rulePath] = resolveValidationError(result.reason);\n        }\n      });\n    }\n\n    return errors;\n  })();\n}\n\nconst defaultResolveError = (err: unknown): React.ReactNode =>\n  err instanceof Error ? err.message : String(err);\n\nexport function validateValues<T>(\n  validate: FormValidateInput<T> | undefined,\n  values: T,\n  resolveValidationError: (error: unknown) => React.ReactNode = defaultResolveError,\n  signal: AbortSignal = new AbortController().signal\n): FormValidationResult | Promise<FormValidationResult> {\n  if (typeof validate === 'function') {\n    const result = validate(values);\n    if (result instanceof Promise) {\n      return result.then(getValidationResults);\n    }\n    return getValidationResults(result);\n  }\n\n  const errorsResult = validateRulesRecord(validate, values, resolveValidationError, signal);\n  if (errorsResult instanceof Promise) {\n    return errorsResult.then(getValidationResults);\n  }\n  return getValidationResults(errorsResult);\n}\n"],"mappings":"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"}