rule-filter-validator
Version:
A object and scope validator based on structured rules
55 lines • 2.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseFilter = void 0;
/* eslint-disable @typescript-eslint/ban-ts-comment */
const lodash_es_1 = require("lodash-es");
const adjust_date_js_1 = require("./adjust-date.js");
const functions_js_1 = require("./functions.js");
const to_array_js_1 = require("./to-array.js");
const parseFilter = (filter, context = {}) => {
return Object.entries(filter).reduce((result, [key, value]) => {
if (['_or', '_and'].includes(key)) {
// @ts-ignore
result[key] = value.map((filter) => (0, exports.parseFilter)(filter, context));
}
else if (['_in', '_nin', '_between', '_nbetween'].includes(key)) {
// @ts-ignore
result[key] = (0, to_array_js_1.toArray)(value).flatMap(value => parseFilterValue(value, context));
}
else if (key.startsWith('_')) {
// @ts-ignore
result[key] = parseFilterValue(value, context);
}
else {
// @ts-ignore
result[key] = (0, exports.parseFilter)(value, context);
}
return result;
}, {});
};
exports.parseFilter = parseFilter;
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 = (0, adjust_date_js_1.adjustDate)(new Date(), adjustment);
return functionName ? functions_js_1.functions[functionName](date) : date;
}
return new Date();
}
return (0, lodash_es_1.get)(context, value, value);
}
//# sourceMappingURL=parse-filter.js.map