expression-evaluation
Version:
Expression Evaluation
198 lines (197 loc) • 10.7 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.funcDifference = exports.funcIntersection = exports.funcUnique = exports.funcSplit = exports.funcJoin = exports.funcUpperCase = exports.funcLowerCase = exports.funcTrimEnd = exports.funcTrimStart = exports.funcTrim = exports.funcAlphanum = exports.funcEndsWith = exports.funcStartsWith = exports.funcContains = exports.funcSwitch = exports.funcCoalesce = exports.funcUnlike = exports.funcLike = exports.funcNotEqual = exports.funcEqual = exports.funcLessOrEqual = exports.funcGreaterOrEqual = exports.funcLessThan = exports.funcGreaterThan = void 0;
const FunctionDefinition_js_1 = require("../FunctionDefinition.js");
const Type_js_1 = require("../Type.js");
exports.funcGreaterThan = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => value1 > value2, Type_js_1.typeBoolean, [Type_js_1.typeNumber, Type_js_1.typeNumber]);
exports.funcLessThan = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => value1 < value2, Type_js_1.typeBoolean, [Type_js_1.typeNumber, Type_js_1.typeNumber]);
exports.funcGreaterOrEqual = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => value1 >= value2, Type_js_1.typeBoolean, [Type_js_1.typeNumber, Type_js_1.typeNumber]);
exports.funcLessOrEqual = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => value1 <= value2, Type_js_1.typeBoolean, [Type_js_1.typeNumber, Type_js_1.typeNumber]);
exports.funcEqual = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => equal(value1, value2), Type_js_1.typeBoolean, [Type_js_1.typeUnknown, Type_js_1.typeUnknown]);
exports.funcNotEqual = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => !equal(value1, value2), Type_js_1.typeBoolean, [Type_js_1.typeUnknown, Type_js_1.typeUnknown]);
exports.funcLike = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => equalStrings(value1, value2, true), Type_js_1.typeBoolean, [Type_js_1.typeString, Type_js_1.typeString]);
exports.funcUnlike = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => !equalStrings(value1, value2, true), Type_js_1.typeBoolean, [Type_js_1.typeString, Type_js_1.typeString]);
exports.funcCoalesce = new FunctionDefinition_js_1.FunctionDefinition((value, valueOtherwise) => value ?? valueOtherwise, Type_js_1.typeUnknown, [Type_js_1.typeUnknown, Type_js_1.typeUnknown], 2, 2, 0);
exports.funcSwitch = new FunctionDefinition_js_1.FunctionDefinition((condition, value1, value2) => condition ? value1 : value2, Type_js_1.typeUnknown, [Type_js_1.typeBoolean, Type_js_1.typeUnknown, Type_js_1.typeUnknown], 3, 3, 1);
exports.funcContains = new FunctionDefinition_js_1.FunctionDefinition((value, search, start, ignoreCaseSpaceEtc) => containsString(value, search, start, ignoreCaseSpaceEtc), Type_js_1.typeBoolean, [Type_js_1.typeString, Type_js_1.typeString, Type_js_1.typeOptionalNumber, Type_js_1.typeOptionalBoolean], 2, 4);
exports.funcStartsWith = new FunctionDefinition_js_1.FunctionDefinition((value, search, start, ignoreCaseSpaceEtc) => startsWithString(value, search, start, ignoreCaseSpaceEtc), Type_js_1.typeBoolean, [Type_js_1.typeString, Type_js_1.typeString, Type_js_1.typeOptionalNumber, Type_js_1.typeOptionalBoolean], 2, 4);
exports.funcEndsWith = new FunctionDefinition_js_1.FunctionDefinition((value, search, end, ignoreCaseSpaceEtc) => endsWithString(value, search, end, ignoreCaseSpaceEtc), Type_js_1.typeBoolean, [Type_js_1.typeString, Type_js_1.typeString, Type_js_1.typeOptionalNumber, Type_js_1.typeOptionalBoolean], 2, 4);
exports.funcAlphanum = new FunctionDefinition_js_1.FunctionDefinition((value) => {
const lowerCase = value.toLowerCase();
let result = '';
for (let i = 0; i < lowerCase.length; ++i) {
if (!isCaseSpaceEtc(value[i])) {
result += value[i];
}
}
return result;
}, Type_js_1.typeString, [Type_js_1.typeString]);
exports.funcTrim = new FunctionDefinition_js_1.FunctionDefinition((value) => value.trim(), Type_js_1.typeString, [Type_js_1.typeString]);
exports.funcTrimStart = new FunctionDefinition_js_1.FunctionDefinition((value) => value.trimStart(), Type_js_1.typeString, [Type_js_1.typeString]);
exports.funcTrimEnd = new FunctionDefinition_js_1.FunctionDefinition((value) => value.trimEnd(), Type_js_1.typeString, [Type_js_1.typeString]);
exports.funcLowerCase = new FunctionDefinition_js_1.FunctionDefinition((value) => value.toLowerCase(), Type_js_1.typeString, [Type_js_1.typeString]);
exports.funcUpperCase = new FunctionDefinition_js_1.FunctionDefinition((value) => value.toUpperCase(), Type_js_1.typeString, [Type_js_1.typeString]);
exports.funcJoin = new FunctionDefinition_js_1.FunctionDefinition((value, separator = ' ') => value.join(separator), Type_js_1.typeString, [Type_js_1.typeArray, Type_js_1.typeOptionalString], 1, 2);
exports.funcSplit = new FunctionDefinition_js_1.FunctionDefinition((value, separator = ' ') => value.split(separator), Type_js_1.typeArray, [Type_js_1.typeString, Type_js_1.typeOptionalString], 1, 2);
exports.funcUnique = new FunctionDefinition_js_1.FunctionDefinition((value) => {
const result = [];
value.forEach((i) => {
if (result.every((v) => !equal(v, i))) {
result.push(i);
}
});
return result;
}, Type_js_1.typeArray, [Type_js_1.typeArray]);
exports.funcIntersection = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => value1.filter((i) => value2.some((v) => equal(v, i))), Type_js_1.typeArray, [Type_js_1.typeArray, Type_js_1.typeArray]);
exports.funcDifference = new FunctionDefinition_js_1.FunctionDefinition((value1, value2) => [...value1.filter((i) => value2.every((v) => !equal(v, i))), ...value2.filter((i) => value1.every((v) => !equal(v, i)))], Type_js_1.typeArray, [Type_js_1.typeArray, Type_js_1.typeArray]);
function equal(value1, value2) {
if (value1 == null || value2 == null) {
return value1 == value2;
}
if (typeof value1 === 'boolean' || typeof value1 === 'number' || typeof value1 === 'string' || typeof value1 === 'function') {
return value1 === value2;
}
if (value1 instanceof ArrayBuffer && value2 instanceof ArrayBuffer) {
return equalBuffers(value1, value2);
}
if (Array.isArray(value1) && Array.isArray(value2)) {
if (value1.length === value2.length) {
for (let i = 0; i < value1.length; ++i) {
if (!equal(value1[i], value2[i])) {
return false;
}
}
return true;
}
return false;
}
const props = new Set([...Object.getOwnPropertyNames(value1), ...Object.getOwnPropertyNames(value2)]);
for (const prop of props) {
if (!equal(value1[prop], value2[prop])) {
return false;
}
}
return true;
}
function equalBuffers(value1, value2) {
if (value1.byteLength !== value2.byteLength) {
return false;
}
const dv1 = new DataView(value1);
const dv2 = new DataView(value2);
const length = dv1.byteLength;
for (let lfi = length - 3, i = 0; i < length;) {
if (i < lfi) {
if (dv1.getUint32(i) !== dv2.getUint32(i)) {
return false;
}
i += 4;
}
else {
if (dv1.getUint8(i) !== dv2.getUint8(i)) {
return false;
}
++i;
}
}
return true;
}
;
function isCaseSpaceEtc(c) {
return (c < 'a' || c > 'z') && (c < '0' || c > '9');
}
function equalStrings(value1, value2, ignoreCaseSpaceEtc) {
if (!ignoreCaseSpaceEtc) {
return value1 === value2;
}
const str1 = value1.toLowerCase();
const str2 = value2.toLowerCase();
for (let i1 = 0, i2 = 0; i1 < str1.length && i2 < str2.length; ++i1, ++i2) {
while (isCaseSpaceEtc(str1[i1]) && i1 < str1.length) {
++i1;
}
while (isCaseSpaceEtc(str2[i2]) && i2 < str2.length) {
++i2;
}
if (str1[i1] != str2[i2]) {
return false;
}
}
return true;
}
;
function containsString(value, search, startPos, ignoreCaseSpaceEtc) {
if (!ignoreCaseSpaceEtc) {
return value.includes(search, startPos);
}
const valueStr = value.toLowerCase();
const searchStr = search.toLowerCase();
if (valueStr.length < searchStr.length) {
return false;
}
const pos = startPos == null ? 0 : startPos < 0 ? value.length + startPos : startPos;
for (let i1 = pos, i2 = 0; i1 < valueStr.length && i2 < searchStr.length; ++i1, ++i2) {
while (isCaseSpaceEtc(valueStr[i1]) && i1 < valueStr.length) {
++i1;
}
while (isCaseSpaceEtc(searchStr[i2]) && i2 < searchStr.length) {
++i2;
}
while (valueStr[i1] != searchStr[i2] && i1 < valueStr.length) {
++i1;
}
if (valueStr[i1] != searchStr[i2] && i2 < searchStr.length) {
return false;
}
}
return true;
}
;
function startsWithString(value, search, startPos, ignoreCaseSpaceEtc) {
if (!ignoreCaseSpaceEtc) {
return value.startsWith(search, startPos);
}
const valueStr = value.toLowerCase();
const searchStr = search.toLowerCase();
if (valueStr.length < searchStr.length) {
return false;
}
const pos = startPos == null ? 0 : startPos < 0 ? value.length + startPos : startPos;
for (let i1 = pos, i2 = 0; i1 < valueStr.length && i2 < searchStr.length; ++i1, ++i2) {
while (isCaseSpaceEtc(valueStr[i1]) && i1 < valueStr.length) {
++i1;
}
while (isCaseSpaceEtc(searchStr[i2]) && i2 < searchStr.length) {
++i2;
}
if (valueStr[i1] != searchStr[i2] && i2 < searchStr.length) {
return false;
}
}
return true;
}
;
function endsWithString(value, search, endPos, ignoreCaseSpaceEtc) {
if (!ignoreCaseSpaceEtc) {
return value.endsWith(search, endPos);
}
const valueStr = value.toLowerCase();
const searchStr = search.toLowerCase();
if (valueStr.length < searchStr.length) {
return false;
}
const pos = endPos == null ? valueStr.length : endPos < 0 ? value.length + endPos : endPos;
for (let i1 = pos - 1, i2 = searchStr.length - 1; i1 > -1 && i2 > -1; --i1, --i2) {
while (isCaseSpaceEtc(valueStr[i1]) && i1 > -1) {
--i1;
}
while (isCaseSpaceEtc(searchStr[i2]) && i2 > -1) {
--i2;
}
if (valueStr[i1] != searchStr[i2] && i2 > -1) {
return false;
}
}
return true;
}
;
;