{"versions":{"1.0.0":{"name":"@antv/expr","version":"1.0.0","description":"A secure, high-performance expression evaluator for dynamic chart rendering","main":"dist/index.cjs.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","test":"vitest run --coverage","benchmark":"vitest bench","prepublishOnly":"npm run build"},"keywords":["expression","evaluator","parser","secure","antv","chart","expr"],"repository":{"type":"git","url":"git+https://github.com/antvis/expr.git"},"license":"MIT","devDependencies":{"@biomejs/biome":"1.9.4","@rollup/plugin-node-resolve":"^16.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-typescript":"^12.1.2","@vitest/coverage-v8":"^3.0.8","expr-eval":"^2.0.2","rollup":"^4.34.6","tslib":"^2.8.1","vitest":"^3.0.8"},"gitHead":"d218e29b281aac587e5df8fa106bc4661464b59c","bugs":{"url":"https://github.com/antvis/expr/issues"},"homepage":"https://github.com/antvis/expr#readme","_id":"@antv/expr@1.0.0","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-T/hkLIZYtiz1ri5iG7chBmn0ABehpOuy2SFcgXpmeJdTLG5/viTKZvzoY5Q4UZa///jQnpwuY1XvvZsXZlsl7w==","shasum":"10f8de95b319b6aab3c7cfb8aff22796f9682325","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@antv/expr/-/expr-1.0.0.tgz","fileCount":10,"unpackedSize":31333,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGtQERKQS4uqSxByoL7uklLQaYzU2e8sqDLiuMv4ctcIAiEAtendU9HmB6OrmcK4DKk09JJrRxUjU3joswPcgyoxS3o="}],"size":8864},"_npmUser":{"name":"anonymous","email":"boqingxin14@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"yunji.me@outlook.com"},{"name":"anonymous","email":"675861708@qq.com"},{"name":"anonymous","email":"fulingsun515@gmail.com"},{"name":"anonymous","email":"yilin.qyl@antfin.com"},{"name":"anonymous","email":"xingya.shi@gmail.com"},{"name":"anonymous","email":"360965398@qq.com"},{"name":"anonymous","email":"wjh199455@gmail.com"},{"name":"anonymous","email":"zhaoxiaodong@zju.edu.cn"},{"name":"anonymous","email":"15809244435@163.com"},{"name":"anonymous","email":"906626481@qq.com"},{"name":"anonymous","email":"leungwensen@gmail.com"},{"name":"anonymous","email":"418466938@qq.com"},{"name":"anonymous","email":"943720372@qq.com"},{"name":"anonymous","email":"zjwengyidong@outlook.com"},{"name":"anonymous","email":"sima.zhang1990@gmail.com"},{"name":"anonymous","email":"dxq613@gmail.com"},{"name":"anonymous","email":"h.a.p.p.y.y.x.d@163.com"},{"name":"anonymous","email":"lisuwe_n@163.com"},{"name":"anonymous","email":"jinke.li666@gmail.com"},{"name":"anonymous","email":"120635640@qq.com"},{"name":"anonymous","email":"army8735@qq.com"},{"name":"anonymous","email":"i@hust.cc"},{"name":"anonymous","email":"576375879@qq.com"},{"name":"anonymous","email":"dengfuping_private@163.com"},{"name":"anonymous","email":"neoddish@outlook.com"},{"name":"anonymous","email":"yuanjiefeng@gmail.com"},{"name":"anonymous","email":"zqlu.cn@gmail.com"},{"name":"anonymous","email":"afc163@gmail.com"},{"name":"anonymous","email":"czynwu@gmail.com"},{"name":"anonymous","email":"yanyanwang93@gmail.com"},{"name":"anonymous","email":"ccnuzindex@gmail.com"},{"name":"anonymous","email":"pyqiverson@gmail.com"},{"name":"anonymous","email":"bubkoo.wy@gmail.com"},{"name":"anonymous","email":"yezengyue@gmail.com"},{"name":"anonymous","email":"736929286@qq.com"},{"name":"anonymous","email":"boyu.zlj@antfin.com"},{"name":"anonymous","email":"lliudongqi@gmail.com"},{"name":"anonymous","email":"vectorse@126.com"},{"name":"anonymous","email":"wanyingxing@gmail.com"},{"name":"anonymous","email":"chenluuli@gmail.com"},{"name":"anonymous","email":"1175863618@qq.com"},{"name":"anonymous","email":"deng25st@163.com"},{"name":"anonymous","email":"semious@163.com"},{"name":"anonymous","email":"tygyh2012@gmail.com"},{"name":"anonymous","email":"1803275951@qq.com"},{"name":"anonymous","email":"1491812683@qq.com"},{"name":"anonymous","email":"mxz96102@qq.com"},{"name":"anonymous","email":"openwayne@gmail.com"},{"name":"anonymous","email":"subairui@icloud.com"},{"name":"anonymous","email":"pddpengdi@gmail.com"},{"name":"anonymous","email":"2912401452@qq.com"},{"name":"anonymous","email":"c5e1856@gmail.com"},{"name":"anonymous","email":"christy05.chen@gmail.com"},{"name":"anonymous","email":"laixingui.lxg@alibaba-inc.com"},{"name":"anonymous","email":"susiwen8@gmail.com"},{"name":"anonymous","email":"ojh496845051@gmail.com"},{"name":"anonymous","email":"zywangx@gmail.com"},{"name":"anonymous","email":"1748420480@qq.com"},{"name":"anonymous","email":"zhangjunjie0730@163.com"},{"name":"anonymous","email":"2523863783@qq.com"},{"name":"anonymous","email":"aptx.wang@gmail.com"},{"name":"anonymous","email":"caomengyuan2015@163.com"},{"name":"anonymous","email":"lcx.seima@gmail.com"},{"name":"anonymous","email":"hiphone96@gmail.com"},{"name":"anonymous","email":"370064808@qq.com"},{"name":"anonymous","email":"zhuyuxin0627@gmail.com"},{"name":"anonymous","email":"boqingxin14@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expr_1.0.0_1742315543495_0.897399375694153"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2025-03-18T16:32:23.698Z","publish_time":1742315543698,"_source_registry_name":"default","contributors":[]},"1.0.1":{"name":"@antv/expr","version":"1.0.1","description":"A secure, high-performance expression evaluator for dynamic chart rendering","main":"dist/index.cjs.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","test":"vitest run --coverage","benchmark":"vitest bench","prepublishOnly":"pnpm run test && pnpm run build"},"keywords":["expression","evaluator","parser","secure","antv","chart","expr"],"repository":{"type":"git","url":"git+https://github.com/antvis/expr.git"},"license":"MIT","devDependencies":{"@biomejs/biome":"1.9.4","@rollup/plugin-node-resolve":"^16.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-typescript":"^12.1.2","@vitest/coverage-v8":"^3.0.8","expr-eval":"^2.0.2","rollup":"^4.34.6","tslib":"^2.8.1","vitest":"^3.0.8"},"gitHead":"87f76af1c6cfd822de0db0d095f6cf2a6bd7066a","bugs":{"url":"https://github.com/antvis/expr/issues"},"homepage":"https://github.com/antvis/expr#readme","_id":"@antv/expr@1.0.1","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-q014sb6UFPHgxG+vRUCywP/AXAZ2slRU55LbAMVyEOJINDv4TOd1RjEikATPNO7p8xVJf0Irjd3+U3wxtlo+ig==","shasum":"3b8ba30dbe3af44cf64d7715ef46478ad69a9033","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@antv/expr/-/expr-1.0.1.tgz","fileCount":10,"unpackedSize":31122,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFRbw9mEC4Is5px79M1I7sLNdJ9h9Qm4UviAAYUQb0ljAiAtj1G53T/OO6jb/eIrVkmKiah3UBvncrZrIjW8cK8vAQ=="}],"size":8878},"_npmUser":{"name":"anonymous","email":"boqingxin14@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"yunji.me@outlook.com"},{"name":"anonymous","email":"675861708@qq.com"},{"name":"anonymous","email":"fulingsun515@gmail.com"},{"name":"anonymous","email":"yilin.qyl@antfin.com"},{"name":"anonymous","email":"xingya.shi@gmail.com"},{"name":"anonymous","email":"360965398@qq.com"},{"name":"anonymous","email":"wjh199455@gmail.com"},{"name":"anonymous","email":"zhaoxiaodong@zju.edu.cn"},{"name":"anonymous","email":"15809244435@163.com"},{"name":"anonymous","email":"906626481@qq.com"},{"name":"anonymous","email":"leungwensen@gmail.com"},{"name":"anonymous","email":"418466938@qq.com"},{"name":"anonymous","email":"943720372@qq.com"},{"name":"anonymous","email":"zjwengyidong@outlook.com"},{"name":"anonymous","email":"sima.zhang1990@gmail.com"},{"name":"anonymous","email":"dxq613@gmail.com"},{"name":"anonymous","email":"h.a.p.p.y.y.x.d@163.com"},{"name":"anonymous","email":"lisuwe_n@163.com"},{"name":"anonymous","email":"jinke.li666@gmail.com"},{"name":"anonymous","email":"120635640@qq.com"},{"name":"anonymous","email":"army8735@qq.com"},{"name":"anonymous","email":"i@hust.cc"},{"name":"anonymous","email":"576375879@qq.com"},{"name":"anonymous","email":"dengfuping_private@163.com"},{"name":"anonymous","email":"neoddish@outlook.com"},{"name":"anonymous","email":"yuanjiefeng@gmail.com"},{"name":"anonymous","email":"zqlu.cn@gmail.com"},{"name":"anonymous","email":"afc163@gmail.com"},{"name":"anonymous","email":"czynwu@gmail.com"},{"name":"anonymous","email":"yanyanwang93@gmail.com"},{"name":"anonymous","email":"ccnuzindex@gmail.com"},{"name":"anonymous","email":"pyqiverson@gmail.com"},{"name":"anonymous","email":"bubkoo.wy@gmail.com"},{"name":"anonymous","email":"yezengyue@gmail.com"},{"name":"anonymous","email":"736929286@qq.com"},{"name":"anonymous","email":"boyu.zlj@antfin.com"},{"name":"anonymous","email":"lliudongqi@gmail.com"},{"name":"anonymous","email":"vectorse@126.com"},{"name":"anonymous","email":"wanyingxing@gmail.com"},{"name":"anonymous","email":"chenluuli@gmail.com"},{"name":"anonymous","email":"1175863618@qq.com"},{"name":"anonymous","email":"deng25st@163.com"},{"name":"anonymous","email":"semious@163.com"},{"name":"anonymous","email":"tygyh2012@gmail.com"},{"name":"anonymous","email":"1803275951@qq.com"},{"name":"anonymous","email":"1491812683@qq.com"},{"name":"anonymous","email":"mxz96102@qq.com"},{"name":"anonymous","email":"openwayne@gmail.com"},{"name":"anonymous","email":"subairui@icloud.com"},{"name":"anonymous","email":"pddpengdi@gmail.com"},{"name":"anonymous","email":"2912401452@qq.com"},{"name":"anonymous","email":"c5e1856@gmail.com"},{"name":"anonymous","email":"christy05.chen@gmail.com"},{"name":"anonymous","email":"laixingui.lxg@alibaba-inc.com"},{"name":"anonymous","email":"susiwen8@gmail.com"},{"name":"anonymous","email":"ojh496845051@gmail.com"},{"name":"anonymous","email":"zywangx@gmail.com"},{"name":"anonymous","email":"1748420480@qq.com"},{"name":"anonymous","email":"zhangjunjie0730@163.com"},{"name":"anonymous","email":"2523863783@qq.com"},{"name":"anonymous","email":"aptx.wang@gmail.com"},{"name":"anonymous","email":"caomengyuan2015@163.com"},{"name":"anonymous","email":"lcx.seima@gmail.com"},{"name":"anonymous","email":"hiphone96@gmail.com"},{"name":"anonymous","email":"370064808@qq.com"},{"name":"anonymous","email":"zhuyuxin0627@gmail.com"},{"name":"anonymous","email":"boqingxin14@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expr_1.0.1_1742356524423_0.8147682959077318"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2025-03-19T03:55:24.611Z","publish_time":1742356524611,"_source_registry_name":"default","contributors":[]},"1.0.2":{"name":"@antv/expr","version":"1.0.2","description":"A secure, high-performance expression evaluator for dynamic chart rendering","main":"dist/index.cjs.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c && npm run size","test":"vitest run --coverage","size":"limit-size","benchmark":"vitest bench","prepublishOnly":"pnpm run test && pnpm run build"},"keywords":["expression","evaluator","parser","secure","antv","chart","expr"],"devDependencies":{"@biomejs/biome":"1.9.4","@rollup/plugin-node-resolve":"^16.0.0","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-typescript":"^12.1.2","@vitest/coverage-v8":"^3.0.8","expr-eval":"^2.0.2","limit-size":"^0.1.4","rollup":"^4.34.6","tslib":"^2.8.1","vitest":"^3.0.8"},"limit-size":[{"path":"dist/index.cjs.js","limit":"8 Kb"},{"path":"dist/index.cjs.js","limit":"3 Kb","gzip":true}],"repository":{"type":"git","url":"git+https://github.com/antvis/expr.git"},"license":"MIT","gitHead":"e8c48e4a37e3efef9ef924bd607a44f2e9091013","bugs":{"url":"https://github.com/antvis/expr/issues"},"homepage":"https://github.com/antvis/expr#readme","_id":"@antv/expr@1.0.2","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-vrfdmPHkTuiS5voVutKl2l06w1ihBh9A8SFdQPEE+2KMVpkymzGOF1eWpfkbGZ7tiFE15GodVdhhHomD/hdIwg==","shasum":"a75fa0a0f132fe47bedf6c8b93a847997ffe53ff","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@antv/expr/-/expr-1.0.2.tgz","fileCount":14,"unpackedSize":32979,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIADq2kf5dbjQUXv0V2zWCyY4kflkRNi0XFieXJcrA4R0AiEAoQ6oXb3dnaV+7vTG7PiJo1cdHCDan5/ifQ8PDCcq81Y="}],"size":9993},"_npmUser":{"name":"anonymous","email":"boqingxin14@gmail.com"},"directories":{},"maintainers":[{"name":"anonymous","email":"yunji.me@outlook.com"},{"name":"anonymous","email":"675861708@qq.com"},{"name":"anonymous","email":"fulingsun515@gmail.com"},{"name":"anonymous","email":"yilin.qyl@antfin.com"},{"name":"anonymous","email":"xingya.shi@gmail.com"},{"name":"anonymous","email":"360965398@qq.com"},{"name":"anonymous","email":"wjh199455@gmail.com"},{"name":"anonymous","email":"zhaoxiaodong@zju.edu.cn"},{"name":"anonymous","email":"15809244435@163.com"},{"name":"anonymous","email":"906626481@qq.com"},{"name":"anonymous","email":"leungwensen@gmail.com"},{"name":"anonymous","email":"418466938@qq.com"},{"name":"anonymous","email":"943720372@qq.com"},{"name":"anonymous","email":"zjwengyidong@outlook.com"},{"name":"anonymous","email":"sima.zhang1990@gmail.com"},{"name":"anonymous","email":"dxq613@gmail.com"},{"name":"anonymous","email":"h.a.p.p.y.y.x.d@163.com"},{"name":"anonymous","email":"lisuwe_n@163.com"},{"name":"anonymous","email":"jinke.li666@gmail.com"},{"name":"anonymous","email":"120635640@qq.com"},{"name":"anonymous","email":"army8735@qq.com"},{"name":"anonymous","email":"i@hust.cc"},{"name":"anonymous","email":"576375879@qq.com"},{"name":"anonymous","email":"dengfuping_private@163.com"},{"name":"anonymous","email":"neoddish@outlook.com"},{"name":"anonymous","email":"yuanjiefeng@gmail.com"},{"name":"anonymous","email":"zqlu.cn@gmail.com"},{"name":"anonymous","email":"afc163@gmail.com"},{"name":"anonymous","email":"czynwu@gmail.com"},{"name":"anonymous","email":"yanyanwang93@gmail.com"},{"name":"anonymous","email":"ccnuzindex@gmail.com"},{"name":"anonymous","email":"pyqiverson@gmail.com"},{"name":"anonymous","email":"bubkoo.wy@gmail.com"},{"name":"anonymous","email":"yezengyue@gmail.com"},{"name":"anonymous","email":"736929286@qq.com"},{"name":"anonymous","email":"boyu.zlj@antfin.com"},{"name":"anonymous","email":"lliudongqi@gmail.com"},{"name":"anonymous","email":"vectorse@126.com"},{"name":"anonymous","email":"wanyingxing@gmail.com"},{"name":"anonymous","email":"chenluuli@gmail.com"},{"name":"anonymous","email":"1175863618@qq.com"},{"name":"anonymous","email":"deng25st@163.com"},{"name":"anonymous","email":"semious@163.com"},{"name":"anonymous","email":"tygyh2012@gmail.com"},{"name":"anonymous","email":"1803275951@qq.com"},{"name":"anonymous","email":"1491812683@qq.com"},{"name":"anonymous","email":"mxz96102@qq.com"},{"name":"anonymous","email":"openwayne@gmail.com"},{"name":"anonymous","email":"subairui@icloud.com"},{"name":"anonymous","email":"pddpengdi@gmail.com"},{"name":"anonymous","email":"2912401452@qq.com"},{"name":"anonymous","email":"c5e1856@gmail.com"},{"name":"anonymous","email":"christy05.chen@gmail.com"},{"name":"anonymous","email":"laixingui.lxg@alibaba-inc.com"},{"name":"anonymous","email":"susiwen8@gmail.com"},{"name":"anonymous","email":"ojh496845051@gmail.com"},{"name":"anonymous","email":"zywangx@gmail.com"},{"name":"anonymous","email":"1748420480@qq.com"},{"name":"anonymous","email":"zhangjunjie0730@163.com"},{"name":"anonymous","email":"2523863783@qq.com"},{"name":"anonymous","email":"aptx.wang@gmail.com"},{"name":"anonymous","email":"caomengyuan2015@163.com"},{"name":"anonymous","email":"lcx.seima@gmail.com"},{"name":"anonymous","email":"hiphone96@gmail.com"},{"name":"anonymous","email":"370064808@qq.com"},{"name":"anonymous","email":"zhuyuxin0627@gmail.com"},{"name":"anonymous","email":"boqingxin14@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expr_1.0.2_1743175290650_0.24510316293729528"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2025-03-28T15:21:31.146Z","publish_time":1743175291146,"_source_registry_name":"default","contributors":[]}},"dist-tags":{"latest":"1.0.2"},"name":"@antv/expr","time":{"created":"2025-03-18T20:53:44.962Z","modified":"2025-12-10T11:52:12.751Z","1.0.0":"2025-03-18T16:32:23.698Z","1.0.1":"2025-03-19T03:55:24.611Z","1.0.2":"2025-03-28T15:21:31.146Z"},"readme":"<div align=\"center\">\n\n<h1>@antv/expr: Mathematical Expression Parser</h1>\n\nLightweight JavaScript expression parser and evaluator, safety and high-performance. 🚀\n\n![gzip size](https://img.badgesize.io/https://unpkg.com/@antv/expr/dist/index.esm.js?compression=gzip)\n[![Build Status](https://github.com/antvis/expr/actions/workflows/build.yml/badge.svg)](https://github.com/antvis/expr/actions/workflows/build.yml)\n[![npm Version](https://img.shields.io/npm/v/@antv/expr.svg)](https://www.npmjs.com/package/@antv/expr)\n[![npm Download](https://img.shields.io/npm/dm/@antv/expr.svg)](https://www.npmjs.com/package/@antv/expr)\n\n</div>\n\nUsed to parse a _mathematical expressions_ to _JavaScript function_ safely. For example, in [@antv/g2](https://github.com/antvis/expr), we can set the style with an expressions.\n\n```ts\n{\n  // Equivalent to function: `d => d.value > 100 ? 'red' : 'green'`\n  fill: \"{ d.value > 100 ? 'red' : 'green' }\",\n}\n```\n\n\n## ✨ Features\n\n- 🔒 **Secure by default** - No access to global objects or prototype chain, does not use `eval` or `new Function`.\n- 🚀 **High performance** - Supports pre-compilation of expressions for improved performance with repeated evaluations.\n- 🛠️ **Extensible** - Register custom functions to easily extend functionality.\n- 🪩 **Lightweight** - Zero dependencies, small footprint, before gzip it was less than `8 Kb`.\n\n\n## 📥 Installation\n\n```bash\nnpm install @antv/expr\n# or\nyarn add @antv/expr\n# or\npnpm add @antv/expr\n```\n\n\n## 🔨 Usage\n\n- [Synchronous Expression Evaluation](#synchronous-expression-evaluation)\n- [Pre-compiling Expressions](#pre-compiling-expressions)\n- [Registering and Calling Functions](#registering-and-calling-functions)\n- [Variable References](#variable-references)\n- [Arithmetic Operations](#arithmetic-operations)\n- [Comparison and Logical Operations](#comparison-and-logical-operations)\n- [Conditional (Ternary) Expressions](#conditional-ternary-expressions)\n- [Timeout Handling](#timeout-handling)\n\n### Synchronous Expression Evaluation\n\n```typescript\nimport { evaluate } from '@antv/expr';\n\n// Basic evaluation\nconst result = evaluate('x + y', { x: 10, y: 20 }); // returns 30\n\n// Using dot notation and array access\nconst data = {\n  values: [1, 2, 3],\n  status: 'active'\n};\n\nconst result = evaluate('data.values[0] + data.values[1]', { data }); // returns 3\n```\n\n### Pre-compiling Expressions\n\n```typescript\nimport { compile } from '@antv/expr';\n\n// Compile an expression\nconst evaluator = compile('price * quantity');\nconst result1 = evaluator({ price: 10, quantity: 5 }); // returns 50\nconst result2 = evaluator({ price: 20, quantity: 3 }); // returns 60\n```\n\n### Registering and Calling Functions\n\n```typescript\nimport { register, evaluate } from '@antv/expr';\n\n// Register functions\nregister('formatCurrency', (amount) => `$${amount.toFixed(2)}`);\n\n// Function call with arguments\nconst result = evaluate('@max(a, b, c)', { a: 5, b: 9, c: 2 }); // returns 9\n\n// Expression as function arguments\nconst result = evaluate('@formatCurrency(price * quantity)', { \n  price: 10.5, quantity: 3 \n}); // returns '$31.50'\n```\nBuild-in Functions: `abs`, `ceil`, `floor`, `round`, `sqrt`, `pow`, `max`, `min`.\n\n### Variable References\n\n```typescript\n// Simple variable reference\nconst result = evaluate('x', { x: 42 }); // returns 42\n\n// Nested property access with dot notation\nconst result = evaluate('user.profile.name', { \n  user: { profile: { name: 'John' } } \n}); // returns 'John'\n\n// Array access with bracket notation\nconst result = evaluate('items[0]', { items: [10, 20, 30] }); // returns 10\n\n// Mixed dot and bracket notation\nconst result = evaluate('data.items[0].value', { \n  data: { items: [{ value: 42 }] } \n}); // returns 42\n```\n\n### Arithmetic Operations\n\n```typescript\n// Basic arithmetic\nconst result = evaluate('a + b * c', { a: 5, b: 3, c: 2 }); // returns 11\n\n// Using parentheses for grouping\nconst result = evaluate('(a + b) * c', { a: 5, b: 3, c: 2 }); // returns 16\n\n// Modulo operation\nconst result = evaluate('a % b', { a: 10, b: 3 }); // returns 1\n```\n\n### Comparison and Logical Operations\n\n```typescript\n// Comparison operators\nconst result = evaluate('age >= 18', { age: 20 }); // returns true\n\n// Logical AND\nconst result = evaluate('isActive && !isDeleted', { \n  isActive: true, isDeleted: false \n}); // returns true\n\n// Logical OR\nconst result = evaluate('status === \"active\" || status === \"pending\"', { \n  status: 'pending' \n}); // returns true\n```\n\n### Conditional (Ternary) Expressions\n\n```typescript\n// Simple ternary expression\nconst result = evaluate('age >= 18 ? \"adult\" : \"minor\"', { \n  age: 20 \n}); // returns 'adult'\n\n// Nested ternary expressions\nconst result = evaluate('score >= 90 ? \"A\" : score >= 80 ? \"B\" : \"C\"', { \n  score: 85 \n}); // returns 'B'\n```\n\n### Timeout Handling\n\nYou can implement timeout handling by wrapping your evaluation in a `Promise.race` with a timeout:\n\n```typescript\nimport { evaluate } from \"@antv/expr\";\n\n// Create a function that evaluates with a timeout\nfunction evaluateWithTimeout(expr, context, timeoutMs) {\n  const evaluationPromise = new Promise((resolve) => {\n    resolve(evaluate(expr, context));\n  });\n\n  const timeoutPromise = new Promise((_, reject) => {\n    setTimeout(\n      () => reject(new Error(`Evaluation timed out after ${timeoutMs}ms`)),\n      timeoutMs,\n    );\n  });\n\n  return Promise.race([evaluationPromise, timeoutPromise]);\n}\n```\n\n\n## 🚀Benchmarks\n\nPerformance comparison of different evaluation methods: (baseline: new Function)\n\n| Expression Type       | new Function vs evaluate after compile | new Function vs evaluate without compile | new Function vs [expr-eval](https://www.npmjs.com/package/expr-eval?activeTab=readme) Parser |\n|-----------------------|----------------------------------------|------------------------------------------|----------------------------------|\n| Simple Expressions    | 1.59x faster                          | 6.36x faster                             | 23.94x faster                    |\n| Medium Expressions    | 2.16x faster                          | 9.81x faster                            | 37.81x faster                    |\n| Complex Expressions   | 1.59x faster                          | 4.89x faster                             | 32.74x faster                    |\n\n```mermaid\ngantt\n    title Performance Comparison (Baseline: new Function) * 100\n    dateFormat  X\n    axisFormat %s\n\n    section Simple\n    expr evaluate after compile    :done, 0, 159\n    expr evaluate without compile  :done, 0, 636\n    expr-eval Parser          :done, 0, 2394\n\n    section Medium\n    expr evaluate after compile    :done, 0, 216\n    expr evaluate without compile  :done, 0, 981\n    expr-eval Parser          :done, 0, 3781\n\n    section Complex\n    expr evaluate after compile    :done, 0, 159\n    expr evaluate without compile  :done, 0, 489\n    expr-eval Parser          :done, 0, 3274\n```\n\n\n## 📮API Reference\n\n#### `evaluate(expression: string, context?: object): any`\n\nSynchronously evaluates an expression and returns the result.\n\n- `expression`: The expression string to evaluate\n- `context`: An object containing variables used in the expression (optional)\n- Returns: The result of the expression evaluation\n\n#### `compile(expression: string): (context?: object) => any`\n\nSynchronously compiles an expression, returning a function that can be used multiple times.\n\n- `expression`: The expression string to compile\n- Returns: A function that accepts a context object and returns the evaluation result\n\n#### `register(name: string, fn: Function): void`\n\nRegisters a custom function that can be used in expressions.\n\n- `name`: Function name (used with @ prefix in expressions)\n- `fn`: Function implementation\n\nAll evaluation errors throw an `ExpressionError` type exception with detailed error information.\n\n\n## License\n\nMIT","users":{}}