UNPKG

@react-awesome-query-builder/core

Version:
841 lines (827 loc) 34.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.convertToTree = exports.convertCaseValueConcat = exports.convertCaseValue = exports.convertArg = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _builder = require("./builder"); var _postprocess = require("./postprocess"); var _conv = require("./conv"); var Utils = _interopRequireWildcard(require("../../utils")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var _Utils$OtherUtils = Utils.OtherUtils, isJsonCompatible = _Utils$OtherUtils.isJsonCompatible, isObject = _Utils$OtherUtils.isObject, uuid = _Utils$OtherUtils.uuid, logger = _Utils$OtherUtils.logger; var _Utils$ConfigUtils = Utils.ConfigUtils, getFieldConfig = _Utils$ConfigUtils.getFieldConfig, getFuncConfig = _Utils$ConfigUtils.getFuncConfig, normalizeField = _Utils$ConfigUtils.normalizeField, iterateFuncs = _Utils$ConfigUtils.iterateFuncs, getWidgetForFieldOp = _Utils$ConfigUtils.getWidgetForFieldOp; // spel type => raqb type var SpelPrimitiveTypes = { number: "number", string: "text", "boolean": "boolean", "null": "null" // should not be }; // spel class => raqb type var SpelPrimitiveClasses = { String: "text" }; var ListValueType = "multiselect"; var _convertToTree = exports.convertToTree = function convertToTree(spel, conv, config, meta) { var _spel$_groupField; var parentSpel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; if (!spel) return undefined; spel._groupField = (_spel$_groupField = spel._groupField) !== null && _spel$_groupField !== void 0 ? _spel$_groupField : parentSpel === null || parentSpel === void 0 ? void 0 : parentSpel._groupField; var res, canParseAsArg = true; if (spel.type.indexOf("op-") === 0 || spel.type === "matches") { res = _convertOp(spel, conv, config, meta, parentSpel); } else if (spel.type == "!aggr") { var _groupFilter; var groupFieldValue = _convertToTree(spel.source, conv, config, meta, spel); spel._groupField = groupFieldValue === null || groupFieldValue === void 0 ? void 0 : groupFieldValue.value; var groupFilter = _convertToTree(spel.filter, conv, config, meta, spel); if (((_groupFilter = groupFilter) === null || _groupFilter === void 0 ? void 0 : _groupFilter.type) == "rule") { groupFilter = (0, _builder.wrapInDefaultConj)(groupFilter, config, spel.filter.not); } res = { groupFilter: groupFilter, groupFieldValue: groupFieldValue }; if (!parentSpel) { // !aggr can't be in root, it should be compared with something res = undefined; meta.errors.push("Unexpected !aggr in root"); canParseAsArg = false; } } else if (spel.type == "ternary") { var children1 = {}; spel.val.forEach(function (v) { var _v = (0, _slicedToArray2["default"])(v, 2), cond = _v[0], val = _v[1]; var convCond = _convertToTree(cond, conv, config, meta, spel); var convVal = convertCaseValue(val, conv, config, meta, spel); var caseI = (0, _builder.buildCase)(convCond, convVal, conv, config, meta, spel); if (caseI) { children1[caseI.id] = caseI; } }); res = { type: "switch_group", id: uuid(), children1: children1, properties: {} }; } if (!res && canParseAsArg) { res = _convertArg(spel, conv, config, meta, parentSpel); } if (res && !res.type && !parentSpel) { // res is not a rule, it's value at root // try to parse whole `"1"` as ternary var convVal = convertCaseValue(spel, conv, config, meta); var sw = (0, _builder.buildSimpleSwitch)(convVal, conv, config, meta); if (sw) { res = sw; } else { res = undefined; meta.errors.push("Can't convert rule of type ".concat(spel.type, ", it looks like var/literal")); } } return res; }; var _convertOp = function convertOp(spel, conv, config, meta) { var parentSpel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; var res; var op = spel.type.startsWith("op-") ? spel.type.slice("op-".length) : spel.type; // unary var isUnary = (op == "minus" || op == "plus") && spel.children.length == 1; if (isUnary) { var negative = spel.negative; if (op == "minus") { negative = !negative; } spel.children[0].negative = negative; return _convertToTree(spel.children[0], conv, config, meta, parentSpel); } // between var isBetweenNormal = op == "and" && spel.children.length == 2 && spel.children[0].type == "op-ge" && spel.children[1].type == "op-le"; var isBetweenRev = op == "or" && spel.children.length == 2 && spel.children[0].type == "op-lt" && spel.children[1].type == "op-gt"; var isBetween = isBetweenNormal || isBetweenRev; if (isBetween) { var _spel$children$0$chil = (0, _slicedToArray2["default"])(spel.children[0].children, 2), left = _spel$children$0$chil[0], from = _spel$children$0$chil[1]; var _spel$children$1$chil = (0, _slicedToArray2["default"])(spel.children[1].children, 2), right = _spel$children$1$chil[0], to = _spel$children$1$chil[1]; var isSameSource = compareArgs(left, right, spel, conv, config, meta, parentSpel); if (isSameSource) { var _fromValue = from.val; var _toValue = to.val; var oneSpel = { type: "op-between", children: [left, from, to], not: isBetweenRev }; oneSpel._groupField = parentSpel === null || parentSpel === void 0 ? void 0 : parentSpel._groupField; return _convertOp(oneSpel, conv, config, meta, parentSpel); } } // find op var opKeys = conv.operators[op]; if (op == "eq" && spel.children[1].type == "null") { opKeys = ["is_null"]; } else if (op == "ne" && spel.children[1].type == "null") { opKeys = ["is_not_null"]; } else if (op == "le" && spel.children[1].type == "string" && spel.children[1].val == "") { opKeys = ["is_empty"]; } else if (op == "gt" && spel.children[1].type == "string" && spel.children[1].val == "") { opKeys = ["is_not_empty"]; } else if (op == "between") { opKeys = ["between"]; } // convert children var convertChildren = function convertChildren() { var _newChildren; var newChildren = spel.children.map(function (child) { return _convertToTree(child, conv, config, meta, spel); }); if (newChildren.length >= 2 && ((_newChildren = newChildren) === null || _newChildren === void 0 || (_newChildren = _newChildren[0]) === null || _newChildren === void 0 ? void 0 : _newChildren.type) == "!compare") { newChildren = newChildren[0].children; } return newChildren; }; if (op == "and" || op == "or") { var children1 = {}; var vals = convertChildren(); vals.forEach(function (v) { if (v) { var id = uuid(); v.id = id; if (v.type != undefined) { children1[id] = v; } else { meta.errors.push("Bad item in AND/OR: ".concat(JSON.stringify(v))); } } }); res = { type: "group", id: uuid(), children1: children1, properties: { conjunction: conv.conjunctions[op], not: spel.not } }; } else if (opKeys) { var _fieldObj$groupFieldV, _convertedArgs, _opConfig; var _vals = convertChildren(); var fieldObj = _vals[0]; var convertedArgs = _vals.slice(1); var groupField = fieldObj === null || fieldObj === void 0 || (_fieldObj$groupFieldV = fieldObj.groupFieldValue) === null || _fieldObj$groupFieldV === void 0 ? void 0 : _fieldObj$groupFieldV.value; var opArg = (_convertedArgs = convertedArgs) === null || _convertedArgs === void 0 ? void 0 : _convertedArgs[0]; var opKey = opKeys[0]; if (opKeys.length > 1) { var _vals$, _vals$2; var valueType = ((_vals$ = _vals[0]) === null || _vals$ === void 0 ? void 0 : _vals$.valueType) || ((_vals$2 = _vals[1]) === null || _vals$2 === void 0 ? void 0 : _vals$2.valueType); //todo: it's naive, use valueType var field = fieldObj === null || fieldObj === void 0 ? void 0 : fieldObj.value; var widgets = opKeys.map(function (op) { return { op: op, widget: getWidgetForFieldOp(config, field, op) }; }); if (op == "eq" || op == "ne") { var ws = widgets.find(function (_ref) { var op = _ref.op, widget = _ref.widget; return widget && widget != "field"; }); if (ws) { opKey = ws.op; } } else { logger.warn("[spel] Spel operator ".concat(op, " can be mapped to ").concat(opKeys, "."), "widgets:", widgets, "vals:", _vals, "valueType=", valueType); } } // some/all/none if (fieldObj !== null && fieldObj !== void 0 && fieldObj.groupFieldValue) { if (opArg && opArg.groupFieldValue && opArg.groupFieldValue.valueSrc == "field" && opArg.groupFieldValue.value == groupField) { // group.?[...].size() == group.size() opKey = "all"; convertedArgs = []; } else if (opKey == "equal" && opArg.valueSrc == "value" && opArg.valueType == "number" && opArg.value == 0) { opKey = "none"; convertedArgs = []; } else if (opKey == "greater" && opArg.valueSrc == "value" && opArg.valueType == "number" && opArg.value == 0) { opKey = "some"; convertedArgs = []; } } var opConfig = config.operators[opKey]; var reversedOpConfig = config.operators[(_opConfig = opConfig) === null || _opConfig === void 0 ? void 0 : _opConfig.reversedOp]; var opNeedsReverse = spel.not && ["between"].includes(opKey); var opCanReverse = !!reversedOpConfig; var canRev = opCanReverse && (!!config.settings.reverseOperatorsForNot || opNeedsReverse); var needRev = spel.not && canRev || opNeedsReverse; if (needRev) { opKey = opConfig.reversedOp; opConfig = config.operators[opKey]; spel.not = !spel.not; } var needWrapWithNot = !!spel.not; spel.not = false; // handled with needWrapWithNot if (!fieldObj) { // LHS can't be parsed } else if (fieldObj.groupFieldValue) { // 1. group if (fieldObj.groupFieldValue.valueSrc != "field") { meta.errors.push("Expected group field ".concat(JSON.stringify(fieldObj))); } res = (0, _builder.buildRuleGroup)(fieldObj, opKey, convertedArgs, config, meta); } else { // 2. not group if (fieldObj.valueSrc != "field" && fieldObj.valueSrc != "func") { meta.errors.push("Expected field/func at LHS, but got ".concat(JSON.stringify(fieldObj))); } var _field = fieldObj.value; res = (0, _builder.buildRule)(config, meta, _field, opKey, convertedArgs, spel); } if (needWrapWithNot) { if (res.type !== "group") { res = (0, _builder.wrapInDefaultConj)(res, config, true); } else { res.properties.not = !res.properties.not; } } } else { if (!parentSpel) { // try to parse whole `"str" + prop + #var` as ternary var convVal = convertCaseValue(spel, conv, config, meta); res = (0, _builder.buildSimpleSwitch)(convVal, conv, config, meta); } // if (!res) { // meta.errors.push(`Can't convert op ${op}`); // } } return res; }; var _convertArg = exports.convertArg = function convertArg(spel, conv, config, meta) { var _spel$_groupField2, _config$settings$case; var parentSpel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; if (spel == undefined) return undefined; var fieldSeparator = config.settings.fieldSeparator; spel._groupField = (_spel$_groupField2 = spel._groupField) !== null && _spel$_groupField2 !== void 0 ? _spel$_groupField2 : parentSpel === null || parentSpel === void 0 ? void 0 : parentSpel._groupField; if (spel.type == "variable" || spel.type == "property") { // normal field var field = normalizeField(config, spel.val, spel._groupField); var fieldConfig = getFieldConfig(config, field); var isVariable = spel.type == "variable"; return { valueSrc: "field", valueType: fieldConfig === null || fieldConfig === void 0 ? void 0 : fieldConfig.type, isVariable: isVariable, value: field }; } else if (spel.type == "compound") { // complex field var parts = (0, _postprocess.convertPath)(spel.children, meta); if (parts) { var _spel$children; var _field2 = normalizeField(config, parts.join(fieldSeparator), spel._groupField); var _fieldConfig = getFieldConfig(config, _field2); var _isVariable = ((_spel$children = spel.children) === null || _spel$children === void 0 || (_spel$children = _spel$children[0]) === null || _spel$children === void 0 ? void 0 : _spel$children.type) == "variable"; return { valueSrc: "field", valueType: _fieldConfig === null || _fieldConfig === void 0 ? void 0 : _fieldConfig.type, isVariable: _isVariable, value: _field2 }; } else { // it's not complex field } } else if (SpelPrimitiveTypes[spel.type]) { var value = spel.val; var valueType = SpelPrimitiveTypes[spel.type]; if (spel.negative) { value = -value; } return { valueSrc: "value", valueType: valueType, value: value }; } else if (spel.type == "!new" && SpelPrimitiveClasses[spel.cls.at(-1)]) { var args = spel.args.map(function (v) { return _convertArg(v, conv, config, meta, spel); }); var _value = args === null || args === void 0 ? void 0 : args[0]; var _valueType = SpelPrimitiveClasses[spel.cls.at(-1)]; return _objectSpread(_objectSpread({}, _value), {}, { valueType: _valueType }); } else if (spel.type == "list") { var _values$; var values = spel.val.map(function (v) { return _convertArg(v, conv, config, meta, spel); }); var _itemType = values.length ? (_values$ = values[0]) === null || _values$ === void 0 ? void 0 : _values$.valueType : null; var _value2 = values.map(function (v) { return v === null || v === void 0 ? void 0 : v.value; }); var _valueType2 = ListValueType; return { valueSrc: "value", valueType: _valueType2, value: _value2 }; } else if (spel.type === "op-plus" && (parentSpel === null || parentSpel === void 0 ? void 0 : parentSpel.type) === "ternary" && ((_config$settings$case = config.settings.caseValueField) === null || _config$settings$case === void 0 ? void 0 : _config$settings$case.type) === "case_value") { /** * @deprecated */ return convertCaseValueConcat(spel, conv, config, meta); } var maybe = convertFunc(spel, conv, config, meta, parentSpel); if (maybe !== undefined) { return maybe; } meta.errors.push("Can't convert arg of type ".concat(spel.type)); return undefined; }; var convertFunc = function convertFunc(spel, conv, config, meta) { var _fsigns$; var parentSpel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; // Build signatures var convertFuncArg = function convertFuncArg(v) { return _convertToTree(v, conv, config, meta, spel); }; var fsigns = (0, _conv.buildFuncSignatures)(spel); var firstSign = fsigns === null || fsigns === void 0 || (_fsigns$ = fsigns[0]) === null || _fsigns$ === void 0 ? void 0 : _fsigns$.s; if (fsigns.length) logger.debug("Signatures for ", spel, ":", firstSign, fsigns); // 1. Try to parse as value var maybeValue = convertFuncToValue(spel, conv, config, meta, parentSpel, fsigns, convertFuncArg); if (maybeValue !== undefined) return maybeValue; // 2. Try to parse as op var maybeOp = convertFuncToOp(spel, conv, config, meta, parentSpel, fsigns, convertFuncArg); if (maybeOp !== undefined) return maybeOp; // 3. Try to parse as func var funcKey, funcConfig, argsObj; // try func signature matching var _iterator = _createForOfIteratorHelper(fsigns), _step; try { var _loop = function _loop() { var _step$value = _step.value, s = _step$value.s, params = _step$value.params; var funcKeys = conv.funcs[s]; if (funcKeys) { // todo: here we can check arg types, if we have function overloading funcKey = funcKeys[0]; funcConfig = getFuncConfig(config, funcKey); var _funcConfig2 = funcConfig, spelFunc = _funcConfig2.spelFunc; var argsArr = params.map(convertFuncArg); var argsOrder = (0, _toConsumableArray2["default"])(spelFunc.matchAll(/\${(\w+)}/g)).map(function (_ref2) { var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2), _ = _ref3[0], k = _ref3[1]; return k; }); argsObj = Object.fromEntries(argsOrder.map(function (argKey, i) { return [argKey, argsArr[i]]; })); return 1; // break } }; for (_iterator.s(); !(_step = _iterator.n()).done;) { if (_loop()) break; } // try `spelImport` } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (!funcKey) { var _iterator2 = _createForOfIteratorHelper(iterateFuncs(config)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2), f = _step2$value[0], fc = _step2$value[1]; if (fc.spelImport) { var parsed = void 0; try { parsed = fc.spelImport.call(config.ctx, spel); } catch (e) { logger.debug("Error while using spelImport for ".concat(f), e); // can't be parsed } if (parsed) { var _funcConfig; funcKey = f; funcConfig = getFuncConfig(config, funcKey); argsObj = {}; for (var argKey in parsed) { argsObj[argKey] = convertFuncArg(parsed[argKey]); } // Special case to distinct date and datetime var isOk = true; var funcType = (_funcConfig = funcConfig) === null || _funcConfig === void 0 ? void 0 : _funcConfig.returnType; if (["date", "datetime"].includes(funcType)) { var _funcConfig$args; var dateArgsKeys = Object.keys((_funcConfig$args = funcConfig.args) !== null && _funcConfig$args !== void 0 ? _funcConfig$args : []).filter(function (k) { return ["date", "datetime"].includes(funcConfig.args[k].type); }); var _iterator3 = _createForOfIteratorHelper(dateArgsKeys), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _argsObj$k; var k = _step3.value; var argConfig = funcConfig.args[k]; var expectedType = argConfig.type; var realType = (_argsObj$k = argsObj[k]) === null || _argsObj$k === void 0 ? void 0 : _argsObj$k.valueType; if (realType && realType != expectedType) { isOk = false; } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } } if (isOk) { break; } } } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } // final convert if (funcKey) { var funcArgs = {}; for (var _argKey in funcConfig.args) { var _argConfig = funcConfig.args[_argKey]; var argVal = argsObj[_argKey]; if (argVal === undefined) { argVal = _argConfig === null || _argConfig === void 0 ? void 0 : _argConfig.defaultValue; if (argVal === undefined) { if (_argConfig !== null && _argConfig !== void 0 && _argConfig.isOptional) { //ignore } else { meta.errors.push("No value for arg ".concat(_argKey, " of func ").concat(funcKey)); return undefined; } } else { var _argVal; argVal = { value: argVal, valueSrc: (_argVal = argVal) !== null && _argVal !== void 0 && _argVal.func ? "func" : "value", valueType: _argConfig.type }; } } if (argVal) funcArgs[_argKey] = argVal; } return { valueSrc: "func", value: { func: funcKey, args: funcArgs }, valueType: funcConfig.returnType }; } var methodName = spel.methodName; if (methodName) { meta.errors.push("Signature ".concat(firstSign, " - failed to convert")); } return undefined; }; var convertFuncToValue = function convertFuncToValue(spel, conv, config, meta, parentSpel, fsigns, convertFuncArg) { var errs, foundSign, foundWidget; var candidates = []; for (var w in config.widgets) { var widgetDef = config.widgets[w]; var spelImportFuncs = widgetDef.spelImportFuncs; if (spelImportFuncs) { for (var i = 0; i < spelImportFuncs.length; i++) { var fj = spelImportFuncs[i]; if (isObject(fj)) { var bag = {}; if (isJsonCompatible(fj, spel, bag)) { for (var k in bag) { bag[k] = convertFuncArg(bag[k]); } candidates.push({ s: "widgets.".concat(w, ".spelImportFuncs[").concat(i, "]"), w: w, argsObj: bag }); } } } } } var _iterator4 = _createForOfIteratorHelper(fsigns), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _step4$value = _step4.value, _s = _step4$value.s, params = _step4$value.params; var found = conv.valueFuncs[_s] || []; var _iterator5 = _createForOfIteratorHelper(found), _step5; try { var _loop2 = function _loop2() { var _step5$value = _step5.value, w = _step5$value.w, argsOrder = _step5$value.argsOrder; var argsArr = params.map(convertFuncArg); var argsObj = Object.fromEntries(argsOrder.map(function (argKey, i) { return [argKey, argsArr[i]]; })); candidates.push({ s: _s, w: w, argsObj: argsObj }); }; for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { _loop2(); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } for (var _i = 0, _candidates = candidates; _i < _candidates.length; _i++) { var _candidates$_i = _candidates[_i], s = _candidates$_i.s, _w = _candidates$_i.w, argsObj = _candidates$_i.argsObj; var _widgetDef = config.widgets[_w]; var spelImportValue = _widgetDef.spelImportValue, type = _widgetDef.type; foundWidget = _w; foundSign = s; errs = []; for (var _k in argsObj) { if (!["value"].includes(argsObj[_k].valueSrc)) { errs.push("".concat(_k, " has unsupported value src ").concat(argsObj[_k].valueSrc)); } } var value = argsObj.v.value; if (spelImportValue && !errs.length) { var _spelImportValue$call = spelImportValue.call(config.ctx, argsObj.v, _widgetDef, argsObj); var _spelImportValue$call2 = (0, _slicedToArray2["default"])(_spelImportValue$call, 2); value = _spelImportValue$call2[0]; errs = _spelImportValue$call2[1]; if (errs && !Array.isArray(errs)) errs = [errs]; } if (!errs.length) { return { valueSrc: "value", valueType: type, value: value }; } } if (foundWidget && errs.length) { meta.errors.push("Signature ".concat(foundSign, " - looks like convertable to ").concat(foundWidget, ", but: ").concat(errs.join("; "))); } return undefined; }; var convertFuncToOp = function convertFuncToOp(spel, conv, config, meta, parentSpel, fsigns, convertFuncArg) { var candidates = []; var _iterator6 = _createForOfIteratorHelper(fsigns), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var _step6$value = _step6.value, s = _step6$value.s, params = _step6$value.params; var found = conv.opFuncs[s] || []; var _iterator7 = _createForOfIteratorHelper(found), _step7; try { var _loop4 = function _loop4() { var _argsArr$filter; var _step7$value = _step7.value, op = _step7$value.op, argsOrder = _step7$value.argsOrder; var argsArr = params.map(convertFuncArg); var errs = []; if (op === "!compare") { if (parentSpel.type.startsWith("op-") && parentSpel.children.length == 2 && parentSpel.children[1].type == "number" && parentSpel.children[1].val === 0) { return { v: { type: "!compare", children: argsArr } }; } else { errs.push("Result of compareTo() should be compared to 0"); } } var opDef = config.operators[op]; var valueTypes = opDef.valueTypes; var argsObj = Object.fromEntries(argsOrder.map(function (argKey, i) { return [argKey, argsArr[i]]; })); var field = argsObj["0"]; var convertedArgs = Object.keys(argsObj).filter(function (k) { return parseInt(k) > 0; }).map(function (k) { return argsObj[k]; }); var valueType = (_argsArr$filter = argsArr.filter(function (a) { return !!a && a !== field; })) === null || _argsArr$filter === void 0 || (_argsArr$filter = _argsArr$filter[0]) === null || _argsArr$filter === void 0 ? void 0 : _argsArr$filter.valueType; if (valueTypes && valueType && !valueTypes.includes(valueType)) { errs.push("Op supports types ".concat(valueTypes, ", but got ").concat(valueType)); } candidates.push({ opKey: op, foundSign: s, field: field, convertedArgs: convertedArgs, errs: errs }); }, _ret; for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { _ret = _loop4(); if (_ret) return _ret.v; } } catch (err) { _iterator7.e(err); } finally { _iterator7.f(); } } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } for (var op in config.operators) { var opDef = config.operators[op]; var spelImportFuncs = opDef.spelImportFuncs, valueTypes = opDef.valueTypes; if (spelImportFuncs) { var _loop3 = function _loop3() { var fj = spelImportFuncs[i]; if (isObject(fj)) { var argsObj = {}; if (isJsonCompatible(fj, spel, argsObj)) { var _argsObj$; var errs = []; for (var k in argsObj) { argsObj[k] = convertFuncArg(argsObj[k]); } var field = argsObj["0"]; var convertedArgs = Object.keys(argsObj).filter(function (k) { return parseInt(k) > 0; }).map(function (k) { return argsObj[k]; }); var valueType = (_argsObj$ = argsObj["1"]) === null || _argsObj$ === void 0 ? void 0 : _argsObj$.valueType; if (valueTypes && valueType && !valueTypes.includes(valueType)) { errs.push("Op supports types ".concat(valueTypes, ", but got ").concat(valueType)); } candidates.push({ opKey: op, foundSign: "spelImportFuncs[".concat(i, "]"), field: field, convertedArgs: convertedArgs, errs: errs }); } } }; for (var i = 0; i < spelImportFuncs.length; i++) { _loop3(); } } } var bestCandidate = candidates.find(function (_ref4) { var errs = _ref4.errs; return !errs.length; }); if (bestCandidate) { var opKey = bestCandidate.opKey, foundSign = bestCandidate.foundSign, field = bestCandidate.field, convertedArgs = bestCandidate.convertedArgs, errs = bestCandidate.errs; return (0, _builder.buildRule)(config, meta, field, opKey, convertedArgs, spel); } else if (candidates.length) { var allErrs = candidates.map(function (_ref5) { var foundSign = _ref5.foundSign, opKey = _ref5.opKey, errs = _ref5.errs; return "Looks like convertable to ".concat(opKey, " with signature ").concat(foundSign, ", but: ").concat(errs.join("; ")); }).join(". "); meta.errors.push(allErrs); } return undefined; }; var compareArgs = function compareArgs(left, right, spel, conv, config, meta) { if (left.type == right.type) { if (left.type == "!aggr") { var _map = [left.source, right.source].map(function (v) { return _convertArg(v, conv, config, meta, spel); }), _map2 = (0, _slicedToArray2["default"])(_map, 2), leftSource = _map2[0], rightSource = _map2[1]; //todo: check same filter return leftSource.value == rightSource.value; } else { var _map3 = [left, right].map(function (v) { return _convertArg(v, conv, config, meta, spel); }), _map4 = (0, _slicedToArray2["default"])(_map3, 2), leftVal = _map4[0], rightVal = _map4[1]; return leftVal.value == rightVal.value; } } return false; }; var convertCaseValue = exports.convertCaseValue = function convertCaseValue(val, conv, config, meta) { var _config$settings$case2; var spel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; var convVal; if ((val === null || val === void 0 ? void 0 : val.type) === "op-plus" && ((_config$settings$case2 = config.settings.caseValueField) === null || _config$settings$case2 === void 0 ? void 0 : _config$settings$case2.type) === "case_value") { /** * @deprecated */ convVal = convertCaseValueConcat(val, conv, config, meta); } else { convVal = _convertArg(val, conv, config, meta, spel); } return convVal; }; /** * @deprecated */ var convertCaseValueConcat = exports.convertCaseValueConcat = function convertCaseValueConcat(spel, conv, config, meta) { var flat = []; function _processConcatChildren(children) { children.map(function (child) { if (child.type === "op-plus") { _processConcatChildren(child.children); } else { var convertedChild = _convertArg(child, conv, config, meta, spel); if (convertedChild) { flat.push(convertedChild); } else { meta.errors.push("Can't convert ".concat(child.type, " in concatenation")); } } }); } _processConcatChildren(spel.children); return { valueSrc: "value", valueType: "case_value", value: flat }; };