@yobta/validator
Version:
Tree-shakable es6 validator
43 lines (42 loc) • 1.68 kB
JavaScript
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;
});