@factoryfour/jexl
Version:
Factory Four Jexl Implementation
147 lines (146 loc) • 5.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.jexl = exports.evaluateString = exports.evaluateBoolean = void 0;
var jexl_1 = __importDefault(require("jexl"));
exports.jexl = jexl_1.default;
var dateformat_1 = __importDefault(require("dateformat"));
var util_1 = require("./util");
var type_check_1 = require("@factoryfour/type-check");
jexl_1.default.addTransform('date', function (val, format) {
if ((0, util_1.isValidShortIsoDate)(val)) {
return (0, dateformat_1.default)((0, util_1.isoDateToJsDate)(val), format);
}
return (0, dateformat_1.default)(val, format);
});
jexl_1.default.addTransform('longISODate', function (val, format) {
if ((0, util_1.isValidIsoDate)(val)) {
return (0, dateformat_1.default)((0, util_1.isoDateToJsDate)(val), format);
}
return (0, dateformat_1.default)(val, format);
});
jexl_1.default.addTransform('round', function (val) { return Math.round(val); });
jexl_1.default.addTransform('floor', function (val) { return Math.floor(val); });
jexl_1.default.addTransform('ceil', function (val) { return Math.ceil(val); });
jexl_1.default.addTransform('length', function (data) {
if ((0, type_check_1.isArray)(data) || (0, type_check_1.isString)(data)) {
return data.length;
}
if ((0, type_check_1.isObject)(data)) {
return Object.keys(data).length;
}
return 0;
});
jexl_1.default.addTransform('count', function (data, match) {
var dataArray = [data];
if ((0, type_check_1.isArray)(data)) {
dataArray = data;
}
if ((0, type_check_1.isObject)(data)) {
dataArray = Object.keys(data).map(function (key) { return data[key]; });
}
if (match !== undefined) {
dataArray = dataArray.filter(function (item) { return item === match; });
}
return dataArray.length;
});
jexl_1.default.addTransform('join', function (data, separator) {
if (!(0, type_check_1.isArray)(data)) {
return data;
}
return data.join(separator);
});
jexl_1.default.addTransform('removeDuplicates', function (data) {
if (!(0, type_check_1.isArray)(data)) {
return data;
}
return Array.from(new Set(data));
});
jexl_1.default.addTransform('mapToProperty', function (data, prop) {
if ((0, util_1.isObjectArray)(data) && (0, type_check_1.isString)(prop)) {
return data.map(function (item) { return item[prop]; });
}
if ((0, util_1.isArrayArray)(data) && (0, type_check_1.isNumber)(prop)) {
return data.map(function (item) { return item[prop]; });
}
throw new Error("".concat(prop, " is not a valid property name for ").concat(typeof data));
});
jexl_1.default.addTransform('clock', function (data) {
var parsedNumber = NaN;
if ((0, type_check_1.isNumber)(data)) {
parsedNumber = data;
}
if ((0, type_check_1.isString)(data)) {
parsedNumber = parseFloat(data);
}
if (Number.isNaN(parsedNumber)) {
return 'Invalid time';
}
var durationMs = Math.floor(Math.abs(parsedNumber));
if (durationMs === 0) {
return '00:00:00';
}
var sign = parsedNumber < 0 ? '-' : '';
var hours = Math.floor(durationMs / util_1.oneHour).toString();
var minutes = Math.floor((durationMs % util_1.oneHour) / util_1.oneMinute).toString();
var seconds = Math.floor((durationMs % util_1.oneMinute) / util_1.oneSecond).toString();
return "".concat(sign).concat((0, util_1.leftPadZeros)(hours), ":").concat((0, util_1.leftPadZeros)(minutes), ":").concat((0, util_1.leftPadZeros)(seconds));
});
jexl_1.default.addTransform('toFixed', function (data, digits) { return (0, util_1.toNumber)(data).toFixed((0, util_1.toNumber)(digits)); });
jexl_1.default.addTransform('abs', function (data) { return Math.abs((0, util_1.toNumber)(data)); });
jexl_1.default.addTransform('sum', function (data) {
if (!(0, type_check_1.isArray)(data)) {
return data;
}
return data.reduce(function (sum, curr) { return (sum + (0, util_1.toNumber)(curr)); }, 0);
});
var evaluateString = function (templateText, context) {
var out = templateText;
var matches = templateText.match(util_1.templateParser);
if (!matches || !Array.isArray(matches)) {
return out;
}
matches.forEach(function (match) {
var toEvaluate = match.slice(2, -2);
var replacement = 'Unknown Value';
try {
var calc = jexl_1.default.evalSync(toEvaluate, context);
if (calc !== undefined && calc !== null) {
replacement = calc.toString();
}
}
catch (e) {
if (typeof window !== 'undefined' && window.DEBUG_JEXL === true) {
// eslint-disable-next-line no-console
console.error("Unable to Evaluate ".concat(toEvaluate), e);
// eslint-disable-next-line no-console
console.error("Context to ".concat(toEvaluate), context);
}
}
out = out.replace(match, replacement);
});
return out;
};
exports.evaluateString = evaluateString;
var evaluateBoolean = function (toEvaluate, context, def) {
if (def === void 0) { def = false; }
var out = def;
try {
var calc = jexl_1.default.evalSync(toEvaluate, context);
if (calc !== undefined && calc !== null) {
out = !!calc;
}
}
catch (e) {
if (typeof window !== 'undefined' && window.DEBUG_JEXL === true) {
// eslint-disable-next-line no-console
console.error("Unable to Evaluate ".concat(toEvaluate), e);
// eslint-disable-next-line no-console
console.error("Context to ".concat(toEvaluate), context);
}
}
return out;
};
exports.evaluateBoolean = evaluateBoolean;