integreat
Version:
Node.js integration layer
57 lines • 2.09 kB
JavaScript
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