expand-value
Version:
Get deeply nested values from an object, like dot-prop and get-value, but with support for advanced features like bracket-notation and more.
1 lines • 4.32 kB
Source Map (JSON)
{"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":[]}