rule-filter-validator
Version:
A object and scope validator based on structured rules
51 lines • 1.89 kB
JavaScript
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { get } from 'lodash-es';
import { adjustDate } from './adjust-date.js';
import { functions } from './functions.js';
import { toArray } from './to-array.js';
export const parseFilter = (filter, context = {}) => {
return Object.entries(filter).reduce((result, [key, value]) => {
if (['_or', '_and'].includes(key)) {
// @ts-ignore
result[key] = value.map((filter) => parseFilter(filter, context));
}
else if (['_in', '_nin', '_between', '_nbetween'].includes(key)) {
// @ts-ignore
result[key] = toArray(value).flatMap(value => parseFilterValue(value, context));
}
else if (key.startsWith('_')) {
// @ts-ignore
result[key] = parseFilterValue(value, context);
}
else {
// @ts-ignore
result[key] = parseFilter(value, context);
}
return result;
}, {});
};
function parseFilterValue(value, context) {
if (value === 'true')
return true;
if (value === 'false')
return false;
if (value === 'null' || value === 'NULL')
return null;
if (typeof value === 'string' && value.startsWith('$'))
return parseDynamicVariable(value, context);
return value;
}
function parseDynamicVariable(value, context) {
if (value.startsWith('$NOW')) {
if (value.includes('(') && value.includes(')')) {
const [matched, adjustment, functionName] = value.match(/\(([^)]+)\)(?:\.(\w+))?/);
if (!adjustment)
return new Date();
let date = adjustDate(new Date(), adjustment);
return functionName ? functions[functionName](date) : date;
}
return new Date();
}
return get(context, value, value);
}
//# sourceMappingURL=parse-filter.js.map