UNPKG

@darlean/fs-persistence-suite

Version:

File System Persistence Suite that uses a physical or shared file system to persist data.

156 lines (155 loc) 6.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Filterer = void 0; const utils_1 = require("@darlean/utils"); class Filterer { constructor() { this.evaluators = new Map(); this.fillEvaluators(); } fillEvaluators() { this.evaluators.set('or', (context, command) => { for (let idx = 1; idx < command.length; idx++) { const value = this.eval(context, command[idx]); if (this.isTruthy(value)) { return value; } } return false; }); this.evaluators.set('and', (context, command) => { for (let idx = 1; idx < command.length; idx++) { const value = this.eval(context, command[idx]); if (this.isFalsy(value)) { return false; } } return true; }); this.evaluators.set('eq', (context, command) => { return this.eval(context, command[1]) === this.eval(context, command[2]); }); this.evaluators.set('neq', (context, command) => { return this.eval(context, command[1]) !== this.eval(context, command[2]); }); this.evaluators.set('lte', (context, command) => { return this.compare(this.eval(context, command[1]), this.eval(context, command[2])) <= 0; }); this.evaluators.set('lt', (context, command) => { return this.compare(this.eval(context, command[1]), this.eval(context, command[2])) < 0; }); this.evaluators.set('gte', (context, command) => { return this.compare(this.eval(context, command[1]), this.eval(context, command[2])) >= 0; }); this.evaluators.set('gt', (context, command) => { return this.compare(this.eval(context, command[1]), this.eval(context, command[2])) > 0; }); this.evaluators.set('literal', (_context, command) => { return command[1]; }); this.evaluators.set('wildcardmatch', (context, command) => { const input = this.toString(this.eval(context, command[1])); const mask = this.toString(this.eval(context, command[2])); return (0, utils_1.wildcardMatch)(input, mask); }); this.evaluators.set('uppercase', (context, command) => { const input = this.toString(this.eval(context, command[1])); return input.toUpperCase(); }); this.evaluators.set('lowercase', (context, command) => { const input = this.toString(this.eval(context, command[1])); return input.toLowerCase(); }); this.evaluators.set('normalize', (context, command) => { const input = this.toString(this.eval(context, command[1])); return (0, utils_1.normalize)(input); }); this.evaluators.set('not', (context, command) => { return this.isFalsy(this.eval(context, command[1])); }); this.evaluators.set('prefix', (context, command) => { return this.toString(this.eval(context, command[1])).startsWith(this.toString(this.eval(context, command[2]))); }); this.evaluators.set('contains', (context, command) => { let n = 0; const base = this.toString(this.eval(context, command[1])); for (let idx = 2; idx < command.length; idx++) { if (base.includes(this.toString(this.eval(context, command[idx])))) { n++; } } return n; }); this.evaluators.set('containsni', (context, command) => { let n = 0; const base = (0, utils_1.normalize)(this.toString(this.eval(context, command[1]))).toLowerCase(); for (let idx = 2; idx < command.length; idx++) { if (base.includes((0, utils_1.normalize)(this.toString(this.eval(context, command[idx]))).toLowerCase())) { n++; } } return n; }); this.evaluators.set('field', (context, command) => { const data = context.data(); const path = this.toCompareString(this.eval(context, command[1])); const value = data[path]; return value; }); this.evaluators.set('sk', (context, command) => { const idx = parseInt(this.eval(context, command[1])); return context.sortKey(idx); }); this.evaluators.set('pk', (context, command) => { const idx = parseInt(this.eval(context, command[1])); return context.partitionKey(idx); }); } process(context, command) { return this.eval(context, command); } isTruthy(value) { return !this.isFalsy(value); } isFalsy(value) { return (value === undefined || value === '' || value === 0 || value === false || (Array.isArray(value) && value.length === 0)); } eval(context, command) { if (Array.isArray(command)) { const handler = this.evaluators.get(command[0]); if (!handler) { throw new Error(`No handler for [${command[0]}]`); } return handler(context, command); } else { return command; } } compare(a, b) { return Buffer.from(this.toCompareString(a), 'utf-8').compare(Buffer.from(this.toCompareString(b))); } toCompareString(value) { switch (typeof value) { case 'boolean': return value ? 'true' : 'false'; case 'number': return (0, utils_1.encodeNumber)(value); case 'string': return value; } return ''; } toString(value) { switch (typeof value) { case 'boolean': return value ? 'true' : 'false'; case 'number': return value.toString(); case 'string': return value; } return ''; } } exports.Filterer = Filterer;