@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
JavaScript
"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;