UNPKG

@yobta/validator

Version:
43 lines (42 loc) 1.68 kB
import { rule } from '../rule/rule.js'; const isInputElement = (element) => Boolean('setCustomValidity' in element && 'reportValidity' in element); const updateValidity = (element, message = '') => { element.setCustomValidity(message); element.reportValidity(); }; export const validity = (onUnhandledError, { validateAllFieldsOnChange = false } = {}) => rule((currentData, { errors, event, form, input }) => { const mappedErrors = new Map(); for (const error of errors) { mappedErrors.set(error.field, error); } if (form) { const shouldReport = (event === null || event === void 0 ? void 0 : event.type) === 'submit' || validateAllFieldsOnChange; if (shouldReport) { const reversedElements = [...form.elements] .flat() .filter(isInputElement) .reverse(); for (const element of reversedElements) { if (!element.readOnly && element.type !== 'hidden') { const error = mappedErrors.get(element.name); updateValidity(element, (error === null || error === void 0 ? void 0 : error.message) || ''); mappedErrors.delete(element.name); } } for (const [, error] of mappedErrors) { onUnhandledError(error); } } else if (input && !errors.some(({ field }) => field === input.name)) { updateValidity(input, ''); } } else { for (const [, error] of mappedErrors) { onUnhandledError(error); } } return currentData; });