UNPKG

rule-filter-validator

Version:

A object and scope validator based on structured rules

51 lines 1.89 kB
/* 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