| 
/* 
 | 
* 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 be misleading for sake of the difference between '==' and '===', 
 | 
  // so don't 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); 
 | 
} 
 |