UNPKG

integreat

Version:
57 lines 2.09 kB
import util from 'util'; import ajv from 'ajv'; import { pathGetter } from 'map-transform'; import { isObject } from './is.js'; const Ajv = ajv.default; const validator = new Ajv(); const state = { context: [], value: undefined }; const cleanCondition = ({ onFail, ...filter }) => filter; const cleanFilter = (filter) => isObject(filter) ? cleanCondition(filter) : filter; function prepareFilter(path, filter) { if (path === '$or') { if (isObject(filter)) { return validateFilters({ $or: true, ...filter }); } } else if (filter) { const val = validator.compile(cleanFilter(filter)); const getFromPath = pathGetter(path); return (data) => val(getFromPath(data, state)); } return undefined; } const stringifyFilter = ({ onFail, ...filter }) => util.inspect(filter); function prepareMessage(path, filter, useFriendlyMessages) { if (!useFriendlyMessages) { return () => path; } const onFail = isObject(filter) ? typeof filter.onFail === 'string' ? { message: filter.onFail } : filter.onFail : undefined; return () => ({ ...onFail, status: onFail?.status || (onFail ? 'error' : 'noaction'), message: onFail?.message || `'${path}' did not pass ${isObject(filter) ? stringifyFilter(filter) : 'its condition'}`, }); } export default function validateFilters(filters, useFriendlyMessages = false) { const filterFns = Object.entries(filters) .map(([path, filter]) => [ prepareFilter(path, filter), prepareMessage(path, filter, useFriendlyMessages), ]) .filter(([filter]) => !!filter); const isOrFilters = filters.$or === true; return function validate(data) { const failObjects = filterFns .map(([filter, getMessage]) => (filter(data) ? undefined : getMessage())) .filter(Boolean); return isOrFilters && failObjects.length < filterFns.length ? [] : failObjects; }; } //# sourceMappingURL=validateFilters.js.map