UNPKG

react-formal

Version:

Classy HTML form management for React

64 lines (63 loc) 2.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = errorManager; exports.isValidationError = void 0; var _Errors = require("./Errors"); var _errToJSON = _interopRequireDefault(require("./utils/errToJSON")); var _paths = require("./utils/paths"); var _uniqBy = _interopRequireDefault(require("lodash/uniqBy")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function trimChildren(rootPath, errors) { let result = {}; Object.keys(errors).forEach(path => { if (rootPath !== path && (0, _paths.inPath)(rootPath, path)) return; result[path] = errors[path]; }); return result; } function reduce(paths) { paths = (0, _uniqBy.default)(paths, p => p.path); if (paths.length <= 1) return paths; return paths.reduce((innerPaths, current) => { innerPaths = innerPaths.filter(p => !(0, _paths.inPath)(current.path, p.path)); if (!innerPaths.some(p => (0, _paths.inPath)(p.path, current.path))) innerPaths.push(current); return innerPaths; }, []); } let isValidationError = err => err && err.name === 'ValidationError'; exports.isValidationError = isValidationError; function errorManager(handleValidation) { return { async collect(paths, pristineErrors = _Errors.EMPTY_ERRORS, options) { const specs = reduce(paths.map(p => typeof p === 'string' ? { path: p, shallow: false } : p)); let errors = Object.assign({}, pristineErrors); let nextErrors = errors; let workDone = false; specs.forEach(({ path, shallow }) => { nextErrors = (0, _paths.trim)(path, nextErrors, shallow); if (errors !== nextErrors) workDone = true; }); let validations = specs.map(spec => Promise.resolve(handleValidation(spec, options)).then(validationError => { if (!validationError) return true; if (!isValidationError(validationError)) throw validationError; if (!spec.shallow) { (0, _errToJSON.default)(validationError, nextErrors); return; } const fieldErrors = (0, _errToJSON.default)(validationError); Object.assign(nextErrors, trimChildren(spec.path, fieldErrors)); })); const results = await Promise.all(validations); if (!workDone && results.every(Boolean)) return pristineErrors; return nextErrors; } }; }