jexl-functions-fork
Version:
Package with available JEXL functions
225 lines (224 loc) • 9.22 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var jexl_1 = require("@digifi/jexl");
var module_1 = require("../utils/module");
exports.default = (0, module_1.createModule)(function (_a) {
var evalCriteriaParseResult = _a.evalCriteriaParseResult, parseCriteriaExpression = _a.parseCriteriaExpression, validateCriteriaMaxLength = _a.validateCriteriaMaxLength, safeFlatten = _a.safeFlatten, coerceToNumber = _a.coerceToNumber;
var AVERAGE = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var flattenArgs = safeFlatten(args);
var sum = flattenArgs.reduce(function (previousSum, arg) {
return typeof arg === 'number' ? previousSum + coerceToNumber(arg) : previousSum;
}, 0);
return sum / flattenArgs.length;
};
var AVERAGEA = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var flattenArgs = safeFlatten(args);
var _a = flattenArgs.reduce(function (previousResult, arg) {
if (typeof arg === 'number' || arg === true) {
return {
sum: previousResult.sum + Number(arg),
items: previousResult.items + 1,
};
}
if (arg !== null) {
return __assign(__assign({}, previousResult), { items: previousResult.items + 1 });
}
return previousResult;
}, { items: 0, sum: 0 }), sum = _a.sum, items = _a.items;
return sum / items;
};
var AVERAGEIF = function (range, criteria, averageRange) {
var flattenRange = safeFlatten(range);
var flattenAverageRange = averageRange ? safeFlatten(averageRange) : flattenRange;
if (typeof criteria !== 'string') {
throw new jexl_1.ExecutionError('Criteria should be a string.');
}
validateCriteriaMaxLength(criteria);
var parseResult = parseCriteriaExpression(criteria);
var _a = flattenRange.reduce(function (data, valueInRange, index) {
var evaluationResult = evalCriteriaParseResult(parseResult, valueInRange);
return evaluationResult
? { result: data.result + coerceToNumber(flattenAverageRange[index]), count: data.count + 1 }
: data;
}, { count: 0, result: 0 }), count = _a.count, result = _a.result;
return result / count;
};
var COUNTIF = function (range, criteria) {
var flattenRange = safeFlatten(range);
if (typeof criteria !== 'string') {
throw new jexl_1.ExecutionError('Criteria should be a string.');
}
validateCriteriaMaxLength(criteria);
var parseResult = parseCriteriaExpression(criteria);
return flattenRange.reduce(function (previousCount, valueInRange) {
var evaluationResult = evalCriteriaParseResult(parseResult, valueInRange);
return evaluationResult
? previousCount + 1
: previousCount;
}, 0);
};
var MAX = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var flattenArg = safeFlatten(args);
var filteredArgs = flattenArg.filter(function (arg) { return typeof arg === 'number'; });
return Math.max.apply(Math, filteredArgs);
};
var MAXA = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var result = safeFlatten(args).reduce(function (maxValue, arg) {
var coercedValue = coerceToNumber(arg);
var valueForCompare = Number.isNaN(coercedValue) ? 0 : coercedValue;
return valueForCompare > maxValue ? valueForCompare : maxValue;
}, -Infinity);
return result === -Infinity ? 0 : result;
};
var MIN = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var flattenArg = safeFlatten(args);
var filteredArgs = flattenArg.filter(function (arg) { return typeof arg === 'number'; });
return Math.min.apply(Math, filteredArgs);
};
var MINA = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var result = safeFlatten(args).reduce(function (minValue, arg) {
var coercedValue = coerceToNumber(arg);
var valueForCompare = Number.isNaN(coercedValue) ? 0 : coercedValue;
return minValue > valueForCompare ? valueForCompare : minValue;
}, Infinity);
return result === Infinity ? 0 : result;
};
var MODE = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var countsByValues = {};
var currentMostCommonValue;
for (var _a = 0, _b = safeFlatten(args); _a < _b.length; _a++) {
var arg = _b[_a];
var coercedArg = coerceToNumber(arg);
var newCount = countsByValues[coercedArg] + 1;
countsByValues[coercedArg] = newCount;
if (currentMostCommonValue === undefined || countsByValues[currentMostCommonValue] < newCount) {
currentMostCommonValue = coercedArg;
}
}
return currentMostCommonValue;
};
var STANDARDIZE = function (value, mean, sd) {
return (coerceToNumber(value) - coerceToNumber(mean)) / coerceToNumber(sd);
};
var SMALL = function (array, k) {
var numberArray = safeFlatten(array).map(function (item) { return coerceToNumber(item); });
return numberArray.sort(function (firstItem, secondItem) { return firstItem - secondItem; })[coerceToNumber(k) - 1];
};
var LARGE = function (array, k) {
var numberArray = safeFlatten(array).map(function (item) { return coerceToNumber(item); });
return numberArray.sort(function (firstItem, secondItem) { return secondItem - firstItem; })[coerceToNumber(k) - 1];
};
var COUNT = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return safeFlatten(args).filter(function (arg) { return typeof arg === 'number'; }).length;
};
var COUNTA = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return args.length;
};
var COUNTBLANK = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return safeFlatten(args).filter(function (arg) { return arg === null || arg === undefined || arg === ''; }).length;
};
var COUNTUNIQUE = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var visitedElements = {};
var count = 0;
for (var _a = 0, _b = safeFlatten(args); _a < _b.length; _a++) {
var arg = _b[_a];
if ((typeof arg === 'object' && arg !== null) || typeof arg === 'function') {
continue;
}
var identifier = "".concat(typeof arg, "-").concat(arg);
var wasVisited = visitedElements[identifier];
if (!wasVisited) {
count++;
visitedElements[identifier] = true;
}
}
return count;
};
var MEDIAN = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var numberArray = safeFlatten(args).map(function (item) { return coerceToNumber(item); });
var half = Math.floor(numberArray.length / 2);
var sortedArray = numberArray.sort(function (firstArg, secondArg) { return firstArg - secondArg; });
if (sortedArray.length % 2) {
return sortedArray[half];
}
return (sortedArray[half - 1] + sortedArray[half]) / 2.0;
};
return {
AVERAGE: AVERAGE,
AVERAGEA: AVERAGEA,
MAX: MAX,
MAXA: MAXA,
MIN: MIN,
MINA: MINA,
MODE: MODE,
STANDARDIZE: STANDARDIZE,
SMALL: SMALL,
LARGE: LARGE,
COUNT: COUNT,
COUNTA: COUNTA,
COUNTBLANK: COUNTBLANK,
MEDIAN: MEDIAN,
AVERAGEIF: AVERAGEIF,
COUNTIF: COUNTIF,
COUNTUNIQUE: COUNTUNIQUE,
};
});