@tidecloak/js
Version:
TideCloak client side JS SDK
92 lines • 4.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
// RuleEngineService.js (ESM)
const jsonHelpers_js_1 = require("./jsonHelpers.js");
const helperFunctions_js_1 = require("./helperFunctions.js");
class RuleEngineService {
constructor() {
// Aggregate evaluators operate on entire arrays.
this.aggregateEvaluators = {
TOTAL_LESS_THAN: helperFunctions_js_1.isTotalLessThan,
TOTAL_MORE_THAN: helperFunctions_js_1.isTotalMoreThan,
};
// Per-element evaluators operate on each individual element.
this.perElementEvaluators = {
LESS_THAN: helperFunctions_js_1.isLessThan,
GREATER_THAN: helperFunctions_js_1.isGreaterThan,
EQUAL_TO: helperFunctions_js_1.isEqualTo,
};
// Filter evaluators remove items from an array based on a condition.
this.filterEvaluators = {
FILTER_OUT_VALUES_NOT_EQUAL_TO: helperFunctions_js_1.filterValuesNotEqualTo,
FILTER_OUT_VALUES_EQUAL_TO: helperFunctions_js_1.filterValuesEqualTo,
};
}
evaluateRules(rules, input) {
let root;
try {
root = JSON.parse(input);
}
catch (error) {
console.error("Invalid JSON input.");
return false;
}
const rulesWithFilter = rules.filter((rule) => rule.conditions.some((c) => c.method in this.filterEvaluators));
const rulesWithoutFilter = rules.filter((rule) => rule.conditions.every((c) => !(c.method in this.filterEvaluators)));
let filteredRoot = root;
if (rulesWithFilter.length > 0) {
filteredRoot = (0, jsonHelpers_js_1.applyFilterConditions)(root, rulesWithFilter, this.filterEvaluators);
}
for (const rule of rulesWithoutFilter) {
const fieldValues = (0, jsonHelpers_js_1.tryGetNestedValues)(filteredRoot, rule.field);
if (!fieldValues) {
console.warn(`Field '${rule.field}' not found in input JSON.`);
return false;
}
if (!this.evaluateRuleConditions(rule, fieldValues)) {
console.warn(`Rule evaluation failed for field '${rule.field}'.`);
return false;
}
}
return true;
}
evaluateRule(rule, input) {
let root;
try {
root = JSON.parse(input);
}
catch (error) {
console.error("Invalid JSON input.");
return false;
}
let modifiedRoot = root;
if (rule.conditions.some((c) => c.method in this.filterEvaluators)) {
modifiedRoot = (0, jsonHelpers_js_1.applyFilterConditions)(root, [rule], this.filterEvaluators);
}
const fieldValues = (0, jsonHelpers_js_1.tryGetNestedValues)(modifiedRoot, rule.field);
if (!fieldValues) {
console.warn(`Field '${rule.field}' not found in input JSON.`);
return false;
}
return this.evaluateRuleConditions(rule, fieldValues);
}
evaluateRuleConditions(rule, fieldValues) {
// Evaluate aggregate conditions
const aggregateConditions = rule.conditions.filter((c) => c.method in this.aggregateEvaluators);
const aggregateResult = aggregateConditions.length === 0 ||
aggregateConditions.every((cond) => {
const evaluator = this.aggregateEvaluators[cond.method];
return evaluator(fieldValues, cond.values[0]);
});
// Evaluate per-element conditions: at least one element must satisfy all
const perElementConditions = rule.conditions.filter((c) => c.method in this.perElementEvaluators);
const perElementResult = perElementConditions.length === 0 ||
fieldValues.some((val) => perElementConditions.every((cond) => {
const evaluator = this.perElementEvaluators[cond.method];
return evaluator(val, cond.values[0]);
}));
return aggregateResult && perElementResult;
}
}
exports.default = RuleEngineService;
//# sourceMappingURL=RuleEngineService.js.map