UNPKG

@absmartly/javascript-sdk

Version:

A/B Smartly Javascript SDK

124 lines (123 loc) 2.91 kB
"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;