{"version":3,"sources":["../../src/expression.ts"],"sourcesContent":["function parse(expression) {\n  let pos = 0;\n\n  function peek() {\n    return expression[pos];\n  }\n\n  function consume() {\n    return expression[pos++];\n  }\n\n  function skipWs() {\n    while (pos < expression.length && /\\s/.test(peek())) {\n      pos++;\n    }\n  }\n\n  function parseNum() {\n    let n = '';\n    while (pos < expression.length && /\\d/.test(peek())) {\n      n += consume();\n    }\n    return { type: 'number', val: parseInt(n, 10) };\n  }\n\n  function parseIdent() {\n    let id = '';\n    while (pos < expression.length && /[\\w$]/.test(peek())) {\n      id += consume();\n    }\n    return id;\n  }\n\n  function parsePath() {\n    const parts = [parseIdent()];\n\n    while (peek() === '.') {\n      consume();\n      parts.push(parseIdent());\n    }\n\n    return { type: 'path', parts };\n  }\n\n  function parsePrimary() {\n    skipWs();\n\n    const ch = peek();\n    if (/\\d/.test(ch)) {\n      return parseNum();\n    }\n\n    if (/[\\w$]/.test(ch)) {\n      return parsePath();\n    }\n\n    if (ch === '(') {\n      consume();\n      const node = parseExpr();\n      skipWs();\n      if (peek() === ')') consume();\n      return node;\n    }\n\n    return null;\n  }\n\n  function parseExpr() {\n    let left = parsePrimary();\n\n    while (true) {\n      skipWs();\n\n      const op = peek();\n      if (op !== '+' && op !== '-') {\n        break;\n      }\n\n      consume();\n      const right = parsePrimary();\n      left = { type: 'binary', op, left, right };\n    }\n\n    return left;\n  }\n\n  return parseExpr();\n}\n\nfunction evaluateExpression(node, data) {\n  if (!node) return undefined;\n\n  switch (node.type) {\n    case 'number': {\n      return node.val;\n    }\n\n    case 'path': {\n      let val = data;\n      for (const p of node.parts) {\n        if (val == null) return undefined;\n        val = val[p];\n      }\n      return val;\n    }\n\n    case 'binary': {\n      const l = evaluateExpression(node.left, data);\n      const r = evaluateExpression(node.right, data);\n      if (node.op === '+') return l + r;\n      if (node.op === '-') return l - r;\n      return undefined;\n    }\n\n    default: {\n      return undefined;\n    }\n  }\n}\n\nexport function evaluate(expression: string, data) {\n  const ast = parse(expression);\n  return evaluateExpression(ast, data);\n}\n"],"mappings":";;;;AAAA,SAAS,MAAM,YAAY;AACzB,MAAI,MAAM;AAEV,WAAS,OAAO;AACd,WAAO,WAAW,GAAG;AAAA,EACvB;AAFS;AAIT,WAAS,UAAU;AACjB,WAAO,WAAW,KAAK;AAAA,EACzB;AAFS;AAIT,WAAS,SAAS;AAChB,WAAO,MAAM,WAAW,UAAU,KAAK,KAAK,KAAK,CAAC,GAAG;AACnD;AAAA,IACF;AAAA,EACF;AAJS;AAMT,WAAS,WAAW;AAClB,QAAI,IAAI;AACR,WAAO,MAAM,WAAW,UAAU,KAAK,KAAK,KAAK,CAAC,GAAG;AACnD,WAAK,QAAQ;AAAA,IACf;AACA,WAAO,EAAE,MAAM,UAAU,KAAK,SAAS,GAAG,EAAE,EAAE;AAAA,EAChD;AANS;AAQT,WAAS,aAAa;AACpB,QAAI,KAAK;AACT,WAAO,MAAM,WAAW,UAAU,QAAQ,KAAK,KAAK,CAAC,GAAG;AACtD,YAAM,QAAQ;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AANS;AAQT,WAAS,YAAY;AACnB,UAAM,QAAQ,CAAC,WAAW,CAAC;AAE3B,WAAO,KAAK,MAAM,KAAK;AACrB,cAAQ;AACR,YAAM,KAAK,WAAW,CAAC;AAAA,IACzB;AAEA,WAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,EAC/B;AATS;AAWT,WAAS,eAAe;AACtB,WAAO;AAEP,UAAM,KAAK,KAAK;AAChB,QAAI,KAAK,KAAK,EAAE,GAAG;AACjB,aAAO,SAAS;AAAA,IAClB;AAEA,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,OAAO,KAAK;AACd,cAAQ;AACR,YAAM,OAAO,UAAU;AACvB,aAAO;AACP,UAAI,KAAK,MAAM,IAAK,SAAQ;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AArBS;AAuBT,WAAS,YAAY;AACnB,QAAI,OAAO,aAAa;AAExB,WAAO,MAAM;AACX,aAAO;AAEP,YAAM,KAAK,KAAK;AAChB,UAAI,OAAO,OAAO,OAAO,KAAK;AAC5B;AAAA,MACF;AAEA,cAAQ;AACR,YAAM,QAAQ,aAAa;AAC3B,aAAO,EAAE,MAAM,UAAU,IAAI,MAAM,MAAM;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AAjBS;AAmBT,SAAO,UAAU;AACnB;AAvFS;AAyFT,SAAS,mBAAmB,MAAM,MAAM;AACtC,MAAI,CAAC,KAAM,QAAO;AAElB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,UAAU;AACb,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,MAAM;AACV,iBAAW,KAAK,KAAK,OAAO;AAC1B,YAAI,OAAO,KAAM,QAAO;AACxB,cAAM,IAAI,CAAC;AAAA,MACb;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,IAAI,mBAAmB,KAAK,MAAM,IAAI;AAC5C,YAAM,IAAI,mBAAmB,KAAK,OAAO,IAAI;AAC7C,UAAI,KAAK,OAAO,IAAK,QAAO,IAAI;AAChC,UAAI,KAAK,OAAO,IAAK,QAAO,IAAI;AAChC,aAAO;AAAA,IACT;AAAA,IAEA,SAAS;AACP,aAAO;AAAA,IACT;AAAA,EACF;AACF;AA7BS;AA+BF,SAAS,SAAS,YAAoB,MAAM;AACjD,QAAM,MAAM,MAAM,UAAU;AAC5B,SAAO,mBAAmB,KAAK,IAAI;AACrC;AAHgB;","names":[]}