UNPKG

@mantine/form

Version:

Mantine form management library

85 lines (84 loc) 3.5 kB
"use client"; import { filterErrors } from "../hooks/use-form-errors/filter-errors/filter-errors.mjs"; import { getPath } from "../paths/get-path.mjs"; //#region packages/@mantine/form/src/validate/validate-values.ts const formRootRule = Symbol("root-rule"); function getValidationResults(errors) { const filteredErrors = filterErrors(errors); return { hasErrors: Object.keys(filteredErrors).length > 0, errors: filteredErrors }; } function validateRulesRecord(rules, values, resolveValidationError, signal, path = "", errors = {}) { if (typeof rules !== "object" || rules === null) return errors; const asyncTasks = []; const pendingRecursions = []; for (const ruleKey of Object.keys(rules)) { const rule = rules[ruleKey]; const rulePath = `${path === "" ? "" : `${path}.`}${ruleKey}`; const value = getPath(rulePath, values); let arrayValidation = false; if (typeof rule === "function") { const result = rule(value, values, rulePath, signal); if (result instanceof Promise) asyncTasks.push({ rulePath, promise: result }); else errors[rulePath] = result; } if (typeof rule === "object" && Array.isArray(value)) { arrayValidation = true; for (let index = 0; index < value.length; index++) { const recursionResult = validateRulesRecord(rule, values, resolveValidationError, signal, `${rulePath}.${index}`, errors); if (recursionResult instanceof Promise) pendingRecursions.push(recursionResult); } if (formRootRule in rule) { const rootResult = rule[formRootRule](value, values, rulePath, signal); if (rootResult instanceof Promise) asyncTasks.push({ rulePath, promise: rootResult }); else errors[rulePath] = rootResult; } } if (typeof rule === "object" && typeof value === "object" && value !== null) { if (!arrayValidation) { const recursionResult = validateRulesRecord(rule, values, resolveValidationError, signal, rulePath, errors); if (recursionResult instanceof Promise) pendingRecursions.push(recursionResult); } if (formRootRule in rule) { const rootResult = rule[formRootRule](value, values, rulePath, signal); if (rootResult instanceof Promise) asyncTasks.push({ rulePath, promise: rootResult }); else errors[rulePath] = rootResult; } } } if (asyncTasks.length === 0 && pendingRecursions.length === 0) return errors; return (async () => { await Promise.all(pendingRecursions); if (asyncTasks.length > 0) (await Promise.allSettled(asyncTasks.map((t) => t.promise))).forEach((result, index) => { const { rulePath } = asyncTasks[index]; if (result.status === "fulfilled") errors[rulePath] = result.value; else errors[rulePath] = resolveValidationError(result.reason); }); return errors; })(); } const defaultResolveError = (err) => err instanceof Error ? err.message : String(err); function validateValues(validate, values, resolveValidationError = defaultResolveError, signal = new AbortController().signal) { if (typeof validate === "function") { const result = validate(values); if (result instanceof Promise) return result.then(getValidationResults); return getValidationResults(result); } const errorsResult = validateRulesRecord(validate, values, resolveValidationError, signal); if (errorsResult instanceof Promise) return errorsResult.then(getValidationResults); return getValidationResults(errorsResult); } //#endregion export { formRootRule, validateValues }; //# sourceMappingURL=validate-values.mjs.map