UNPKG

expression-evaluation

Version:
198 lines (197 loc) 10.7 kB
"use strict"; 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; } ;