@absmartly/javascript-sdk
Version:
A/B Smartly Javascript SDK
124 lines (123 loc) • 2.91 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Evaluator = void 0;
const utils_1 = require("../utils");
class Evaluator {
constructor(operators, vars) {
this.operators = operators;
this.vars = vars;
}
evaluate(expr) {
if (Array.isArray(expr)) {
return this.operators["and"].evaluate(this, expr);
} else if ((0, utils_1.isObject)(expr)) {
for (const [key, value] of Object.entries(expr)) {
const op = this.operators[key];
if (op !== undefined) {
return op.evaluate(this, value);
}
break;
}
}
return null;
}
booleanConvert(x) {
const type = typeof x;
switch (type) {
case "boolean":
return x;
case "number":
return x !== 0;
case "string":
return x !== "false" && x !== "0" && x !== "";
default:
return x !== null && x !== undefined;
}
}
numberConvert(x) {
switch (typeof x) {
case "number":
return x;
case "boolean":
return x ? 1 : 0;
case "string":
{
const y = parseFloat(x);
return Number.isFinite(y) ? y : null;
}
default:
return null;
}
}
stringConvert(x) {
switch (typeof x) {
case "string":
return x;
case "boolean":
return x.toString();
case "number":
return x.toFixed(15).replace(/\.?0{0,15}$/, "");
default:
return null;
}
}
extractVar(path) {
var _a;
const frags = path.split("/");
let target = (_a = this.vars) !== null && _a !== void 0 ? _a : {};
for (let index = 0; index < frags.length; ++index) {
const frag = frags[index];
const value = target[frag];
if (value !== undefined) {
target = value;
continue;
}
return null;
}
return target;
}
compare(lhs, rhs) {
if (lhs === null) {
return rhs === null ? 0 : null;
} else if (rhs === null) {
return null;
}
switch (typeof lhs) {
case "number":
{
const rvalue = this.numberConvert(rhs);
if (rvalue !== null) {
return lhs === rvalue ? 0 : lhs > rvalue ? 1 : -1;
}
break;
}
case "string":
{
const rvalue = this.stringConvert(rhs);
if (rvalue !== null) {
return lhs === rvalue ? 0 : lhs > rvalue ? 1 : -1;
}
break;
}
case "boolean":
{
const rvalue = this.booleanConvert(rhs);
if (rvalue != null) {
return lhs === rvalue ? 0 : lhs > rvalue ? 1 : -1;
}
break;
}
default:
{
if ((0, utils_1.isEqualsDeep)(lhs, rhs)) {
return 0;
}
break;
}
}
return null;
}
}
exports.Evaluator = Evaluator;