|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
|   | 
|   | 
| /** | 
|  * AUTO-GENERATED FILE. DO NOT MODIFY. | 
|  */ | 
|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
| import { keys, isArray, map, isObject, isString, isRegExp, isArrayLike, hasOwn, isNumber } from 'zrender/lib/core/util.js'; | 
| import { throwError, makePrintable } from './log.js'; | 
| import { getRawValueParser, createFilterComparator } from '../data/helper/dataValueHelper.js'; | 
| ; | 
| var RELATIONAL_EXPRESSION_OP_ALIAS_MAP = { | 
|   value: 'eq', | 
|   // PENDING: not good for literal semantic? | 
|   '<': 'lt', | 
|   '<=': 'lte', | 
|   '>': 'gt', | 
|   '>=': 'gte', | 
|   '=': 'eq', | 
|   '!=': 'ne', | 
|   '<>': 'ne' // Might mileading for sake of the different between '==' and '===', | 
|   // So dont support them. | 
|   // '==': 'eq', | 
|   // '===': 'seq', | 
|   // '!==': 'sne' | 
|   // PENDING: Whether support some common alias "ge", "le", "neq"? | 
|   // ge: 'gte', | 
|   // le: 'lte', | 
|   // neq: 'ne', | 
|   | 
| }; // type RelationalExpressionOpEvaluate = (tarVal: unknown, condVal: unknown) => boolean; | 
|   | 
| var RegExpEvaluator = | 
| /** @class */ | 
| function () { | 
|   function RegExpEvaluator(rVal) { | 
|     // Support condVal: RegExp | string | 
|     var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null; | 
|   | 
|     if (condValue == null) { | 
|       var errMsg = ''; | 
|   | 
|       if (process.env.NODE_ENV !== 'production') { | 
|         errMsg = makePrintable('Illegal regexp', rVal, 'in'); | 
|       } | 
|   | 
|       throwError(errMsg); | 
|     } | 
|   } | 
|   | 
|   RegExpEvaluator.prototype.evaluate = function (lVal) { | 
|     var type = typeof lVal; | 
|     return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + '') : false; | 
|   }; | 
|   | 
|   return RegExpEvaluator; | 
| }(); | 
|   | 
| var ConstConditionInternal = | 
| /** @class */ | 
| function () { | 
|   function ConstConditionInternal() {} | 
|   | 
|   ConstConditionInternal.prototype.evaluate = function () { | 
|     return this.value; | 
|   }; | 
|   | 
|   return ConstConditionInternal; | 
| }(); | 
|   | 
| var AndConditionInternal = | 
| /** @class */ | 
| function () { | 
|   function AndConditionInternal() {} | 
|   | 
|   AndConditionInternal.prototype.evaluate = function () { | 
|     var children = this.children; | 
|   | 
|     for (var i = 0; i < children.length; i++) { | 
|       if (!children[i].evaluate()) { | 
|         return false; | 
|       } | 
|     } | 
|   | 
|     return true; | 
|   }; | 
|   | 
|   return AndConditionInternal; | 
| }(); | 
|   | 
| var OrConditionInternal = | 
| /** @class */ | 
| function () { | 
|   function OrConditionInternal() {} | 
|   | 
|   OrConditionInternal.prototype.evaluate = function () { | 
|     var children = this.children; | 
|   | 
|     for (var i = 0; i < children.length; i++) { | 
|       if (children[i].evaluate()) { | 
|         return true; | 
|       } | 
|     } | 
|   | 
|     return false; | 
|   }; | 
|   | 
|   return OrConditionInternal; | 
| }(); | 
|   | 
| var NotConditionInternal = | 
| /** @class */ | 
| function () { | 
|   function NotConditionInternal() {} | 
|   | 
|   NotConditionInternal.prototype.evaluate = function () { | 
|     return !this.child.evaluate(); | 
|   }; | 
|   | 
|   return NotConditionInternal; | 
| }(); | 
|   | 
| var RelationalConditionInternal = | 
| /** @class */ | 
| function () { | 
|   function RelationalConditionInternal() {} | 
|   | 
|   RelationalConditionInternal.prototype.evaluate = function () { | 
|     var needParse = !!this.valueParser; // Call getValue with no `this`. | 
|   | 
|     var getValue = this.getValue; | 
|     var tarValRaw = getValue(this.valueGetterParam); | 
|     var tarValParsed = needParse ? this.valueParser(tarValRaw) : null; // Relational cond follow "and" logic internally. | 
|   | 
|     for (var i = 0; i < this.subCondList.length; i++) { | 
|       if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) { | 
|         return false; | 
|       } | 
|     } | 
|   | 
|     return true; | 
|   }; | 
|   | 
|   return RelationalConditionInternal; | 
| }(); | 
|   | 
| function parseOption(exprOption, getters) { | 
|   if (exprOption === true || exprOption === false) { | 
|     var cond = new ConstConditionInternal(); | 
|     cond.value = exprOption; | 
|     return cond; | 
|   } | 
|   | 
|   var errMsg = ''; | 
|   | 
|   if (!isObjectNotArray(exprOption)) { | 
|     if (process.env.NODE_ENV !== 'production') { | 
|       errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption); | 
|     } | 
|   | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   if (exprOption.and) { | 
|     return parseAndOrOption('and', exprOption, getters); | 
|   } else if (exprOption.or) { | 
|     return parseAndOrOption('or', exprOption, getters); | 
|   } else if (exprOption.not) { | 
|     return parseNotOption(exprOption, getters); | 
|   } | 
|   | 
|   return parseRelationalOption(exprOption, getters); | 
| } | 
|   | 
| function parseAndOrOption(op, exprOption, getters) { | 
|   var subOptionArr = exprOption[op]; | 
|   var errMsg = ''; | 
|   | 
|   if (process.env.NODE_ENV !== 'production') { | 
|     errMsg = makePrintable('"and"/"or" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption); | 
|   } | 
|   | 
|   if (!isArray(subOptionArr)) { | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   if (!subOptionArr.length) { | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal(); | 
|   cond.children = map(subOptionArr, function (subOption) { | 
|     return parseOption(subOption, getters); | 
|   }); | 
|   | 
|   if (!cond.children.length) { | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   return cond; | 
| } | 
|   | 
| function parseNotOption(exprOption, getters) { | 
|   var subOption = exprOption.not; | 
|   var errMsg = ''; | 
|   | 
|   if (process.env.NODE_ENV !== 'production') { | 
|     errMsg = makePrintable('"not" condition should only be `not: {}`.', 'Illegal condition:', exprOption); | 
|   } | 
|   | 
|   if (!isObjectNotArray(subOption)) { | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   var cond = new NotConditionInternal(); | 
|   cond.child = parseOption(subOption, getters); | 
|   | 
|   if (!cond.child) { | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   return cond; | 
| } | 
|   | 
| function parseRelationalOption(exprOption, getters) { | 
|   var errMsg = ''; | 
|   var valueGetterParam = getters.prepareGetValue(exprOption); | 
|   var subCondList = []; | 
|   var exprKeys = keys(exprOption); | 
|   var parserName = exprOption.parser; | 
|   var valueParser = parserName ? getRawValueParser(parserName) : null; | 
|   | 
|   for (var i = 0; i < exprKeys.length; i++) { | 
|     var keyRaw = exprKeys[i]; | 
|   | 
|     if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) { | 
|       continue; | 
|     } | 
|   | 
|     var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw; | 
|     var condValueRaw = exprOption[keyRaw]; | 
|     var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw; | 
|     var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed); | 
|   | 
|     if (!evaluator) { | 
|       if (process.env.NODE_ENV !== 'production') { | 
|         errMsg = makePrintable('Illegal relational operation: "' + keyRaw + '" in condition:', exprOption); | 
|       } | 
|   | 
|       throwError(errMsg); | 
|     } | 
|   | 
|     subCondList.push(evaluator); | 
|   } | 
|   | 
|   if (!subCondList.length) { | 
|     if (process.env.NODE_ENV !== 'production') { | 
|       errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption); | 
|     } // No relational operator always disabled in case of dangers result. | 
|   | 
|   | 
|     throwError(errMsg); | 
|   } | 
|   | 
|   var cond = new RelationalConditionInternal(); | 
|   cond.valueGetterParam = valueGetterParam; | 
|   cond.valueParser = valueParser; | 
|   cond.getValue = getters.getValue; | 
|   cond.subCondList = subCondList; | 
|   return cond; | 
| } | 
|   | 
| function isObjectNotArray(val) { | 
|   return isObject(val) && !isArrayLike(val); | 
| } | 
|   | 
| var ConditionalExpressionParsed = | 
| /** @class */ | 
| function () { | 
|   function ConditionalExpressionParsed(exprOption, getters) { | 
|     this._cond = parseOption(exprOption, getters); | 
|   } | 
|   | 
|   ConditionalExpressionParsed.prototype.evaluate = function () { | 
|     return this._cond.evaluate(); | 
|   }; | 
|   | 
|   return ConditionalExpressionParsed; | 
| }(); | 
|   | 
| ; | 
| export function parseConditionalExpression(exprOption, getters) { | 
|   return new ConditionalExpressionParsed(exprOption, getters); | 
| } |