bonsai-js 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.1] - 2026-03-16
9
+
10
+ ### Added
11
+
12
+ - Native method support for commonly expected string methods: `trim`, `toLowerCase`, `toUpperCase`, `split`, `padStart`, `padEnd`, `concat`, `lastIndexOf`
13
+ - Native method support for additional array methods: `join`, `flat`, `concat`, `lastIndexOf`, `findIndex`, `flatMap`
14
+ - ES2023 non-mutating array methods: `toReversed`, `toSorted`, `toSpliced`, `with`
15
+ - Mutating array methods (`reverse`, `sort`, `push`, `pop`, `splice`) are explicitly blocked to prevent context mutation
16
+
8
17
  ## [0.2.0] - 2026-03-15
9
18
 
10
19
  ### Added
package/README.md CHANGED
@@ -27,6 +27,8 @@ bun add bonsai-js
27
27
  npm install bonsai-js
28
28
  ```
29
29
 
30
+ [npm](https://www.npmjs.com/package/bonsai-js) · [Playground](https://danfry1.github.io/bonsai-js/playground.html) · [Docs](https://danfry1.github.io/bonsai-js/docs.html)
31
+
30
32
  ## When to use it
31
33
 
32
34
  - Evaluate expressions from config, database records, or admin tools.
@@ -183,6 +185,47 @@ expr.evaluateSync('[1, 2, 3].every(. > 0)') // true
183
185
 
184
186
  Both styles support async evaluation via `evaluate()`.
185
187
 
188
+ ### Built-in safe methods
189
+
190
+ These methods work via native `.method()` syntax without any imports. Mutating methods (`reverse`, `sort`, `push`, `pop`, `splice`, etc.) are blocked to prevent context mutation.
191
+
192
+ **String methods:**
193
+
194
+ | Method | Example |
195
+ | --- | --- |
196
+ | `trim`, `trimStart`, `trimEnd` | `" hi ".trim()` → `"hi"` |
197
+ | `toLowerCase`, `toUpperCase` | `"Hello".toLowerCase()` → `"hello"` |
198
+ | `startsWith`, `endsWith` | `"hello".startsWith("hel")` → `true` |
199
+ | `includes`, `indexOf`, `lastIndexOf` | `"hello".includes("ell")` → `true` |
200
+ | `slice`, `substring`, `at` | `"hello".slice(1, 3)` → `"el"` |
201
+ | `replace`, `replaceAll` | `"abc".replace("a", "x")` → `"xbc"` |
202
+ | `split` | `"a,b,c".split(",")` → `["a", "b", "c"]` |
203
+ | `padStart`, `padEnd` | `"5".padStart(3, "0")` → `"005"` |
204
+ | `charAt`, `charCodeAt`, `repeat`, `concat` | `"ab".repeat(2)` → `"abab"` |
205
+
206
+ **Array methods (with lambda support):**
207
+
208
+ | Method | Example |
209
+ | --- | --- |
210
+ | `filter` | `[1,2,3].filter(. > 1)` → `[2, 3]` |
211
+ | `map` | `[1,2,3].map(. * 10)` → `[10, 20, 30]` |
212
+ | `find`, `findIndex` | `[1,2,3].find(. > 1)` → `2` |
213
+ | `some`, `every` | `[1,2,3].some(. > 2)` → `true` |
214
+ | `flatMap` | `[[1],[2,3]].flatMap(.)` |
215
+
216
+ **Array methods (non-callback):**
217
+
218
+ | Method | Example |
219
+ | --- | --- |
220
+ | `join` | `[1,2,3].join(", ")` → `"1, 2, 3"` |
221
+ | `includes`, `indexOf`, `lastIndexOf` | `[1,2,3].includes(2)` → `true` |
222
+ | `slice`, `at`, `concat`, `flat` | `[1,2,3].concat([4])` → `[1, 2, 3, 4]` |
223
+ | `toReversed`, `toSorted`, `toSpliced`, `with` | `[3,1,2].toSorted()` → `[1, 2, 3]` |
224
+
225
+ **Number methods:** `toFixed`, `toString`
226
+
227
+ **Pipe-only transforms** (require stdlib import): `count`, `first`, `last`, `reverse`, `flatten`, `unique`, `sort`, `upper`, `lower`, `trim`, `sum`, `avg`, `clamp`, and more. See [Standard Library](#standard-library) for the full list.
228
+
186
229
  ## API Reference
187
230
 
188
231
  ### `bonsai(options?)`
package/dist/index.mjs CHANGED
@@ -1273,19 +1273,35 @@ function isAllowedReceiver(obj, methodName) {
1273
1273
  case "charAt":
1274
1274
  case "charCodeAt":
1275
1275
  case "repeat":
1276
+ case "trim":
1276
1277
  case "trimStart":
1277
1278
  case "trimEnd":
1279
+ case "toLowerCase":
1280
+ case "toUpperCase":
1278
1281
  case "replace":
1279
- case "replaceAll": return t === "string";
1282
+ case "replaceAll":
1283
+ case "padStart":
1284
+ case "padEnd":
1285
+ case "split": return t === "string";
1280
1286
  case "includes":
1281
1287
  case "indexOf":
1288
+ case "lastIndexOf":
1282
1289
  case "slice":
1283
- case "at": return t === "string" || Array.isArray(obj);
1290
+ case "at":
1291
+ case "concat": return t === "string" || Array.isArray(obj);
1284
1292
  case "filter":
1285
1293
  case "map":
1286
1294
  case "find":
1295
+ case "findIndex":
1287
1296
  case "some":
1288
- case "every": return Array.isArray(obj);
1297
+ case "every":
1298
+ case "flatMap": return Array.isArray(obj);
1299
+ case "join":
1300
+ case "flat":
1301
+ case "toReversed":
1302
+ case "toSorted":
1303
+ case "toSpliced":
1304
+ case "with": return Array.isArray(obj);
1289
1305
  case "toFixed": return t === "number";
1290
1306
  case "toString": return t === "string" || t === "number";
1291
1307
  default: return false;
@@ -1803,6 +1819,14 @@ async function evalAsyncArrayMethod(methodName, arr, predicate) {
1803
1819
  const results = arr.map(predicate);
1804
1820
  return { value: (results.some((r) => r instanceof Promise) ? await Promise.all(results) : results).every(Boolean) };
1805
1821
  }
1822
+ case "findIndex": {
1823
+ const results = arr.map(predicate);
1824
+ return { value: (results.some((r) => r instanceof Promise) ? await Promise.all(results) : results).findIndex(Boolean) };
1825
+ }
1826
+ case "flatMap": {
1827
+ const results = arr.map(predicate);
1828
+ return { value: (results.some((r) => r instanceof Promise) ? await Promise.all(results) : results).flat() };
1829
+ }
1806
1830
  default: return;
1807
1831
  }
1808
1832
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["getObjectPropertyKey","makeLambdaAccessor"],"sources":["../src/lexer.ts","../src/parser.ts","../src/compiler.ts","../src/eval-ops.ts","../src/evaluator.ts","../src/evaluator-async.ts","../src/execution-context.ts","../src/cache.ts","../src/plugins.ts","../src/index.ts"],"sourcesContent":["import type { Token, PunctuationValue } from './types.js'\nimport { ExpressionError } from './errors.js'\n\nconst KEYWORDS = new Map<string, { type: Token['type']; value: string }>([\n ['true', { type: 'Boolean', value: 'true' }],\n ['false', { type: 'Boolean', value: 'false' }],\n ['null', { type: 'Null', value: 'null' }],\n ['undefined', { type: 'Undefined', value: 'undefined' }],\n ['in', { type: 'Operator', value: 'in' }],\n ['not', { type: 'Operator', value: 'not' }],\n])\n\nfunction isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9'\n}\n\nfunction isAlpha(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_' || ch === '$'\n}\n\nfunction isAlphaNumeric(ch: string): boolean {\n return isAlpha(ch) || isDigit(ch)\n}\n\nfunction isHexDigit(ch: string): boolean {\n return isDigit(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')\n}\n\nexport function tokenize(source: string): Token[] {\n const tokens: Token[] = []\n let i = 0\n\n while (i < source.length) {\n const ch = source[i]\n\n // Skip whitespace\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n i++\n continue\n }\n\n // Numbers: decimal, hex, binary, octal, scientific, underscores\n if (isDigit(ch)) {\n const start = i\n\n // Hex: 0x...\n if (ch === '0' && i + 1 < source.length && (source[i + 1] === 'x' || source[i + 1] === 'X')) {\n i += 2\n while (i < source.length && (isHexDigit(source[i]) || source[i] === '_')) i++\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Binary: 0b...\n if (ch === '0' && i + 1 < source.length && (source[i + 1] === 'b' || source[i + 1] === 'B')) {\n i += 2\n while (i < source.length && (source[i] === '0' || source[i] === '1' || source[i] === '_')) i++\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Octal: 0o...\n if (ch === '0' && i + 1 < source.length && (source[i + 1] === 'o' || source[i + 1] === 'O')) {\n i += 2\n while (i < source.length && ((source[i] >= '0' && source[i] <= '7') || source[i] === '_')) i++\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Decimal (with optional underscore separators)\n while (i < source.length && (isDigit(source[i]) || source[i] === '_')) i++\n if (i < source.length && source[i] === '.' && i + 1 < source.length && isDigit(source[i + 1])) {\n i++ // skip '.'\n while (i < source.length && (isDigit(source[i]) || source[i] === '_')) i++\n }\n\n // Scientific notation: e/E followed by optional +/- and digits\n if (i < source.length && (source[i] === 'e' || source[i] === 'E')) {\n i++\n if (i < source.length && (source[i] === '+' || source[i] === '-')) i++\n while (i < source.length && (isDigit(source[i]) || source[i] === '_')) i++\n }\n\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n const quote = ch\n const start = i\n i++ // skip opening quote\n let value = ''\n while (i < source.length && source[i] !== quote) {\n if (source[i] === '\\\\') {\n i++\n const escaped = source[i]\n switch (escaped) {\n case 'n': value += '\\n'; break\n case 't': value += '\\t'; break\n case 'r': value += '\\r'; break\n case '\\\\': value += '\\\\'; break\n case '0': value += '\\0'; break\n case 'x': {\n const hex = source.slice(i + 1, i + 3)\n if (hex.length < 2 || !isHexDigit(hex[0]) || !isHexDigit(hex[1])) {\n throw new ExpressionError('Invalid \\\\x escape: expected 2 hex digits', { source, start, end: i + 3 })\n }\n value += String.fromCharCode(parseInt(hex, 16))\n i += 2\n break\n }\n case 'u': {\n if (i + 1 < source.length && source[i + 1] === '{') {\n const closeBrace = source.indexOf('}', i + 2)\n if (closeBrace === -1) {\n throw new ExpressionError('Invalid \\\\u{} escape: missing closing brace', { source, start, end: source.length })\n }\n const hex = source.slice(i + 2, closeBrace)\n if (hex.length === 0) {\n throw new ExpressionError('Invalid \\\\u{} escape: empty code point', { source, start, end: closeBrace + 1 })\n }\n for (const c of hex) {\n if (!isHexDigit(c)) {\n throw new ExpressionError(`Invalid \\\\u{} escape: non-hex digit \"${c}\"`, { source, start, end: closeBrace + 1 })\n }\n }\n const MAX_UNICODE_CODE_POINT = 0x10FFFF\n const codePoint = parseInt(hex, 16)\n if (codePoint > MAX_UNICODE_CODE_POINT) {\n throw new ExpressionError('Invalid \\\\u{} escape: code point out of range', { source, start, end: closeBrace + 1 })\n }\n value += String.fromCodePoint(codePoint)\n i = closeBrace\n } else {\n const UNICODE_ESCAPE_LEN = 4\n const hex = source.slice(i + 1, i + 1 + UNICODE_ESCAPE_LEN)\n if (hex.length < UNICODE_ESCAPE_LEN) {\n throw new ExpressionError('Invalid \\\\u escape: expected 4 hex digits', { source, start, end: i + 1 + UNICODE_ESCAPE_LEN })\n }\n for (const c of hex) {\n if (!isHexDigit(c)) {\n throw new ExpressionError('Invalid \\\\u escape: expected 4 hex digits', { source, start, end: i + 1 + UNICODE_ESCAPE_LEN })\n }\n }\n value += String.fromCharCode(parseInt(hex, 16))\n i += UNICODE_ESCAPE_LEN\n }\n break\n }\n default: value += escaped; break\n }\n } else {\n value += source[i]\n }\n i++\n }\n if (i >= source.length) {\n throw new ExpressionError('Unterminated string', { source, start, end: i })\n }\n i++ // skip closing quote\n tokens.push({ type: 'String', value, start, end: i })\n continue\n }\n\n // Template literals\n if (ch === '`') {\n const start = i\n i++ // skip opening backtick\n let raw = '`'\n while (i < source.length && source[i] !== '`') {\n if (source[i] === '$' && i + 1 < source.length && source[i + 1] === '{') {\n raw += '${'\n i += 2\n let depth = 1\n while (i < source.length && depth > 0) {\n const ic = source[i]\n // Skip string literals inside interpolations\n if (ic === '\"' || ic === \"'\") {\n raw += ic\n i++\n while (i < source.length && source[i] !== ic) {\n if (source[i] === '\\\\' && i + 1 < source.length) {\n raw += source[i] + source[i + 1]\n i += 2\n continue\n }\n raw += source[i]\n i++\n }\n if (i < source.length) {\n raw += source[i] // closing quote\n i++\n }\n continue\n }\n if (ic === '{') depth++\n else if (ic === '}') depth--\n if (depth > 0) raw += ic\n i++\n }\n raw += '}'\n } else {\n raw += source[i]\n i++\n }\n }\n if (i >= source.length) {\n throw new ExpressionError('Unterminated template literal', { source, start, end: i })\n }\n raw += '`'\n i++ // skip closing backtick\n tokens.push({ type: 'TemplateLiteral', value: raw, start, end: i })\n continue\n }\n\n // Identifiers and keywords\n if (isAlpha(ch)) {\n const start = i\n while (i < source.length && isAlphaNumeric(source[i])) i++\n const value = source.slice(start, i)\n const kw = KEYWORDS.get(value)\n if (kw) {\n tokens.push({ type: kw.type, value: kw.value, start, end: i } as Token)\n } else {\n tokens.push({ type: 'Identifier', value, start, end: i })\n }\n continue\n }\n\n // Multi-character operators and punctuation\n const start = i\n\n // Spread operator ...\n if (ch === '.' && i + 2 < source.length && source[i + 1] === '.' && source[i + 2] === '.') {\n tokens.push({ type: 'Spread', value: '...', start, end: i + 3 })\n i += 3\n continue\n }\n\n // Dot (punctuation)\n if (ch === '.') {\n tokens.push({ type: 'Punctuation', value: '.', start, end: i + 1 })\n i++\n continue\n }\n\n // Pipe |> or logical ||\n if (ch === '|') {\n if (i + 1 < source.length && source[i + 1] === '>') {\n tokens.push({ type: 'Pipe', value: '|>', start, end: i + 2 })\n i += 2\n continue\n }\n if (i + 1 < source.length && source[i + 1] === '|') {\n tokens.push({ type: 'Operator', value: '||', start, end: i + 2 })\n i += 2\n continue\n }\n }\n\n // &&\n if (ch === '&' && i + 1 < source.length && source[i + 1] === '&') {\n tokens.push({ type: 'Operator', value: '&&', start, end: i + 2 })\n i += 2\n continue\n }\n\n // == !=\n if (ch === '=' && i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '==', start, end: i + 2 })\n i += 2\n continue\n }\n if (ch === '!' && i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '!=', start, end: i + 2 })\n i += 2\n continue\n }\n\n // ! (logical not) - must come after != check\n if (ch === '!') {\n tokens.push({ type: 'Operator', value: '!', start, end: i + 1 })\n i++\n continue\n }\n\n // <= >= < >\n if (ch === '<') {\n if (i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '<=', start, end: i + 2 })\n i += 2\n continue\n }\n tokens.push({ type: 'Operator', value: '<', start, end: i + 1 })\n i++\n continue\n }\n if (ch === '>') {\n if (i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '>=', start, end: i + 2 })\n i += 2\n continue\n }\n tokens.push({ type: 'Operator', value: '>', start, end: i + 1 })\n i++\n continue\n }\n\n // ** (exponentiation) — must come before single *\n if (ch === '*' && i + 1 < source.length && source[i + 1] === '*') {\n tokens.push({ type: 'Operator', value: '**', start, end: i + 2 })\n i += 2\n continue\n }\n\n // ?. (optional chaining) or ?? (nullish coalescing) or ? (ternary)\n if (ch === '?') {\n if (i + 1 < source.length && source[i + 1] === '.') {\n tokens.push({ type: 'OptionalChain', value: '?.', start, end: i + 2 })\n i += 2\n continue\n }\n if (i + 1 < source.length && source[i + 1] === '?') {\n tokens.push({ type: 'NullishCoalescing', value: '??', start, end: i + 2 })\n i += 2\n continue\n }\n tokens.push({ type: 'Punctuation', value: '?', start, end: i + 1 })\n i++\n continue\n }\n\n // Single-character operators\n if (ch === '+' || ch === '-' || ch === '*' || ch === '/' || ch === '%') {\n tokens.push({ type: 'Operator', value: ch, start, end: i + 1 })\n i++\n continue\n }\n\n // Punctuation\n if ('()[]{},:'.includes(ch)) {\n tokens.push({ type: 'Punctuation', value: ch as PunctuationValue, start, end: i + 1 })\n i++\n continue\n }\n\n throw new ExpressionError(`Unexpected character \"${ch}\"`, { source, start, end: i + 1 })\n }\n\n tokens.push({ type: 'EOF', value: '', start: i, end: i })\n return tokens\n}\n","import type {\n ASTNode,\n BinaryExpressionOperator,\n ObjectProperty,\n OperatorValue,\n Token,\n} from './types.js'\nimport { tokenize } from './lexer.js'\nimport { ExpressionError } from './errors.js'\n\n// Precedence levels (binding power) for Pratt parsing\nconst PIPE_PRECEDENCE = 5\n\nconst PRECEDENCE: Readonly<Record<OperatorValue | '??', number | undefined>> = {\n '||': 10,\n '&&': 20,\n '??': 25,\n '==': 30,\n '!=': 30,\n '<': 40,\n '>': 40,\n '<=': 40,\n '>=': 40,\n 'in': 40,\n '+': 50,\n '-': 50,\n '*': 60,\n '/': 60,\n '%': 60,\n '**': 70,\n // Unary-only operators have no binary precedence\n '!': undefined,\n 'not': undefined,\n}\n\nconst MAX_PARSE_DEPTH = 32\n\nexport function parse(source: string, _depth = 0): ASTNode {\n if (_depth > MAX_PARSE_DEPTH) {\n throw new ExpressionError(\n 'Maximum template nesting depth exceeded',\n { source, start: 0, end: source.length },\n )\n }\n const tokens = tokenize(source)\n let pos = 0\n\n function current(): Token {\n return tokens[pos]\n }\n\n function advance(): Token {\n return tokens[pos++]\n }\n\n function expect(type: string, value?: string): Token {\n const tok = current()\n if (tok.type !== type || (value !== undefined && tok.value !== value)) {\n throw new ExpressionError(\n `Expected ${value ? `\"${value}\"` : type} but got ${tok.value ? `\"${tok.value}\"` : tok.type}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n return advance()\n }\n\n function parseExpression(minPrec = 0): ASTNode {\n let left = parseUnary()\n\n // Ternary — lowest precedence, handled before binary ops\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n return left\n }\n\n // Pipe expressions — very low precedence\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance() // skip '|>'\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n // Binary operators via Pratt parsing\n while (true) {\n const tok = current()\n let prec: number | undefined\n\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n // Handle 'not in' as a combined operator\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n if (prec === undefined || prec < minPrec) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n // Right-associative for **\n const nextMinPrec = opValue === '**' ? prec : prec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n\n // Ternary after binary (for cases like `a > 5 ? b : c`)\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n }\n\n // Pipe after binary/ternary\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance()\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n return left\n }\n\n function parsePipeTransform(): ASTNode {\n let node = parsePrimary()\n\n // Allow transform to be a call expression: `upper` or `default(\"N/A\")`\n if (current().type === 'Punctuation' && current().value === '(') {\n advance() // skip '('\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n }\n\n return node\n }\n\n function parseUnary(): ASTNode {\n const tok = current()\n\n if (tok.type === 'Operator' && (tok.value === '!' || tok.value === '-' || tok.value === '+')) {\n advance()\n const operand = parseUnary()\n return {\n type: 'UnaryExpression',\n operator: tok.value,\n operand,\n start: tok.start,\n end: operand.end,\n }\n }\n\n return parsePostfix()\n }\n\n function parsePostfix(): ASTNode {\n let node = parsePrimary()\n\n while (true) {\n const tok = current()\n\n // Dot notation: obj.prop\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const prop = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Bracket notation: obj[expr]\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n\n // Optional chaining: obj?.prop or obj?.[expr]\n if (tok.type === 'OptionalChain') {\n advance()\n // obj?.[expr] — computed optional\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n // obj?.prop — regular optional\n const prop = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Function call: fn(args)\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n\n break\n }\n\n return node\n }\n\n function parsePrimary(): ASTNode {\n const tok = current()\n\n // Number\n if (tok.type === 'Number') {\n advance()\n const raw = tok.value.replace(/_/g, '')\n return { type: 'NumberLiteral', value: Number(raw), start: tok.start, end: tok.end }\n }\n\n // String\n if (tok.type === 'String') {\n advance()\n return { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n }\n\n // Boolean\n if (tok.type === 'Boolean') {\n advance()\n return { type: 'BooleanLiteral', value: tok.value === 'true', start: tok.start, end: tok.end }\n }\n\n // Null\n if (tok.type === 'Null') {\n advance()\n return { type: 'NullLiteral', value: null, start: tok.start, end: tok.end }\n }\n\n // Undefined\n if (tok.type === 'Undefined') {\n advance()\n return { type: 'UndefinedLiteral', value: undefined, start: tok.start, end: tok.end }\n }\n\n // Template literal\n if (tok.type === 'TemplateLiteral') {\n return parseTemplateLiteral()\n }\n\n // Identifier\n if (tok.type === 'Identifier') {\n advance()\n return { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n }\n\n // Parenthesized expression\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const expr = parseExpression(0)\n expect('Punctuation', ')')\n return expr\n }\n\n // Array literal\n if (tok.type === 'Punctuation' && tok.value === '[') {\n return parseArrayLiteral()\n }\n\n // Object literal\n if (tok.type === 'Punctuation' && tok.value === '{') {\n return parseObjectLiteral()\n }\n\n // Lambda: .property or .property >= value (compound predicate)\n if (tok.type === 'Punctuation' && tok.value === '.') {\n return parseLambdaExpression()\n }\n\n // Spread element\n if (tok.type === 'Spread') {\n advance()\n const argument = parseExpression(0)\n return { type: 'SpreadElement', argument, start: tok.start, end: argument.end }\n }\n\n throw new ExpressionError(\n `Unexpected ${tok.type === 'EOF' ? 'end of expression' : `token \"${tok.value}\"`}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n function parseLambdaExpression(): ASTNode {\n // We're at the `.` token\n const start = current().start\n advance() // skip the `.`\n\n // Bare `.` as identity lambda (e.g., `. > 2`, `. == \"x\"`)\n // Must be followed by an operator to form a compound predicate.\n let node: ASTNode\n if (current().type !== 'Identifier') {\n if (current().type !== 'Operator' && current().type !== 'NullishCoalescing') {\n throw new ExpressionError(\n `Expected property name or operator after \".\"`,\n { source, start, end: start + 1 },\n )\n }\n node = { type: 'LambdaIdentity', start, end: start + 1 }\n } else {\n const prop = expect('Identifier')\n node = {\n type: 'LambdaAccessor',\n property: prop.value,\n start,\n end: prop.end,\n }\n }\n\n // Continue with postfix operations (member access, optional chaining, calls)\n while (true) {\n const tok = current()\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'OptionalChain') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n break\n }\n\n // Check for binary operator to form compound predicate\n const tok = current()\n let prec: number | undefined\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n // If followed by an operator, this is a compound lambda like `.age >= 18`\n if (prec !== undefined) {\n let left: ASTNode = node\n while (true) {\n const opTok = current()\n let opPrec: number | undefined\n if (opTok.type === 'Operator') {\n opPrec = PRECEDENCE[opTok.value]\n if (opTok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n opPrec = PRECEDENCE['in']\n }\n }\n } else if (opTok.type === 'NullishCoalescing') {\n opPrec = PRECEDENCE['??']\n }\n if (opPrec === undefined) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n const nextMinPrec = opValue === '**' ? opPrec : opPrec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n node = left\n }\n\n // Check for ternary — compound lambda with conditional\n if (current().type === 'Punctuation' && current().value === '?') {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n const body: ASTNode = {\n type: 'ConditionalExpression',\n test: node,\n consequent,\n alternate,\n start,\n end: alternate.end,\n }\n return {\n type: 'LambdaExpression',\n body,\n start,\n end: alternate.end,\n }\n }\n\n // If node is just a LambdaAccessor or LambdaIdentity, keep it as-is\n if (node.type === 'LambdaAccessor' || node.type === 'LambdaIdentity') {\n return node\n }\n\n // It has member access / calls / binary ops — wrap in LambdaExpression\n return {\n type: 'LambdaExpression',\n body: node,\n start,\n end: node.end,\n }\n }\n\n function parseArrayLiteral(): ASTNode {\n const start = expect('Punctuation', '[').start\n const elements: ASTNode[] = []\n\n while (!(current().type === 'Punctuation' && current().value === ']')) {\n if (elements.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ']') break\n elements.push(parseExpression(0))\n }\n\n const end = expect('Punctuation', ']').end\n return { type: 'ArrayLiteral', elements, start, end }\n }\n\n function parseObjectLiteral(): ASTNode {\n const start = expect('Punctuation', '{').start\n const properties: ObjectProperty[] = []\n\n while (!(current().type === 'Punctuation' && current().value === '}')) {\n if (properties.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === '}') break\n\n let key: ASTNode\n let computed = false\n\n // Computed property: [expr]\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n key = parseExpression(0)\n expect('Punctuation', ']')\n computed = true\n } else {\n // Identifier or string key\n const tok = current()\n if (tok.type === 'Identifier') {\n advance()\n key = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n\n // Shorthand: { name } → { name: name }\n const next = current()\n if (next.type === 'Punctuation' && (next.value === ',' || next.value === '}')) {\n const value: ASTNode = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed: false,\n start: key.start,\n end: value.end,\n })\n continue\n }\n } else if (tok.type === 'String') {\n advance()\n key = { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n } else {\n throw new ExpressionError(\n `Expected property name but got \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n }\n\n expect('Punctuation', ':')\n const value = parseExpression(0)\n\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed,\n start: key.start,\n end: value.end,\n })\n }\n\n const end = expect('Punctuation', '}').end\n return { type: 'ObjectLiteral', properties, start, end }\n }\n\n function parseTemplateLiteral(): ASTNode {\n const tok = advance() // consume TemplateLiteral token\n const raw = tok.value.slice(1, -1) // remove backticks\n const parts: ASTNode[] = []\n let i = 0\n let textStart = 0\n\n while (i < raw.length) {\n if (raw[i] === '$' && i + 1 < raw.length && raw[i + 1] === '{') {\n // Add text before interpolation\n if (i > textStart) {\n const text = raw.slice(textStart, i)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n // Find matching }\n i += 2\n let depth = 1\n const exprStart = i\n while (i < raw.length && depth > 0) {\n if (raw[i] === '{') depth++\n else if (raw[i] === '}') depth--\n if (depth > 0) i++\n }\n const exprSource = raw.slice(exprStart, i)\n i++ // skip closing }\n textStart = i\n // Parse the interpolated expression\n const exprAst = parse(exprSource, _depth + 1)\n parts.push(exprAst)\n } else {\n i++\n }\n }\n\n // Remaining text\n if (textStart < raw.length) {\n const text = raw.slice(textStart)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n\n return { type: 'TemplateLiteral', parts, start: tok.start, end: tok.end }\n }\n\n const result = parseExpression(0)\n\n if (current().type !== 'EOF') {\n const tok = current()\n throw new ExpressionError(\n `Unexpected token \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n return result\n}\n","import type { ASTNode, BinaryExpressionOperator } from './types.js'\n\nexport function compile(ast: ASTNode): ASTNode {\n return optimize(ast)\n}\n\nfunction optimize(node: ASTNode): ASTNode {\n switch (node.type) {\n case 'BinaryExpression': {\n const left = optimize(node.left)\n const right = optimize(node.right)\n\n // Constant folding\n if (isConstant(left) && isConstant(right)) {\n const result = evalConstant(node.operator, valueOf(left), valueOf(right))\n if (result !== undefined) {\n return makeConstant(result, node.start, node.end)\n }\n }\n\n return { ...node, left, right }\n }\n\n case 'ConditionalExpression': {\n const test = optimize(node.test)\n\n // Dead branch elimination\n if (isConstant(test)) {\n const value = valueOf(test)\n return value ? optimize(node.consequent) : optimize(node.alternate)\n }\n\n return {\n ...node,\n test,\n consequent: optimize(node.consequent),\n alternate: optimize(node.alternate),\n }\n }\n\n case 'UnaryExpression': {\n const operand = optimize(node.operand)\n if (isConstant(operand)) {\n const val = valueOf(operand)\n if (node.operator === '!' && typeof val === 'boolean') {\n return { type: 'BooleanLiteral', value: !val, start: node.start, end: node.end }\n }\n if (node.operator === '-' && typeof val === 'number') {\n return { type: 'NumberLiteral', value: -val, start: node.start, end: node.end }\n }\n }\n return { ...node, operand }\n }\n\n case 'PipeExpression':\n return { ...node, input: optimize(node.input), transform: optimize(node.transform) }\n\n case 'ArrayLiteral':\n return { ...node, elements: node.elements.map(e => optimize(e)) }\n\n case 'CallExpression':\n return { ...node, args: node.args.map(a => optimize(a)) }\n\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n return { ...node, object: optimize(node.object), property: node.computed ? optimize(node.property) : node.property }\n\n case 'LambdaExpression':\n return { ...node, body: optimize(node.body) }\n\n default:\n return node\n }\n}\n\nfunction isConstant(node: ASTNode): boolean {\n return node.type === 'NumberLiteral'\n || node.type === 'StringLiteral'\n || node.type === 'BooleanLiteral'\n || node.type === 'NullLiteral'\n}\n\nfunction valueOf(node: ASTNode): unknown {\n if (node.type === 'NumberLiteral') return node.value\n if (node.type === 'StringLiteral') return node.value\n if (node.type === 'BooleanLiteral') return node.value\n if (node.type === 'NullLiteral') return null\n return undefined\n}\n\nfunction evalConstant(op: BinaryExpressionOperator, left: unknown, right: unknown): unknown | undefined {\n if (typeof left === 'number' && typeof right === 'number') {\n switch (op) {\n case '+': return left + right\n case '-': return left - right\n case '*': return left * right\n case '/': return left / right\n case '%': return left % right\n case '**': return left ** right\n case '<': return left < right\n case '>': return left > right\n case '<=': return left <= right\n case '>=': return left >= right\n case '==': return left === right\n case '!=': return left !== right\n }\n }\n if (typeof left === 'string' && typeof right === 'string' && op === '+') {\n return left + right\n }\n if (typeof left === 'boolean' && typeof right === 'boolean') {\n if (op === '&&') return left && right\n if (op === '||') return left || right\n }\n if (op === '==') return left === right\n if (op === '!=') return left !== right\n return undefined\n}\n\nfunction makeConstant(value: unknown, start: number, end: number): ASTNode {\n if (typeof value === 'number') return { type: 'NumberLiteral', value, start, end }\n if (typeof value === 'string') return { type: 'StringLiteral', value, start, end }\n if (typeof value === 'boolean') return { type: 'BooleanLiteral', value, start, end }\n if (value === null) return { type: 'NullLiteral', value: null, start, end }\n return { type: 'UndefinedLiteral', value: undefined, start, end }\n}\n","import { suggest, BonsaiReferenceError, BonsaiSecurityError, BonsaiTypeError } from './errors.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport type {\n ASTNode,\n BinaryExpressionOperator,\n TransformFn,\n FunctionFn,\n UnaryOperator,\n} from './types.js'\n\ntype SafeMethod = (...args: unknown[]) => unknown\n\n/** Receiver type check for safe methods. */\nfunction isAllowedReceiver(obj: unknown, methodName: string): boolean {\n const t = typeof obj\n switch (methodName) {\n // String-only\n case 'startsWith': case 'endsWith': case 'substring':\n case 'charAt': case 'charCodeAt': case 'repeat':\n case 'trimStart': case 'trimEnd':\n case 'replace': case 'replaceAll':\n return t === 'string'\n // String + Array\n case 'includes': case 'indexOf': case 'slice': case 'at':\n return t === 'string' || Array.isArray(obj)\n // Array-only (higher-order)\n case 'filter': case 'map': case 'find': case 'some': case 'every':\n return Array.isArray(obj)\n // Number\n case 'toFixed':\n return t === 'number'\n // Number + String\n case 'toString':\n return t === 'string' || t === 'number'\n default:\n return false\n }\n}\n\nexport function toPropertyKey(value: unknown): string {\n return String(value)\n}\n\nexport function applyBinaryOp(operator: BinaryExpressionOperator, left: unknown, right: unknown): unknown {\n switch (operator) {\n case '+': return (left as number) + (right as number)\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (left as number) / (right as number)\n case '%': return (left as number) % (right as number)\n case '**': return (left as number) ** (right as number)\n case '==': return left === right\n case '!=': return left !== right\n case '<': return (left as number) < (right as number)\n case '>': return (left as number) > (right as number)\n case '<=': return (left as number) <= (right as number)\n case '>=': return (left as number) >= (right as number)\n case 'in': {\n if (typeof right === 'string') return (right as string).includes(left as string)\n if (Array.isArray(right)) return right.includes(left)\n throw new BonsaiTypeError('in', 'a string or array', right)\n }\n case 'not in': {\n if (typeof right === 'string') return !(right as string).includes(left as string)\n if (Array.isArray(right)) return !right.includes(left)\n throw new BonsaiTypeError('not in', 'a string or array', right)\n }\n default: throw new Error(`Unknown binary operator: ${operator}`)\n }\n}\n\nexport function applyUnaryOp(operator: UnaryOperator, operand: unknown): unknown {\n switch (operator) {\n case '!': return !operand\n case '-': return -(operand as number)\n case '+': return Number(operand)\n default: throw new Error(`Unknown unary operator: ${operator}`)\n }\n}\n\nexport function validateMethodCall(\n obj: unknown,\n methodName: string,\n guard: ExecutionContext,\n): SafeMethod {\n guard.checkNameAccess(methodName, 'method')\n if (obj == null) throw new BonsaiTypeError(methodName, 'a non-null value', obj)\n if (!isAllowedReceiver(obj, methodName)) {\n throw new BonsaiSecurityError(\n 'METHOD_NOT_ALLOWED',\n `Method \"${methodName}\" is not allowed on ${typeof obj}`,\n )\n }\n const method = (obj as Record<string, unknown>)[methodName]\n if (typeof method !== 'function') throw new BonsaiTypeError(methodName, 'a method', method)\n return method as SafeMethod\n}\n\nexport function resolveTransform(name: string, transforms: Record<string, TransformFn>): TransformFn {\n if (!Object.hasOwn(transforms, name)) {\n const suggestion = suggest(name, Object.keys(transforms))\n throw new BonsaiReferenceError('transform', name, suggestion)\n }\n return transforms[name]\n}\n\nexport function resolveFunction(name: string, functions: Record<string, FunctionFn>): FunctionFn {\n if (!Object.hasOwn(functions, name)) {\n const suggestion = suggest(name, Object.keys(functions))\n throw new BonsaiReferenceError('function', name, suggestion)\n }\n return functions[name]\n}\n\nexport function getIdentifierName(node: ASTNode, message = 'Expected identifier'): string {\n if (node.type !== 'Identifier') {\n throw new Error(message)\n }\n return node.name\n}\n\nexport function getObjectLiteralKeyName(node: ASTNode, message = 'Expected identifier or string literal'): string {\n if (node.type === 'Identifier' || node.type === 'StringLiteral') {\n return node.type === 'Identifier' ? node.name : node.value\n }\n throw new Error(message)\n}\n\nexport function expandSpreadValue(value: unknown, maxLength?: number): unknown[] {\n if (Array.isArray(value)) {\n if (maxLength !== undefined && value.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread source length (${value.length}) exceeds maximum (${maxLength})`,\n )\n }\n return value\n }\n if (value != null) {\n const iterator = (value as { [Symbol.iterator]?: unknown })[Symbol.iterator]\n if (typeof iterator === 'function') {\n const result: unknown[] = []\n for (const item of value as Iterable<unknown>) {\n result.push(item)\n if (maxLength !== undefined && result.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread exceeds maximum array length (${maxLength})`,\n )\n }\n }\n return result\n }\n }\n throw new BonsaiTypeError('spread', 'an iterable value', value)\n}\n\nconst REPLACE_METHODS = new Set(['replace', 'replaceAll'])\nconst MAX_REPEAT_COUNT = 100_000\n\nexport function validateMethodArgs(methodName: string, args: unknown[]): void {\n if (REPLACE_METHODS.has(methodName)) {\n for (const arg of args) {\n if (typeof arg === 'function') {\n throw new BonsaiTypeError(methodName, 'string arguments (callbacks are not allowed)', arg)\n }\n if (arg instanceof RegExp) {\n throw new BonsaiTypeError(methodName, 'string arguments (RegExp is not allowed)', arg)\n }\n if (arg != null && typeof arg === 'object') {\n throw new BonsaiTypeError(methodName, 'string arguments (objects are not allowed)', arg)\n }\n }\n }\n if (methodName === 'repeat') {\n const count = Number(args[0])\n if (!Number.isFinite(count) || count < 0 || count > MAX_REPEAT_COUNT) {\n throw new BonsaiTypeError('repeat', `a count between 0 and ${MAX_REPEAT_COUNT}`, args[0])\n }\n }\n}\n\nexport function accessMember(\n object: unknown,\n propertyNode: ASTNode,\n computed: boolean,\n computedValue: unknown,\n guard: ExecutionContext,\n): unknown {\n const key = computed ? toPropertyKey(computedValue) : getIdentifierName(propertyNode, 'Expected identifier property')\n guard.checkNameAccess(key, 'member')\n return (object as Record<string, unknown>)?.[key]\n}\n","import type { ASTNode, FunctionFn, ObjectProperty, TransformFn } from './types.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation, BonsaiTypeError } from './errors.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveFunction,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\nfunction rejectPromise(value: unknown, kind: 'function' | 'method' | 'transform', name: string): unknown {\n if (value instanceof Promise) {\n throw new BonsaiTypeError(\n name,\n `a synchronous ${kind} result — use evaluate() instead of evaluateSync() for async`,\n value,\n )\n }\n return value\n}\n\nexport interface EvalEnv {\n ctx: Record<string, unknown>\n tr: Record<string, TransformFn>\n fn: Record<string, FunctionFn>\n g: ExecutionContext\n s?: string\n}\n\nexport function evaluate(\n node: ASTNode,\n context: Record<string, unknown>,\n transforms: Record<string, TransformFn>,\n functions: Record<string, FunctionFn>,\n guard: ExecutionContext,\n source?: string,\n): unknown {\n return evalNode(node, { ctx: context, tr: transforms, fn: functions, g: guard, s: source })\n}\n\nfunction evalNode(node: ASTNode, env: EvalEnv): unknown {\n const { ctx, g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n\n case 'NullLiteral':\n return null\n\n case 'UndefinedLiteral':\n return undefined\n\n case 'Identifier':\n g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(ctx, node.name) ? ctx[node.name] : undefined\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalNode(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalNode(node.left, env)\n return left ? evalNode(node.right, env) : left\n }\n if (op === '||') {\n const left = evalNode(node.left, env)\n return left ? left : evalNode(node.right, env)\n }\n if (op === '??') {\n const left = evalNode(node.left, env)\n return left != null ? left : evalNode(node.right, env)\n }\n return applyBinaryOp(op, evalNode(node.left, env), evalNode(node.right, env))\n }\n\n case 'ConditionalExpression':\n return evalNode(node.test, env) ? evalNode(node.consequent, env) : evalNode(node.alternate, env)\n\n case 'MemberExpression': {\n const object = evalNode(node.object, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = evalNode(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(evalNode(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(evalNode(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = getObjectPropertyKey(prop, env)\n obj[key] = evalNode(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return evalCallExpression(node, env)\n\n case 'PipeExpression': {\n const input = evalNode(node.input, env)\n try {\n return evalPipe(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(evalNode(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return evalNode(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBody(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nfunction evalCallExpression(node: Extract<ASTNode, { type: 'CallExpression' }>, env: EvalEnv): unknown {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalNode(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const func = resolveFunction(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(...args), 'function', node.callee.name)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nfunction pushCallArgument(args: unknown[], node: ASTNode, env: EvalEnv): void {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(evalArg(node, env))\n}\n\nfunction evalArg(node: ASTNode, env: EvalEnv): unknown {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return evalNode(node, env)\n}\n\nfunction evalPipe(input: unknown, transformNode: ASTNode, env: EvalEnv): unknown {\n const { tr } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(input, ...args), 'transform', calleeName)\n }\n\n if (transformNode.type === 'Identifier') {\n return rejectPromise(resolveTransform(transformNode.name, tr)(input), 'transform', transformNode.name)\n }\n\n throw new Error('Invalid transform expression')\n}\n\nexport function evaluateLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n return evalLambdaBody(node, item, env)\n}\n\nfunction evalLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalLambdaBody(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(evalArg(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n }\n // Delegate to evalNode for non-method calls (e.g. registered functions)\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? evalLambdaBody(node.right, item, env) : left\n }\n if (op === '||') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? left : evalLambdaBody(node.right, item, env)\n }\n if (op === '??') {\n const left = evalLambdaBody(node.left, item, env)\n return left != null ? left : evalLambdaBody(node.right, item, env)\n }\n return applyBinaryOp(op, evalLambdaBody(node.left, item, env), evalLambdaBody(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalLambdaBody(node.operand, item, env))\n\n case 'ConditionalExpression':\n return evalLambdaBody(node.test, item, env)\n ? evalLambdaBody(node.consequent, item, env)\n : evalLambdaBody(node.alternate, item, env)\n\n case 'LambdaExpression':\n return evalLambdaBody(node.body, item, env)\n\n default:\n // Delegate to evalNode which manages its own depth\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nfunction getObjectPropertyKey(prop: ObjectProperty, env: EvalEnv): string {\n const key = prop.computed ? String(evalNode(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","import type { ASTNode, FunctionFn, ObjectProperty, TransformFn } from './types.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation } from './errors.js'\nimport { type EvalEnv } from './evaluator.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveFunction,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\ntype AsyncEvalEnv = EvalEnv\n\nexport async function evaluateAsync(\n node: ASTNode,\n context: Record<string, unknown>,\n transforms: Record<string, TransformFn>,\n functions: Record<string, FunctionFn>,\n guard: ExecutionContext,\n source?: string,\n): Promise<unknown> {\n const env: AsyncEvalEnv = { ctx: context, tr: transforms, fn: functions, g: guard, s: source }\n const result = await evalNodeAsync(node, env)\n guard.checkTimeout()\n return result\n}\n\nasync function evalNodeAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { ctx, g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n\n case 'NullLiteral':\n return null\n\n case 'UndefinedLiteral':\n return undefined\n\n case 'Identifier':\n g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(ctx, node.name) ? ctx[node.name] : undefined\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalNodeAsync(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalNodeAsync(node.left, env)\n return left ? await evalNodeAsync(node.right, env) : left\n }\n if (op === '||') {\n const left = await evalNodeAsync(node.left, env)\n return left ? left : await evalNodeAsync(node.right, env)\n }\n if (op === '??') {\n const left = await evalNodeAsync(node.left, env)\n return left != null ? left : await evalNodeAsync(node.right, env)\n }\n return applyBinaryOp(op, await evalNodeAsync(node.left, env), await evalNodeAsync(node.right, env))\n }\n\n case 'ConditionalExpression':\n return await evalNodeAsync(node.test, env)\n ? await evalNodeAsync(node.consequent, env)\n : await evalNodeAsync(node.alternate, env)\n\n case 'MemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(await evalNodeAsync(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(await evalNodeAsync(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = await getObjectPropertyKey(prop, env)\n obj[key] = await evalNodeAsync(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return await evalCallExpressionAsync(node, env)\n\n case 'PipeExpression': {\n const input = await evalNodeAsync(node.input, env)\n try {\n return await evalPipeAsync(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(await evalNodeAsync(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return await evalNodeAsync(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBodyAsync(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nasync function evalCallExpressionAsync(\n node: Extract<ASTNode, { type: 'CallExpression' }>,\n env: AsyncEvalEnv,\n): Promise<unknown> {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalNodeAsync(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n\n // Higher-order array methods need async-aware iteration\n // because lambda callbacks may return Promises, which native\n // Array methods can't handle (Promises are always truthy).\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const arr = obj\n const predicate = args[0] as (item: unknown) => unknown\n const asyncResult = await evalAsyncArrayMethod(methodName, arr, predicate)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n const result = await method.call(obj, ...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const func = resolveFunction(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nasync function pushCallArgumentAsync(args: unknown[], node: ASTNode, env: AsyncEvalEnv): Promise<void> {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(await evalArgAsync(node, env))\n}\n\n// Async-safe higher-order array method evaluation. Native JS array methods\n// call predicates synchronously, but our lambdas may return Promises.\n// Returns { value } if handled, undefined if the method isn't higher-order.\nasync function evalAsyncArrayMethod(\n methodName: string,\n arr: unknown[],\n predicate: (item: unknown) => unknown,\n): Promise<{ value: unknown } | undefined> {\n switch (methodName) {\n case 'filter': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: arr.filter((_, i) => resolved[i]) }\n }\n case 'map': {\n const results = arr.map(predicate)\n return { value: results.some(r => r instanceof Promise) ? await Promise.all(results) : results }\n }\n case 'find': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n const idx = resolved.findIndex(Boolean)\n return { value: idx >= 0 ? arr[idx] : undefined }\n }\n case 'some': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.some(Boolean) }\n }\n case 'every': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.every(Boolean) }\n }\n default:\n return undefined\n }\n}\n\nasync function evalArgAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return await evalNodeAsync(node, env)\n}\n\nasync function evalPipeAsync(input: unknown, transformNode: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { tr, g } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(input, ...args)\n g.checkTimeout()\n return result\n }\n\n if (transformNode.type === 'Identifier') {\n const result = await resolveTransform(transformNode.name, tr)(input)\n g.checkTimeout()\n return result\n }\n\n throw new Error('Invalid transform expression')\n}\n\nasync function evalLambdaBodyAsync(node: ASTNode, item: unknown, env: AsyncEvalEnv): Promise<unknown> {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalLambdaBodyAsync(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(await evalArgAsync(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n\n // Async-safe higher-order array method handling (same as top-level path)\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const asyncResult = await evalAsyncArrayMethod(methodName, obj, args[0] as (item: unknown) => unknown)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n return await method.call(obj, ...args)\n }\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? await evalLambdaBodyAsync(node.right, item, env) : left\n }\n if (op === '||') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n if (op === '??') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left != null ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n return applyBinaryOp(op, await evalLambdaBodyAsync(node.left, item, env), await evalLambdaBodyAsync(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalLambdaBodyAsync(node.operand, item, env))\n\n case 'ConditionalExpression':\n return await evalLambdaBodyAsync(node.test, item, env)\n ? await evalLambdaBodyAsync(node.consequent, item, env)\n : await evalLambdaBodyAsync(node.alternate, item, env)\n\n case 'LambdaExpression':\n return await evalLambdaBodyAsync(node.body, item, env)\n\n default:\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nasync function getObjectPropertyKey(prop: ObjectProperty, env: AsyncEvalEnv): Promise<string> {\n const key = prop.computed ? String(await evalNodeAsync(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","import type { BonsaiOptions } from './types.js'\nimport { BonsaiSecurityError } from './errors.js'\n\n/**\n * Discriminates how a property name is being accessed so security checks can\n * apply different rules (e.g. root identifiers bypass allow/deny lists).\n */\nexport type AccessKind = 'identifier' | 'member' | 'method' | 'object-key'\n\nexport const BLOCKED_PROPERTIES: ReadonlySet<string> = new Set([\n '__proto__', 'constructor', 'prototype',\n])\n\nconst MAX_INDEX_DIGITS = 10\n\nfunction isCanonicalIndex(key: string): boolean {\n if (key.length === 0 || key.length > MAX_INDEX_DIGITS) return false\n const n = Number(key)\n return Number.isInteger(n) && n >= 0 && String(n) === key\n}\n\nconst TIMEOUT_CHECK_INTERVAL = 1000\nconst DEFAULT_MAX_DEPTH = 100\nconst DEFAULT_MAX_ARRAY_LENGTH = 100_000\n\n/** Immutable per-instance security configuration derived from BonsaiOptions. */\nexport class SecurityPolicy {\n readonly maxDepth: number\n readonly maxArrayLength: number\n readonly timeout: number\n readonly allowedProperties?: ReadonlySet<string>\n readonly deniedProperties?: ReadonlySet<string>\n\n constructor(options: BonsaiOptions = {}) {\n this.maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH\n this.maxArrayLength = options.maxArrayLength ?? DEFAULT_MAX_ARRAY_LENGTH\n this.timeout = options.timeout ?? 0\n this.allowedProperties = options.allowedProperties\n ? new Set(options.allowedProperties)\n : undefined\n this.deniedProperties = options.deniedProperties\n ? new Set(options.deniedProperties)\n : undefined\n }\n}\n\n/** Mutable per-evaluation state: tracks depth, step count, and deadline for a single evaluation. */\nexport class ExecutionContext {\n private stepCount = 0\n private depth = 0\n private readonly deadline: number\n readonly policy: SecurityPolicy\n private readonly now: () => number\n\n constructor(policy: SecurityPolicy, now: () => number = Date.now) {\n this.policy = policy\n this.now = now\n this.deadline = policy.timeout ? now() + policy.timeout : 0\n }\n\n step(): void {\n if (this.deadline) {\n this.stepCount++\n if (this.stepCount % TIMEOUT_CHECK_INTERVAL === 0) {\n this.checkTimeout()\n }\n }\n }\n\n checkTimeout(): void {\n if (this.deadline && this.now() >= this.deadline) {\n throw new BonsaiSecurityError(\n 'TIMEOUT',\n `Expression timeout: exceeded ${this.policy.timeout}ms`,\n )\n }\n }\n\n enterDepth(): void {\n if (++this.depth > this.policy.maxDepth) {\n throw new BonsaiSecurityError(\n 'MAX_DEPTH',\n `Maximum expression depth (${this.policy.maxDepth}) exceeded`,\n )\n }\n }\n\n exitDepth(): void {\n this.depth--\n }\n\n withDepth<T>(fn: () => T): T {\n this.enterDepth()\n try {\n return fn()\n } finally {\n this.exitDepth()\n }\n }\n\n checkNameAccess(key: string, kind: AccessKind): void {\n if (BLOCKED_PROPERTIES.has(key)) {\n throw new BonsaiSecurityError(\n 'BLOCKED_PROPERTY',\n `Blocked: access to \"${key}\" is not allowed`,\n )\n }\n\n if (kind === 'identifier' || kind === 'object-key') return\n\n if (isCanonicalIndex(key)) return\n\n if (this.policy.allowedProperties) {\n if (!this.policy.allowedProperties.has(key)) {\n throw new BonsaiSecurityError(\n 'PROPERTY_NOT_ALLOWED',\n `Blocked: \"${key}\" is not in allowed properties`,\n )\n }\n }\n\n if (this.policy.deniedProperties) {\n if (this.policy.deniedProperties.has(key)) {\n throw new BonsaiSecurityError(\n 'PROPERTY_DENIED',\n `Blocked: \"${key}\" is in denied properties`,\n )\n }\n }\n }\n\n checkArrayLength(length: number): void {\n if (length > this.policy.maxArrayLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Array length (${length}) exceeds maximum (${this.policy.maxArrayLength})`,\n )\n }\n }\n}\n","export class LRUCache<K, V> {\n private readonly max: number\n private readonly map = new Map<K, V>()\n\n constructor(max: number) {\n this.max = max > 0 ? max : 0\n }\n\n get(key: K): V | undefined {\n if (!this.map.has(key)) return undefined\n const value = this.map.get(key) as V\n // Move to end (most recent)\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n\n set(key: K, value: V): void {\n if (this.max === 0) return\n\n if (this.map.has(key)) {\n this.map.delete(key)\n } else if (this.map.size >= this.max) {\n // Evict oldest (first key)\n const oldest = this.map.keys().next().value!\n this.map.delete(oldest)\n }\n this.map.set(key, value)\n }\n\n get size(): number {\n return this.map.size\n }\n\n clear(): void {\n this.map.clear()\n }\n}\n","import type { TransformFn, FunctionFn } from './types.js'\n\nexport interface PluginRegistry {\n addTransform(name: string, fn: TransformFn): void\n addFunction(name: string, fn: FunctionFn): void\n removeTransform(name: string): boolean\n removeFunction(name: string): boolean\n getTransform(name: string): TransformFn | undefined\n getFunction(name: string): FunctionFn | undefined\n getTransformNames(): string[]\n getFunctionNames(): string[]\n use(plugin: (registry: PluginRegistry) => void): void\n readonly transforms: Record<string, TransformFn>\n readonly functions: Record<string, FunctionFn>\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n const transformMap = new Map<string, TransformFn>()\n const functionMap = new Map<string, FunctionFn>()\n\n // Cached snapshots — rebuilt only when registry changes\n let transformsCache: Record<string, TransformFn> = {}\n let functionsCache: Record<string, FunctionFn> = {}\n let transformsDirty = false\n let functionsDirty = false\n\n const registry: PluginRegistry = {\n addTransform(name, fn) { transformMap.set(name, fn); transformsDirty = true },\n addFunction(name, fn) { functionMap.set(name, fn); functionsDirty = true },\n removeTransform(name) { const r = transformMap.delete(name); if (r) transformsDirty = true; return r },\n removeFunction(name) { const r = functionMap.delete(name); if (r) functionsDirty = true; return r },\n getTransform(name) { return transformMap.get(name) },\n getFunction(name) { return functionMap.get(name) },\n getTransformNames() { return [...transformMap.keys()] },\n getFunctionNames() { return [...functionMap.keys()] },\n use(plugin) { plugin(registry) },\n get transforms() {\n if (transformsDirty) {\n transformsCache = Object.fromEntries(transformMap)\n transformsDirty = false\n }\n return transformsCache\n },\n get functions() {\n if (functionsDirty) {\n functionsCache = Object.fromEntries(functionMap)\n functionsDirty = false\n }\n return functionsCache\n },\n }\n\n return registry\n}\n","import type {\n BonsaiOptions,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n TransformFn,\n FunctionFn,\n BonsaiPlugin,\n ASTNode,\n} from './types.js'\nimport { parse } from './parser.js'\nimport { compile } from './compiler.js'\nimport { evaluate } from './evaluator.js'\nimport { evaluateAsync } from './evaluator-async.js'\nimport { SecurityPolicy, ExecutionContext } from './execution-context.js'\nimport { LRUCache } from './cache.js'\nimport { createPluginRegistry } from './plugins.js'\nimport { ExpressionError, formatError, offsetToPosition } from './errors.js'\nimport { getIdentifierName } from './eval-ops.js'\n\nexport { ExpressionError, BonsaiTypeError, BonsaiSecurityError, BonsaiReferenceError, formatError, formatBonsaiError } from './errors.js'\nexport { tokenize } from './lexer.js'\nexport { parse } from './parser.js'\nexport { compile } from './compiler.js'\nexport type {\n ASTNode,\n Token,\n TokenType,\n BonsaiPlugin,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n BonsaiOptions,\n TransformFn,\n FunctionFn,\n} from './types.js'\n\nconst DEFAULT_CACHE_SIZE = 256\n\n// Shared instance for standalone one-off evaluation\nlet _shared: BonsaiInstance | undefined\n\n/**\n * Evaluate a single expression with default options. Uses a shared instance internally.\n * For repeated evaluation or custom configuration, use `bonsai()` to create a dedicated instance.\n */\nexport function evaluateExpression<T = unknown>(expression: string, context?: Record<string, unknown>): T {\n if (!_shared) _shared = bonsai()\n return _shared.evaluateSync<T>(expression, context)\n}\n\n/**\n * Create a new Bonsai instance with optional safety and caching configuration.\n * Register transforms and functions via `.use()`, `.addTransform()`, and `.addFunction()`.\n *\n * @example\n * ```ts\n * const expr = bonsai({ timeout: 50 })\n * expr.use(strings)\n * expr.evaluateSync('name |> trim |> upper', { name: ' hello ' }) // \"HELLO\"\n * ```\n */\nexport function bonsai(options: BonsaiOptions = {}): BonsaiInstance {\n const registry = createPluginRegistry()\n const cache = new LRUCache<string, CompiledExpression>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n const astCache = new LRUCache<string, ASTNode>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n\n const policy = new SecurityPolicy(options)\n\n function createExecutionContext(): ExecutionContext {\n return new ExecutionContext(policy)\n }\n\n function getAst(source: string): ASTNode {\n let ast = astCache.get(source)\n if (ast) return ast\n ast = compile(parse(source))\n astCache.set(source, ast)\n return ast\n }\n\n function compileExpr(source: string): CompiledExpression {\n const cached = cache.get(source)\n if (cached) return cached\n\n const optimized = getAst(source)\n\n const compiled: CompiledExpression = {\n ast: optimized,\n source,\n async evaluate<T = unknown>(context = {}) {\n return evaluateAsync(optimized, context, registry.transforms, registry.functions, createExecutionContext(), source) as Promise<T>\n },\n evaluateSync<T = unknown>(context = {}) {\n return evaluate(optimized, context, registry.transforms, registry.functions, createExecutionContext(), source) as T\n },\n }\n\n cache.set(source, compiled)\n return compiled\n }\n\n const instance: BonsaiInstance = {\n use(plugin) { plugin(instance); return instance },\n addTransform(name, fn) { registry.addTransform(name, fn); return instance },\n addFunction(name, fn) { registry.addFunction(name, fn); return instance },\n removeTransform(name) { return registry.removeTransform(name) },\n removeFunction(name) { return registry.removeFunction(name) },\n hasTransform(name) { return registry.getTransform(name) !== undefined },\n hasFunction(name) { return registry.getFunction(name) !== undefined },\n listTransforms() { return registry.getTransformNames() },\n listFunctions() { return registry.getFunctionNames() },\n clearCache() { cache.clear(); astCache.clear() },\n compile(expression) { return compileExpr(expression) },\n async evaluate<T = unknown>(expression: string, context = {}) {\n const ast = getAst(expression)\n return evaluateAsync(ast, context, registry.transforms, registry.functions, createExecutionContext(), expression) as Promise<T>\n },\n evaluateSync<T = unknown>(expression: string, context = {}) {\n // Hot path: skip CompiledExpression object creation, go straight to eval\n const ast = getAst(expression)\n return evaluate(ast, context, registry.transforms, registry.functions, createExecutionContext(), expression) as T\n },\n validate(expression) {\n try {\n const ast = parse(expression)\n return { valid: true, errors: [], ast, references: extractReferences(ast) }\n } catch (error: unknown) {\n let message: string\n if (error instanceof ExpressionError) {\n message = error.rawMessage\n } else if (error instanceof Error) {\n message = error.message\n } else {\n message = String(error)\n }\n const { start, end } = error instanceof ExpressionError ? error : { start: 0, end: 1 }\n const position = offsetToPosition(expression, start)\n return {\n valid: false,\n errors: [{\n message,\n position: { line: position.line, column: position.column },\n formatted: error instanceof ExpressionError\n ? error.message\n : formatError(message, { source: expression, start, end }),\n }],\n }\n }\n },\n }\n\n return instance\n}\n\nfunction extractReferences(node: ASTNode): ExpressionReferences {\n const identifiers = new Set<string>()\n const transforms = new Set<string>()\n const functions = new Set<string>()\n\n function walk(n: ASTNode): void {\n switch (n.type) {\n case 'Identifier':\n identifiers.add(n.name)\n break\n case 'PipeExpression':\n walk(n.input)\n if (n.transform.type === 'Identifier') {\n transforms.add(n.transform.name)\n } else if (n.transform.type === 'CallExpression') {\n if (n.transform.callee.type === 'Identifier') {\n transforms.add(getIdentifierName(n.transform.callee))\n }\n n.transform.args.forEach(walk)\n }\n break\n case 'CallExpression':\n if (n.callee.type === 'Identifier') {\n functions.add(n.callee.name)\n } else {\n walk(n.callee)\n }\n n.args.forEach(walk)\n break\n case 'BinaryExpression':\n walk(n.left)\n walk(n.right)\n break\n case 'UnaryExpression':\n walk(n.operand)\n break\n case 'ConditionalExpression':\n walk(n.test)\n walk(n.consequent)\n walk(n.alternate)\n break\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n walk(n.object)\n if (n.computed) walk(n.property)\n break\n case 'ArrayLiteral':\n n.elements.forEach(walk)\n break\n case 'ObjectLiteral':\n n.properties.forEach(p => { walk(p.key); walk(p.value) })\n break\n case 'TemplateLiteral':\n n.parts.forEach(walk)\n break\n case 'SpreadElement':\n walk(n.argument)\n break\n case 'LambdaExpression':\n walk(n.body)\n break\n }\n }\n\n walk(node)\n return {\n identifiers: [...identifiers],\n transforms: [...transforms],\n functions: [...functions],\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["getObjectPropertyKey","makeLambdaAccessor"],"sources":["../src/lexer.ts","../src/parser.ts","../src/compiler.ts","../src/eval-ops.ts","../src/evaluator.ts","../src/evaluator-async.ts","../src/execution-context.ts","../src/cache.ts","../src/plugins.ts","../src/index.ts"],"sourcesContent":["import type { Token, PunctuationValue } from './types.js'\nimport { ExpressionError } from './errors.js'\n\nconst KEYWORDS = new Map<string, { type: Token['type']; value: string }>([\n ['true', { type: 'Boolean', value: 'true' }],\n ['false', { type: 'Boolean', value: 'false' }],\n ['null', { type: 'Null', value: 'null' }],\n ['undefined', { type: 'Undefined', value: 'undefined' }],\n ['in', { type: 'Operator', value: 'in' }],\n ['not', { type: 'Operator', value: 'not' }],\n])\n\nfunction isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9'\n}\n\nfunction isAlpha(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '_' || ch === '$'\n}\n\nfunction isAlphaNumeric(ch: string): boolean {\n return isAlpha(ch) || isDigit(ch)\n}\n\nfunction isHexDigit(ch: string): boolean {\n return isDigit(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')\n}\n\nexport function tokenize(source: string): Token[] {\n const tokens: Token[] = []\n let i = 0\n\n while (i < source.length) {\n const ch = source[i]\n\n // Skip whitespace\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n i++\n continue\n }\n\n // Numbers: decimal, hex, binary, octal, scientific, underscores\n if (isDigit(ch)) {\n const start = i\n\n // Hex: 0x...\n if (ch === '0' && i + 1 < source.length && (source[i + 1] === 'x' || source[i + 1] === 'X')) {\n i += 2\n while (i < source.length && (isHexDigit(source[i]) || source[i] === '_')) i++\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Binary: 0b...\n if (ch === '0' && i + 1 < source.length && (source[i + 1] === 'b' || source[i + 1] === 'B')) {\n i += 2\n while (i < source.length && (source[i] === '0' || source[i] === '1' || source[i] === '_')) i++\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Octal: 0o...\n if (ch === '0' && i + 1 < source.length && (source[i + 1] === 'o' || source[i + 1] === 'O')) {\n i += 2\n while (i < source.length && ((source[i] >= '0' && source[i] <= '7') || source[i] === '_')) i++\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Decimal (with optional underscore separators)\n while (i < source.length && (isDigit(source[i]) || source[i] === '_')) i++\n if (i < source.length && source[i] === '.' && i + 1 < source.length && isDigit(source[i + 1])) {\n i++ // skip '.'\n while (i < source.length && (isDigit(source[i]) || source[i] === '_')) i++\n }\n\n // Scientific notation: e/E followed by optional +/- and digits\n if (i < source.length && (source[i] === 'e' || source[i] === 'E')) {\n i++\n if (i < source.length && (source[i] === '+' || source[i] === '-')) i++\n while (i < source.length && (isDigit(source[i]) || source[i] === '_')) i++\n }\n\n tokens.push({ type: 'Number', value: source.slice(start, i), start, end: i })\n continue\n }\n\n // Strings\n if (ch === '\"' || ch === \"'\") {\n const quote = ch\n const start = i\n i++ // skip opening quote\n let value = ''\n while (i < source.length && source[i] !== quote) {\n if (source[i] === '\\\\') {\n i++\n const escaped = source[i]\n switch (escaped) {\n case 'n': value += '\\n'; break\n case 't': value += '\\t'; break\n case 'r': value += '\\r'; break\n case '\\\\': value += '\\\\'; break\n case '0': value += '\\0'; break\n case 'x': {\n const hex = source.slice(i + 1, i + 3)\n if (hex.length < 2 || !isHexDigit(hex[0]) || !isHexDigit(hex[1])) {\n throw new ExpressionError('Invalid \\\\x escape: expected 2 hex digits', { source, start, end: i + 3 })\n }\n value += String.fromCharCode(parseInt(hex, 16))\n i += 2\n break\n }\n case 'u': {\n if (i + 1 < source.length && source[i + 1] === '{') {\n const closeBrace = source.indexOf('}', i + 2)\n if (closeBrace === -1) {\n throw new ExpressionError('Invalid \\\\u{} escape: missing closing brace', { source, start, end: source.length })\n }\n const hex = source.slice(i + 2, closeBrace)\n if (hex.length === 0) {\n throw new ExpressionError('Invalid \\\\u{} escape: empty code point', { source, start, end: closeBrace + 1 })\n }\n for (const c of hex) {\n if (!isHexDigit(c)) {\n throw new ExpressionError(`Invalid \\\\u{} escape: non-hex digit \"${c}\"`, { source, start, end: closeBrace + 1 })\n }\n }\n const MAX_UNICODE_CODE_POINT = 0x10FFFF\n const codePoint = parseInt(hex, 16)\n if (codePoint > MAX_UNICODE_CODE_POINT) {\n throw new ExpressionError('Invalid \\\\u{} escape: code point out of range', { source, start, end: closeBrace + 1 })\n }\n value += String.fromCodePoint(codePoint)\n i = closeBrace\n } else {\n const UNICODE_ESCAPE_LEN = 4\n const hex = source.slice(i + 1, i + 1 + UNICODE_ESCAPE_LEN)\n if (hex.length < UNICODE_ESCAPE_LEN) {\n throw new ExpressionError('Invalid \\\\u escape: expected 4 hex digits', { source, start, end: i + 1 + UNICODE_ESCAPE_LEN })\n }\n for (const c of hex) {\n if (!isHexDigit(c)) {\n throw new ExpressionError('Invalid \\\\u escape: expected 4 hex digits', { source, start, end: i + 1 + UNICODE_ESCAPE_LEN })\n }\n }\n value += String.fromCharCode(parseInt(hex, 16))\n i += UNICODE_ESCAPE_LEN\n }\n break\n }\n default: value += escaped; break\n }\n } else {\n value += source[i]\n }\n i++\n }\n if (i >= source.length) {\n throw new ExpressionError('Unterminated string', { source, start, end: i })\n }\n i++ // skip closing quote\n tokens.push({ type: 'String', value, start, end: i })\n continue\n }\n\n // Template literals\n if (ch === '`') {\n const start = i\n i++ // skip opening backtick\n let raw = '`'\n while (i < source.length && source[i] !== '`') {\n if (source[i] === '$' && i + 1 < source.length && source[i + 1] === '{') {\n raw += '${'\n i += 2\n let depth = 1\n while (i < source.length && depth > 0) {\n const ic = source[i]\n // Skip string literals inside interpolations\n if (ic === '\"' || ic === \"'\") {\n raw += ic\n i++\n while (i < source.length && source[i] !== ic) {\n if (source[i] === '\\\\' && i + 1 < source.length) {\n raw += source[i] + source[i + 1]\n i += 2\n continue\n }\n raw += source[i]\n i++\n }\n if (i < source.length) {\n raw += source[i] // closing quote\n i++\n }\n continue\n }\n if (ic === '{') depth++\n else if (ic === '}') depth--\n if (depth > 0) raw += ic\n i++\n }\n raw += '}'\n } else {\n raw += source[i]\n i++\n }\n }\n if (i >= source.length) {\n throw new ExpressionError('Unterminated template literal', { source, start, end: i })\n }\n raw += '`'\n i++ // skip closing backtick\n tokens.push({ type: 'TemplateLiteral', value: raw, start, end: i })\n continue\n }\n\n // Identifiers and keywords\n if (isAlpha(ch)) {\n const start = i\n while (i < source.length && isAlphaNumeric(source[i])) i++\n const value = source.slice(start, i)\n const kw = KEYWORDS.get(value)\n if (kw) {\n tokens.push({ type: kw.type, value: kw.value, start, end: i } as Token)\n } else {\n tokens.push({ type: 'Identifier', value, start, end: i })\n }\n continue\n }\n\n // Multi-character operators and punctuation\n const start = i\n\n // Spread operator ...\n if (ch === '.' && i + 2 < source.length && source[i + 1] === '.' && source[i + 2] === '.') {\n tokens.push({ type: 'Spread', value: '...', start, end: i + 3 })\n i += 3\n continue\n }\n\n // Dot (punctuation)\n if (ch === '.') {\n tokens.push({ type: 'Punctuation', value: '.', start, end: i + 1 })\n i++\n continue\n }\n\n // Pipe |> or logical ||\n if (ch === '|') {\n if (i + 1 < source.length && source[i + 1] === '>') {\n tokens.push({ type: 'Pipe', value: '|>', start, end: i + 2 })\n i += 2\n continue\n }\n if (i + 1 < source.length && source[i + 1] === '|') {\n tokens.push({ type: 'Operator', value: '||', start, end: i + 2 })\n i += 2\n continue\n }\n }\n\n // &&\n if (ch === '&' && i + 1 < source.length && source[i + 1] === '&') {\n tokens.push({ type: 'Operator', value: '&&', start, end: i + 2 })\n i += 2\n continue\n }\n\n // == !=\n if (ch === '=' && i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '==', start, end: i + 2 })\n i += 2\n continue\n }\n if (ch === '!' && i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '!=', start, end: i + 2 })\n i += 2\n continue\n }\n\n // ! (logical not) - must come after != check\n if (ch === '!') {\n tokens.push({ type: 'Operator', value: '!', start, end: i + 1 })\n i++\n continue\n }\n\n // <= >= < >\n if (ch === '<') {\n if (i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '<=', start, end: i + 2 })\n i += 2\n continue\n }\n tokens.push({ type: 'Operator', value: '<', start, end: i + 1 })\n i++\n continue\n }\n if (ch === '>') {\n if (i + 1 < source.length && source[i + 1] === '=') {\n tokens.push({ type: 'Operator', value: '>=', start, end: i + 2 })\n i += 2\n continue\n }\n tokens.push({ type: 'Operator', value: '>', start, end: i + 1 })\n i++\n continue\n }\n\n // ** (exponentiation) — must come before single *\n if (ch === '*' && i + 1 < source.length && source[i + 1] === '*') {\n tokens.push({ type: 'Operator', value: '**', start, end: i + 2 })\n i += 2\n continue\n }\n\n // ?. (optional chaining) or ?? (nullish coalescing) or ? (ternary)\n if (ch === '?') {\n if (i + 1 < source.length && source[i + 1] === '.') {\n tokens.push({ type: 'OptionalChain', value: '?.', start, end: i + 2 })\n i += 2\n continue\n }\n if (i + 1 < source.length && source[i + 1] === '?') {\n tokens.push({ type: 'NullishCoalescing', value: '??', start, end: i + 2 })\n i += 2\n continue\n }\n tokens.push({ type: 'Punctuation', value: '?', start, end: i + 1 })\n i++\n continue\n }\n\n // Single-character operators\n if (ch === '+' || ch === '-' || ch === '*' || ch === '/' || ch === '%') {\n tokens.push({ type: 'Operator', value: ch, start, end: i + 1 })\n i++\n continue\n }\n\n // Punctuation\n if ('()[]{},:'.includes(ch)) {\n tokens.push({ type: 'Punctuation', value: ch as PunctuationValue, start, end: i + 1 })\n i++\n continue\n }\n\n throw new ExpressionError(`Unexpected character \"${ch}\"`, { source, start, end: i + 1 })\n }\n\n tokens.push({ type: 'EOF', value: '', start: i, end: i })\n return tokens\n}\n","import type {\n ASTNode,\n BinaryExpressionOperator,\n ObjectProperty,\n OperatorValue,\n Token,\n} from './types.js'\nimport { tokenize } from './lexer.js'\nimport { ExpressionError } from './errors.js'\n\n// Precedence levels (binding power) for Pratt parsing\nconst PIPE_PRECEDENCE = 5\n\nconst PRECEDENCE: Readonly<Record<OperatorValue | '??', number | undefined>> = {\n '||': 10,\n '&&': 20,\n '??': 25,\n '==': 30,\n '!=': 30,\n '<': 40,\n '>': 40,\n '<=': 40,\n '>=': 40,\n 'in': 40,\n '+': 50,\n '-': 50,\n '*': 60,\n '/': 60,\n '%': 60,\n '**': 70,\n // Unary-only operators have no binary precedence\n '!': undefined,\n 'not': undefined,\n}\n\nconst MAX_PARSE_DEPTH = 32\n\nexport function parse(source: string, _depth = 0): ASTNode {\n if (_depth > MAX_PARSE_DEPTH) {\n throw new ExpressionError(\n 'Maximum template nesting depth exceeded',\n { source, start: 0, end: source.length },\n )\n }\n const tokens = tokenize(source)\n let pos = 0\n\n function current(): Token {\n return tokens[pos]\n }\n\n function advance(): Token {\n return tokens[pos++]\n }\n\n function expect(type: string, value?: string): Token {\n const tok = current()\n if (tok.type !== type || (value !== undefined && tok.value !== value)) {\n throw new ExpressionError(\n `Expected ${value ? `\"${value}\"` : type} but got ${tok.value ? `\"${tok.value}\"` : tok.type}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n return advance()\n }\n\n function parseExpression(minPrec = 0): ASTNode {\n let left = parseUnary()\n\n // Ternary — lowest precedence, handled before binary ops\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n return left\n }\n\n // Pipe expressions — very low precedence\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance() // skip '|>'\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n // Binary operators via Pratt parsing\n while (true) {\n const tok = current()\n let prec: number | undefined\n\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n // Handle 'not in' as a combined operator\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n if (prec === undefined || prec < minPrec) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n // Right-associative for **\n const nextMinPrec = opValue === '**' ? prec : prec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n\n // Ternary after binary (for cases like `a > 5 ? b : c`)\n if (current().type === 'Punctuation' && current().value === '?' && minPrec === 0) {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n left = {\n type: 'ConditionalExpression',\n test: left,\n consequent,\n alternate,\n start: left.start,\n end: alternate.end,\n }\n }\n\n // Pipe after binary/ternary\n while (current().type === 'Pipe' && minPrec <= PIPE_PRECEDENCE) {\n advance()\n const transform = parsePipeTransform()\n left = {\n type: 'PipeExpression',\n input: left,\n transform,\n start: left.start,\n end: transform.end,\n }\n }\n\n return left\n }\n\n function parsePipeTransform(): ASTNode {\n let node = parsePrimary()\n\n // Allow transform to be a call expression: `upper` or `default(\"N/A\")`\n if (current().type === 'Punctuation' && current().value === '(') {\n advance() // skip '('\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n }\n\n return node\n }\n\n function parseUnary(): ASTNode {\n const tok = current()\n\n if (tok.type === 'Operator' && (tok.value === '!' || tok.value === '-' || tok.value === '+')) {\n advance()\n const operand = parseUnary()\n return {\n type: 'UnaryExpression',\n operator: tok.value,\n operand,\n start: tok.start,\n end: operand.end,\n }\n }\n\n return parsePostfix()\n }\n\n function parsePostfix(): ASTNode {\n let node = parsePrimary()\n\n while (true) {\n const tok = current()\n\n // Dot notation: obj.prop\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const prop = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Bracket notation: obj[expr]\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n\n // Optional chaining: obj?.prop or obj?.[expr]\n if (tok.type === 'OptionalChain') {\n advance()\n // obj?.[expr] — computed optional\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n // obj?.prop — regular optional\n const prop = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: prop.value, start: prop.start, end: prop.end },\n computed: false,\n start: node.start,\n end: prop.end,\n }\n continue\n }\n\n // Function call: fn(args)\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n\n break\n }\n\n return node\n }\n\n function parsePrimary(): ASTNode {\n const tok = current()\n\n // Number\n if (tok.type === 'Number') {\n advance()\n const raw = tok.value.replace(/_/g, '')\n return { type: 'NumberLiteral', value: Number(raw), start: tok.start, end: tok.end }\n }\n\n // String\n if (tok.type === 'String') {\n advance()\n return { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n }\n\n // Boolean\n if (tok.type === 'Boolean') {\n advance()\n return { type: 'BooleanLiteral', value: tok.value === 'true', start: tok.start, end: tok.end }\n }\n\n // Null\n if (tok.type === 'Null') {\n advance()\n return { type: 'NullLiteral', value: null, start: tok.start, end: tok.end }\n }\n\n // Undefined\n if (tok.type === 'Undefined') {\n advance()\n return { type: 'UndefinedLiteral', value: undefined, start: tok.start, end: tok.end }\n }\n\n // Template literal\n if (tok.type === 'TemplateLiteral') {\n return parseTemplateLiteral()\n }\n\n // Identifier\n if (tok.type === 'Identifier') {\n advance()\n return { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n }\n\n // Parenthesized expression\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const expr = parseExpression(0)\n expect('Punctuation', ')')\n return expr\n }\n\n // Array literal\n if (tok.type === 'Punctuation' && tok.value === '[') {\n return parseArrayLiteral()\n }\n\n // Object literal\n if (tok.type === 'Punctuation' && tok.value === '{') {\n return parseObjectLiteral()\n }\n\n // Lambda: .property or .property >= value (compound predicate)\n if (tok.type === 'Punctuation' && tok.value === '.') {\n return parseLambdaExpression()\n }\n\n // Spread element\n if (tok.type === 'Spread') {\n advance()\n const argument = parseExpression(0)\n return { type: 'SpreadElement', argument, start: tok.start, end: argument.end }\n }\n\n throw new ExpressionError(\n `Unexpected ${tok.type === 'EOF' ? 'end of expression' : `token \"${tok.value}\"`}`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n function parseLambdaExpression(): ASTNode {\n // We're at the `.` token\n const start = current().start\n advance() // skip the `.`\n\n // Bare `.` as identity lambda (e.g., `. > 2`, `. == \"x\"`)\n // Must be followed by an operator to form a compound predicate.\n let node: ASTNode\n if (current().type !== 'Identifier') {\n if (current().type !== 'Operator' && current().type !== 'NullishCoalescing') {\n throw new ExpressionError(\n `Expected property name or operator after \".\"`,\n { source, start, end: start + 1 },\n )\n }\n node = { type: 'LambdaIdentity', start, end: start + 1 }\n } else {\n const prop = expect('Identifier')\n node = {\n type: 'LambdaAccessor',\n property: prop.value,\n start,\n end: prop.end,\n }\n }\n\n // Continue with postfix operations (member access, optional chaining, calls)\n while (true) {\n const tok = current()\n if (tok.type === 'Punctuation' && tok.value === '.') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'MemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'OptionalChain') {\n advance()\n const nextProp = expect('Identifier')\n node = {\n type: 'OptionalMemberExpression',\n object: node,\n property: { type: 'Identifier', name: nextProp.value, start: nextProp.start, end: nextProp.end },\n computed: false,\n start: node.start,\n end: nextProp.end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '[') {\n advance()\n const property = parseExpression(0)\n const end = expect('Punctuation', ']').end\n node = {\n type: 'MemberExpression',\n object: node,\n property,\n computed: true,\n start: node.start,\n end,\n }\n continue\n }\n if (tok.type === 'Punctuation' && tok.value === '(') {\n advance()\n const args: ASTNode[] = []\n while (!(current().type === 'Punctuation' && current().value === ')')) {\n if (args.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ')') break\n args.push(parseExpression(0))\n }\n const end = expect('Punctuation', ')').end\n node = {\n type: 'CallExpression',\n callee: node,\n args,\n start: node.start,\n end,\n }\n continue\n }\n break\n }\n\n // Check for binary operator to form compound predicate\n const tok = current()\n let prec: number | undefined\n if (tok.type === 'Operator') {\n prec = PRECEDENCE[tok.value]\n if (tok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n prec = PRECEDENCE['in']\n }\n }\n } else if (tok.type === 'NullishCoalescing') {\n prec = PRECEDENCE['??']\n }\n\n // If followed by an operator, this is a compound lambda like `.age >= 18`\n if (prec !== undefined) {\n let left: ASTNode = node\n while (true) {\n const opTok = current()\n let opPrec: number | undefined\n if (opTok.type === 'Operator') {\n opPrec = PRECEDENCE[opTok.value]\n if (opTok.value === 'not') {\n const nextTok = tokens[pos + 1]\n if (nextTok && nextTok.type === 'Operator' && nextTok.value === 'in') {\n opPrec = PRECEDENCE['in']\n }\n }\n } else if (opTok.type === 'NullishCoalescing') {\n opPrec = PRECEDENCE['??']\n }\n if (opPrec === undefined) break\n\n const op = advance()\n let opValue: BinaryExpressionOperator\n if (op.type === 'NullishCoalescing') {\n opValue = '??'\n } else if (op.value === 'not') {\n advance() // skip 'in'\n opValue = 'not in'\n } else {\n opValue = op.value as Exclude<BinaryExpressionOperator, '??' | 'not in'>\n }\n\n const nextMinPrec = opValue === '**' ? opPrec : opPrec + 1\n const right = parseExpression(nextMinPrec)\n\n left = {\n type: 'BinaryExpression',\n operator: opValue,\n left,\n right,\n start: left.start,\n end: right.end,\n }\n }\n node = left\n }\n\n // Check for ternary — compound lambda with conditional\n if (current().type === 'Punctuation' && current().value === '?') {\n advance() // skip '?'\n const consequent = parseExpression(0)\n expect('Punctuation', ':')\n const alternate = parseExpression(0)\n const body: ASTNode = {\n type: 'ConditionalExpression',\n test: node,\n consequent,\n alternate,\n start,\n end: alternate.end,\n }\n return {\n type: 'LambdaExpression',\n body,\n start,\n end: alternate.end,\n }\n }\n\n // If node is just a LambdaAccessor or LambdaIdentity, keep it as-is\n if (node.type === 'LambdaAccessor' || node.type === 'LambdaIdentity') {\n return node\n }\n\n // It has member access / calls / binary ops — wrap in LambdaExpression\n return {\n type: 'LambdaExpression',\n body: node,\n start,\n end: node.end,\n }\n }\n\n function parseArrayLiteral(): ASTNode {\n const start = expect('Punctuation', '[').start\n const elements: ASTNode[] = []\n\n while (!(current().type === 'Punctuation' && current().value === ']')) {\n if (elements.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === ']') break\n elements.push(parseExpression(0))\n }\n\n const end = expect('Punctuation', ']').end\n return { type: 'ArrayLiteral', elements, start, end }\n }\n\n function parseObjectLiteral(): ASTNode {\n const start = expect('Punctuation', '{').start\n const properties: ObjectProperty[] = []\n\n while (!(current().type === 'Punctuation' && current().value === '}')) {\n if (properties.length > 0) expect('Punctuation', ',')\n if (current().type === 'Punctuation' && current().value === '}') break\n\n let key: ASTNode\n let computed = false\n\n // Computed property: [expr]\n if (current().type === 'Punctuation' && current().value === '[') {\n advance()\n key = parseExpression(0)\n expect('Punctuation', ']')\n computed = true\n } else {\n // Identifier or string key\n const tok = current()\n if (tok.type === 'Identifier') {\n advance()\n key = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n\n // Shorthand: { name } → { name: name }\n const next = current()\n if (next.type === 'Punctuation' && (next.value === ',' || next.value === '}')) {\n const value: ASTNode = { type: 'Identifier', name: tok.value, start: tok.start, end: tok.end }\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed: false,\n start: key.start,\n end: value.end,\n })\n continue\n }\n } else if (tok.type === 'String') {\n advance()\n key = { type: 'StringLiteral', value: tok.value, start: tok.start, end: tok.end }\n } else {\n throw new ExpressionError(\n `Expected property name but got \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n }\n\n expect('Punctuation', ':')\n const value = parseExpression(0)\n\n properties.push({\n type: 'ObjectProperty',\n key,\n value,\n computed,\n start: key.start,\n end: value.end,\n })\n }\n\n const end = expect('Punctuation', '}').end\n return { type: 'ObjectLiteral', properties, start, end }\n }\n\n function parseTemplateLiteral(): ASTNode {\n const tok = advance() // consume TemplateLiteral token\n const raw = tok.value.slice(1, -1) // remove backticks\n const parts: ASTNode[] = []\n let i = 0\n let textStart = 0\n\n while (i < raw.length) {\n if (raw[i] === '$' && i + 1 < raw.length && raw[i + 1] === '{') {\n // Add text before interpolation\n if (i > textStart) {\n const text = raw.slice(textStart, i)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n // Find matching }\n i += 2\n let depth = 1\n const exprStart = i\n while (i < raw.length && depth > 0) {\n if (raw[i] === '{') depth++\n else if (raw[i] === '}') depth--\n if (depth > 0) i++\n }\n const exprSource = raw.slice(exprStart, i)\n i++ // skip closing }\n textStart = i\n // Parse the interpolated expression\n const exprAst = parse(exprSource, _depth + 1)\n parts.push(exprAst)\n } else {\n i++\n }\n }\n\n // Remaining text\n if (textStart < raw.length) {\n const text = raw.slice(textStart)\n parts.push({ type: 'StringLiteral', value: text, start: tok.start, end: tok.end })\n }\n\n return { type: 'TemplateLiteral', parts, start: tok.start, end: tok.end }\n }\n\n const result = parseExpression(0)\n\n if (current().type !== 'EOF') {\n const tok = current()\n throw new ExpressionError(\n `Unexpected token \"${tok.value}\"`,\n { source, start: tok.start, end: tok.end },\n )\n }\n\n return result\n}\n","import type { ASTNode, BinaryExpressionOperator } from './types.js'\n\nexport function compile(ast: ASTNode): ASTNode {\n return optimize(ast)\n}\n\nfunction optimize(node: ASTNode): ASTNode {\n switch (node.type) {\n case 'BinaryExpression': {\n const left = optimize(node.left)\n const right = optimize(node.right)\n\n // Constant folding\n if (isConstant(left) && isConstant(right)) {\n const result = evalConstant(node.operator, valueOf(left), valueOf(right))\n if (result !== undefined) {\n return makeConstant(result, node.start, node.end)\n }\n }\n\n return { ...node, left, right }\n }\n\n case 'ConditionalExpression': {\n const test = optimize(node.test)\n\n // Dead branch elimination\n if (isConstant(test)) {\n const value = valueOf(test)\n return value ? optimize(node.consequent) : optimize(node.alternate)\n }\n\n return {\n ...node,\n test,\n consequent: optimize(node.consequent),\n alternate: optimize(node.alternate),\n }\n }\n\n case 'UnaryExpression': {\n const operand = optimize(node.operand)\n if (isConstant(operand)) {\n const val = valueOf(operand)\n if (node.operator === '!' && typeof val === 'boolean') {\n return { type: 'BooleanLiteral', value: !val, start: node.start, end: node.end }\n }\n if (node.operator === '-' && typeof val === 'number') {\n return { type: 'NumberLiteral', value: -val, start: node.start, end: node.end }\n }\n }\n return { ...node, operand }\n }\n\n case 'PipeExpression':\n return { ...node, input: optimize(node.input), transform: optimize(node.transform) }\n\n case 'ArrayLiteral':\n return { ...node, elements: node.elements.map(e => optimize(e)) }\n\n case 'CallExpression':\n return { ...node, args: node.args.map(a => optimize(a)) }\n\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n return { ...node, object: optimize(node.object), property: node.computed ? optimize(node.property) : node.property }\n\n case 'LambdaExpression':\n return { ...node, body: optimize(node.body) }\n\n default:\n return node\n }\n}\n\nfunction isConstant(node: ASTNode): boolean {\n return node.type === 'NumberLiteral'\n || node.type === 'StringLiteral'\n || node.type === 'BooleanLiteral'\n || node.type === 'NullLiteral'\n}\n\nfunction valueOf(node: ASTNode): unknown {\n if (node.type === 'NumberLiteral') return node.value\n if (node.type === 'StringLiteral') return node.value\n if (node.type === 'BooleanLiteral') return node.value\n if (node.type === 'NullLiteral') return null\n return undefined\n}\n\nfunction evalConstant(op: BinaryExpressionOperator, left: unknown, right: unknown): unknown | undefined {\n if (typeof left === 'number' && typeof right === 'number') {\n switch (op) {\n case '+': return left + right\n case '-': return left - right\n case '*': return left * right\n case '/': return left / right\n case '%': return left % right\n case '**': return left ** right\n case '<': return left < right\n case '>': return left > right\n case '<=': return left <= right\n case '>=': return left >= right\n case '==': return left === right\n case '!=': return left !== right\n }\n }\n if (typeof left === 'string' && typeof right === 'string' && op === '+') {\n return left + right\n }\n if (typeof left === 'boolean' && typeof right === 'boolean') {\n if (op === '&&') return left && right\n if (op === '||') return left || right\n }\n if (op === '==') return left === right\n if (op === '!=') return left !== right\n return undefined\n}\n\nfunction makeConstant(value: unknown, start: number, end: number): ASTNode {\n if (typeof value === 'number') return { type: 'NumberLiteral', value, start, end }\n if (typeof value === 'string') return { type: 'StringLiteral', value, start, end }\n if (typeof value === 'boolean') return { type: 'BooleanLiteral', value, start, end }\n if (value === null) return { type: 'NullLiteral', value: null, start, end }\n return { type: 'UndefinedLiteral', value: undefined, start, end }\n}\n","import { suggest, BonsaiReferenceError, BonsaiSecurityError, BonsaiTypeError } from './errors.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport type {\n ASTNode,\n BinaryExpressionOperator,\n TransformFn,\n FunctionFn,\n UnaryOperator,\n} from './types.js'\n\ntype SafeMethod = (...args: unknown[]) => unknown\n\n/** Receiver type check for safe methods. */\nfunction isAllowedReceiver(obj: unknown, methodName: string): boolean {\n const t = typeof obj\n switch (methodName) {\n // String-only\n case 'startsWith': case 'endsWith': case 'substring':\n case 'charAt': case 'charCodeAt': case 'repeat':\n case 'trim': case 'trimStart': case 'trimEnd':\n case 'toLowerCase': case 'toUpperCase':\n case 'replace': case 'replaceAll':\n case 'padStart': case 'padEnd':\n case 'split':\n return t === 'string'\n // String + Array\n case 'includes': case 'indexOf': case 'lastIndexOf':\n case 'slice': case 'at': case 'concat':\n return t === 'string' || Array.isArray(obj)\n // Array-only (higher-order)\n case 'filter': case 'map': case 'find': case 'findIndex':\n case 'some': case 'every': case 'flatMap':\n return Array.isArray(obj)\n // Array-only (non-callback, non-mutating)\n case 'join': case 'flat':\n case 'toReversed': case 'toSorted': case 'toSpliced': case 'with':\n return Array.isArray(obj)\n // Number\n case 'toFixed':\n return t === 'number'\n // Number + String\n case 'toString':\n return t === 'string' || t === 'number'\n default:\n return false\n }\n}\n\nexport function toPropertyKey(value: unknown): string {\n return String(value)\n}\n\nexport function applyBinaryOp(operator: BinaryExpressionOperator, left: unknown, right: unknown): unknown {\n switch (operator) {\n case '+': return (left as number) + (right as number)\n case '-': return (left as number) - (right as number)\n case '*': return (left as number) * (right as number)\n case '/': return (left as number) / (right as number)\n case '%': return (left as number) % (right as number)\n case '**': return (left as number) ** (right as number)\n case '==': return left === right\n case '!=': return left !== right\n case '<': return (left as number) < (right as number)\n case '>': return (left as number) > (right as number)\n case '<=': return (left as number) <= (right as number)\n case '>=': return (left as number) >= (right as number)\n case 'in': {\n if (typeof right === 'string') return (right as string).includes(left as string)\n if (Array.isArray(right)) return right.includes(left)\n throw new BonsaiTypeError('in', 'a string or array', right)\n }\n case 'not in': {\n if (typeof right === 'string') return !(right as string).includes(left as string)\n if (Array.isArray(right)) return !right.includes(left)\n throw new BonsaiTypeError('not in', 'a string or array', right)\n }\n default: throw new Error(`Unknown binary operator: ${operator}`)\n }\n}\n\nexport function applyUnaryOp(operator: UnaryOperator, operand: unknown): unknown {\n switch (operator) {\n case '!': return !operand\n case '-': return -(operand as number)\n case '+': return Number(operand)\n default: throw new Error(`Unknown unary operator: ${operator}`)\n }\n}\n\nexport function validateMethodCall(\n obj: unknown,\n methodName: string,\n guard: ExecutionContext,\n): SafeMethod {\n guard.checkNameAccess(methodName, 'method')\n if (obj == null) throw new BonsaiTypeError(methodName, 'a non-null value', obj)\n if (!isAllowedReceiver(obj, methodName)) {\n throw new BonsaiSecurityError(\n 'METHOD_NOT_ALLOWED',\n `Method \"${methodName}\" is not allowed on ${typeof obj}`,\n )\n }\n const method = (obj as Record<string, unknown>)[methodName]\n if (typeof method !== 'function') throw new BonsaiTypeError(methodName, 'a method', method)\n return method as SafeMethod\n}\n\nexport function resolveTransform(name: string, transforms: Record<string, TransformFn>): TransformFn {\n if (!Object.hasOwn(transforms, name)) {\n const suggestion = suggest(name, Object.keys(transforms))\n throw new BonsaiReferenceError('transform', name, suggestion)\n }\n return transforms[name]\n}\n\nexport function resolveFunction(name: string, functions: Record<string, FunctionFn>): FunctionFn {\n if (!Object.hasOwn(functions, name)) {\n const suggestion = suggest(name, Object.keys(functions))\n throw new BonsaiReferenceError('function', name, suggestion)\n }\n return functions[name]\n}\n\nexport function getIdentifierName(node: ASTNode, message = 'Expected identifier'): string {\n if (node.type !== 'Identifier') {\n throw new Error(message)\n }\n return node.name\n}\n\nexport function getObjectLiteralKeyName(node: ASTNode, message = 'Expected identifier or string literal'): string {\n if (node.type === 'Identifier' || node.type === 'StringLiteral') {\n return node.type === 'Identifier' ? node.name : node.value\n }\n throw new Error(message)\n}\n\nexport function expandSpreadValue(value: unknown, maxLength?: number): unknown[] {\n if (Array.isArray(value)) {\n if (maxLength !== undefined && value.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread source length (${value.length}) exceeds maximum (${maxLength})`,\n )\n }\n return value\n }\n if (value != null) {\n const iterator = (value as { [Symbol.iterator]?: unknown })[Symbol.iterator]\n if (typeof iterator === 'function') {\n const result: unknown[] = []\n for (const item of value as Iterable<unknown>) {\n result.push(item)\n if (maxLength !== undefined && result.length > maxLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Spread exceeds maximum array length (${maxLength})`,\n )\n }\n }\n return result\n }\n }\n throw new BonsaiTypeError('spread', 'an iterable value', value)\n}\n\nconst REPLACE_METHODS = new Set(['replace', 'replaceAll'])\nconst MAX_REPEAT_COUNT = 100_000\n\nexport function validateMethodArgs(methodName: string, args: unknown[]): void {\n if (REPLACE_METHODS.has(methodName)) {\n for (const arg of args) {\n if (typeof arg === 'function') {\n throw new BonsaiTypeError(methodName, 'string arguments (callbacks are not allowed)', arg)\n }\n if (arg instanceof RegExp) {\n throw new BonsaiTypeError(methodName, 'string arguments (RegExp is not allowed)', arg)\n }\n if (arg != null && typeof arg === 'object') {\n throw new BonsaiTypeError(methodName, 'string arguments (objects are not allowed)', arg)\n }\n }\n }\n if (methodName === 'repeat') {\n const count = Number(args[0])\n if (!Number.isFinite(count) || count < 0 || count > MAX_REPEAT_COUNT) {\n throw new BonsaiTypeError('repeat', `a count between 0 and ${MAX_REPEAT_COUNT}`, args[0])\n }\n }\n}\n\nexport function accessMember(\n object: unknown,\n propertyNode: ASTNode,\n computed: boolean,\n computedValue: unknown,\n guard: ExecutionContext,\n): unknown {\n const key = computed ? toPropertyKey(computedValue) : getIdentifierName(propertyNode, 'Expected identifier property')\n guard.checkNameAccess(key, 'member')\n return (object as Record<string, unknown>)?.[key]\n}\n","import type { ASTNode, FunctionFn, ObjectProperty, TransformFn } from './types.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation, BonsaiTypeError } from './errors.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveFunction,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\nfunction rejectPromise(value: unknown, kind: 'function' | 'method' | 'transform', name: string): unknown {\n if (value instanceof Promise) {\n throw new BonsaiTypeError(\n name,\n `a synchronous ${kind} result — use evaluate() instead of evaluateSync() for async`,\n value,\n )\n }\n return value\n}\n\nexport interface EvalEnv {\n ctx: Record<string, unknown>\n tr: Record<string, TransformFn>\n fn: Record<string, FunctionFn>\n g: ExecutionContext\n s?: string\n}\n\nexport function evaluate(\n node: ASTNode,\n context: Record<string, unknown>,\n transforms: Record<string, TransformFn>,\n functions: Record<string, FunctionFn>,\n guard: ExecutionContext,\n source?: string,\n): unknown {\n return evalNode(node, { ctx: context, tr: transforms, fn: functions, g: guard, s: source })\n}\n\nfunction evalNode(node: ASTNode, env: EvalEnv): unknown {\n const { ctx, g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n\n case 'NullLiteral':\n return null\n\n case 'UndefinedLiteral':\n return undefined\n\n case 'Identifier':\n g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(ctx, node.name) ? ctx[node.name] : undefined\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalNode(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalNode(node.left, env)\n return left ? evalNode(node.right, env) : left\n }\n if (op === '||') {\n const left = evalNode(node.left, env)\n return left ? left : evalNode(node.right, env)\n }\n if (op === '??') {\n const left = evalNode(node.left, env)\n return left != null ? left : evalNode(node.right, env)\n }\n return applyBinaryOp(op, evalNode(node.left, env), evalNode(node.right, env))\n }\n\n case 'ConditionalExpression':\n return evalNode(node.test, env) ? evalNode(node.consequent, env) : evalNode(node.alternate, env)\n\n case 'MemberExpression': {\n const object = evalNode(node.object, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = evalNode(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(evalNode(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(evalNode(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = getObjectPropertyKey(prop, env)\n obj[key] = evalNode(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return evalCallExpression(node, env)\n\n case 'PipeExpression': {\n const input = evalNode(node.input, env)\n try {\n return evalPipe(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(evalNode(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return evalNode(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBody(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nfunction evalCallExpression(node: Extract<ASTNode, { type: 'CallExpression' }>, env: EvalEnv): unknown {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalNode(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const func = resolveFunction(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(...args), 'function', node.callee.name)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nfunction pushCallArgument(args: unknown[], node: ASTNode, env: EvalEnv): void {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(evalArg(node, env))\n}\n\nfunction evalArg(node: ASTNode, env: EvalEnv): unknown {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return evalNode(node, env)\n}\n\nfunction evalPipe(input: unknown, transformNode: ASTNode, env: EvalEnv): unknown {\n const { tr } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n pushCallArgument(args, arg, env)\n }\n return rejectPromise(func(input, ...args), 'transform', calleeName)\n }\n\n if (transformNode.type === 'Identifier') {\n return rejectPromise(resolveTransform(transformNode.name, tr)(input), 'transform', transformNode.name)\n }\n\n throw new Error('Invalid transform expression')\n}\n\nexport function evaluateLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n return evalLambdaBody(node, item, env)\n}\n\nfunction evalLambdaBody(node: ASTNode, item: unknown, env: EvalEnv): unknown {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = evalLambdaBody(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? evalNode(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = evalLambdaBody(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? evalNode(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(evalNode(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(evalArg(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n return rejectPromise(method.call(obj, ...args), 'method', methodName)\n }\n // Delegate to evalNode for non-method calls (e.g. registered functions)\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? evalLambdaBody(node.right, item, env) : left\n }\n if (op === '||') {\n const left = evalLambdaBody(node.left, item, env)\n return left ? left : evalLambdaBody(node.right, item, env)\n }\n if (op === '??') {\n const left = evalLambdaBody(node.left, item, env)\n return left != null ? left : evalLambdaBody(node.right, item, env)\n }\n return applyBinaryOp(op, evalLambdaBody(node.left, item, env), evalLambdaBody(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, evalLambdaBody(node.operand, item, env))\n\n case 'ConditionalExpression':\n return evalLambdaBody(node.test, item, env)\n ? evalLambdaBody(node.consequent, item, env)\n : evalLambdaBody(node.alternate, item, env)\n\n case 'LambdaExpression':\n return evalLambdaBody(node.body, item, env)\n\n default:\n // Delegate to evalNode which manages its own depth\n ownDepth = false\n g.exitDepth()\n return evalNode(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nfunction getObjectPropertyKey(prop: ObjectProperty, env: EvalEnv): string {\n const key = prop.computed ? String(evalNode(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","import type { ASTNode, FunctionFn, ObjectProperty, TransformFn } from './types.js'\nimport type { ExecutionContext } from './execution-context.js'\nimport { attachLocation } from './errors.js'\nimport { type EvalEnv } from './evaluator.js'\nimport {\n accessMember,\n applyBinaryOp,\n applyUnaryOp,\n expandSpreadValue,\n getIdentifierName,\n getObjectLiteralKeyName,\n resolveFunction,\n resolveTransform,\n validateMethodArgs,\n validateMethodCall,\n} from './eval-ops.js'\n\ntype AsyncEvalEnv = EvalEnv\n\nexport async function evaluateAsync(\n node: ASTNode,\n context: Record<string, unknown>,\n transforms: Record<string, TransformFn>,\n functions: Record<string, FunctionFn>,\n guard: ExecutionContext,\n source?: string,\n): Promise<unknown> {\n const env: AsyncEvalEnv = { ctx: context, tr: transforms, fn: functions, g: guard, s: source }\n const result = await evalNodeAsync(node, env)\n guard.checkTimeout()\n return result\n}\n\nasync function evalNodeAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { ctx, g, s } = env\n g.enterDepth()\n g.step()\n\n try {\n switch (node.type) {\n case 'NumberLiteral':\n case 'StringLiteral':\n case 'BooleanLiteral':\n return node.value\n\n case 'NullLiteral':\n return null\n\n case 'UndefinedLiteral':\n return undefined\n\n case 'Identifier':\n g.checkNameAccess(node.name, 'identifier')\n return Object.hasOwn(ctx, node.name) ? ctx[node.name] : undefined\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalNodeAsync(node.operand, env))\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalNodeAsync(node.left, env)\n return left ? await evalNodeAsync(node.right, env) : left\n }\n if (op === '||') {\n const left = await evalNodeAsync(node.left, env)\n return left ? left : await evalNodeAsync(node.right, env)\n }\n if (op === '??') {\n const left = await evalNodeAsync(node.left, env)\n return left != null ? left : await evalNodeAsync(node.right, env)\n }\n return applyBinaryOp(op, await evalNodeAsync(node.left, env), await evalNodeAsync(node.right, env))\n }\n\n case 'ConditionalExpression':\n return await evalNodeAsync(node.test, env)\n ? await evalNodeAsync(node.consequent, env)\n : await evalNodeAsync(node.alternate, env)\n\n case 'MemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalNodeAsync(node.object, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n try {\n return accessMember(object, node.property, node.computed, computedValue, g)\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n case 'ArrayLiteral': {\n const elements: unknown[] = []\n for (const el of node.elements) {\n if (el.type === 'SpreadElement') {\n elements.push(...expandSpreadValue(await evalNodeAsync(el.argument, env), g.policy.maxArrayLength))\n } else {\n elements.push(await evalNodeAsync(el, env))\n }\n }\n g.checkArrayLength(elements.length)\n return elements\n }\n\n case 'ObjectLiteral': {\n const obj = Object.create(null) as Record<string, unknown>\n for (const prop of node.properties) {\n const key = await getObjectPropertyKey(prop, env)\n obj[key] = await evalNodeAsync(prop.value, env)\n }\n return obj\n }\n\n case 'CallExpression':\n return await evalCallExpressionAsync(node, env)\n\n case 'PipeExpression': {\n const input = await evalNodeAsync(node.input, env)\n try {\n return await evalPipeAsync(input, node.transform, env)\n } catch (e) {\n if (s) attachLocation(e, s, node.transform.start, node.transform.end)\n throw e\n }\n }\n\n case 'TemplateLiteral': {\n let result = ''\n for (const part of node.parts) {\n result += part.type === 'StringLiteral' ? part.value : String(await evalNodeAsync(part, env))\n }\n return result\n }\n\n case 'SpreadElement':\n return await evalNodeAsync(node.argument, env)\n\n case 'LambdaAccessor':\n return makeLambdaAccessor(node.property, g)\n\n case 'LambdaIdentity':\n return (item: unknown) => item\n\n case 'LambdaExpression':\n return (item: unknown) => evalLambdaBodyAsync(node.body, item, env)\n\n default:\n throw new Error(`Unknown node type: ${(node as ASTNode).type}`)\n }\n } finally {\n g.exitDepth()\n }\n}\n\nasync function evalCallExpressionAsync(\n node: Extract<ASTNode, { type: 'CallExpression' }>,\n env: AsyncEvalEnv,\n): Promise<unknown> {\n const { fn, g, s } = env\n\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalNodeAsync(node.callee.object, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n\n try {\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n validateMethodArgs(methodName, args)\n\n // Higher-order array methods need async-aware iteration\n // because lambda callbacks may return Promises, which native\n // Array methods can't handle (Promises are always truthy).\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const arr = obj\n const predicate = args[0] as (item: unknown) => unknown\n const asyncResult = await evalAsyncArrayMethod(methodName, arr, predicate)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n const result = await method.call(obj, ...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n if (node.callee.type === 'Identifier') {\n try {\n const func = resolveFunction(node.callee.name, fn)\n const args: unknown[] = []\n for (const arg of node.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(...args)\n g.checkTimeout()\n return result\n } catch (e) {\n if (s) attachLocation(e, s, node.start, node.end)\n throw e\n }\n }\n\n throw new Error('Cannot call non-identifier')\n}\n\nasync function pushCallArgumentAsync(args: unknown[], node: ASTNode, env: AsyncEvalEnv): Promise<void> {\n if (node.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(node.argument, env), env.g.policy.maxArrayLength))\n return\n }\n\n args.push(await evalArgAsync(node, env))\n}\n\n// Async-safe higher-order array method evaluation. Native JS array methods\n// call predicates synchronously, but our lambdas may return Promises.\n// Returns { value } if handled, undefined if the method isn't higher-order.\nasync function evalAsyncArrayMethod(\n methodName: string,\n arr: unknown[],\n predicate: (item: unknown) => unknown,\n): Promise<{ value: unknown } | undefined> {\n switch (methodName) {\n case 'filter': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: arr.filter((_, i) => resolved[i]) }\n }\n case 'map': {\n const results = arr.map(predicate)\n return { value: results.some(r => r instanceof Promise) ? await Promise.all(results) : results }\n }\n case 'find': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n const idx = resolved.findIndex(Boolean)\n return { value: idx >= 0 ? arr[idx] : undefined }\n }\n case 'some': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.some(Boolean) }\n }\n case 'every': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.every(Boolean) }\n }\n case 'findIndex': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: resolved.findIndex(Boolean) }\n }\n case 'flatMap': {\n const results = arr.map(predicate)\n const resolved = results.some(r => r instanceof Promise) ? await Promise.all(results) : results\n return { value: (resolved as unknown[]).flat() }\n }\n default:\n return undefined\n }\n}\n\nasync function evalArgAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\n }\n if (node.type === 'LambdaIdentity') {\n return (item: unknown) => item\n }\n return await evalNodeAsync(node, env)\n}\n\nasync function evalPipeAsync(input: unknown, transformNode: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n const { tr, g } = env\n\n if (transformNode.type === 'CallExpression') {\n const calleeName = getIdentifierName(transformNode.callee, 'Transform must be an identifier')\n const func = resolveTransform(calleeName, tr)\n const args: unknown[] = []\n for (const arg of transformNode.args) {\n await pushCallArgumentAsync(args, arg, env)\n }\n const result = await func(input, ...args)\n g.checkTimeout()\n return result\n }\n\n if (transformNode.type === 'Identifier') {\n const result = await resolveTransform(transformNode.name, tr)(input)\n g.checkTimeout()\n return result\n }\n\n throw new Error('Invalid transform expression')\n}\n\nasync function evalLambdaBodyAsync(node: ASTNode, item: unknown, env: AsyncEvalEnv): Promise<unknown> {\n const { g } = env\n g.enterDepth()\n g.step()\n\n let ownDepth = true\n try {\n switch (node.type) {\n case 'LambdaIdentity':\n return item\n\n case 'LambdaAccessor':\n g.checkNameAccess(node.property, 'member')\n return (item as Record<string, unknown>)?.[node.property]\n\n case 'MemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'OptionalMemberExpression': {\n const object = await evalLambdaBodyAsync(node.object, item, env)\n if (object == null) return undefined\n const computedValue = node.computed ? await evalNodeAsync(node.property, env) : undefined\n return accessMember(object, node.property, node.computed, computedValue, g)\n }\n\n case 'CallExpression': {\n if (node.callee.type === 'MemberExpression' || node.callee.type === 'OptionalMemberExpression') {\n const obj = await evalLambdaBodyAsync(node.callee.object, item, env)\n if (node.callee.type === 'OptionalMemberExpression' && obj == null) return undefined\n const computedValue = node.callee.computed ? await evalNodeAsync(node.callee.property, env) : undefined\n const methodName = node.callee.computed\n ? String(computedValue)\n : getIdentifierName(node.callee.property, 'Expected method name')\n const method = validateMethodCall(obj, methodName, g)\n const args: unknown[] = []\n for (const arg of node.args) {\n if (arg.type === 'SpreadElement') {\n args.push(...expandSpreadValue(await evalNodeAsync(arg.argument, env), g.policy.maxArrayLength))\n } else {\n args.push(await evalArgAsync(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\n\n // Async-safe higher-order array method handling (same as top-level path)\n if (Array.isArray(obj) && args.length === 1 && typeof args[0] === 'function') {\n const asyncResult = await evalAsyncArrayMethod(methodName, obj, args[0] as (item: unknown) => unknown)\n if (asyncResult !== undefined) {\n g.checkTimeout()\n return asyncResult.value\n }\n }\n\n return await method.call(obj, ...args)\n }\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n\n case 'BinaryExpression': {\n const op = node.operator\n if (op === '&&') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? await evalLambdaBodyAsync(node.right, item, env) : left\n }\n if (op === '||') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n if (op === '??') {\n const left = await evalLambdaBodyAsync(node.left, item, env)\n return left != null ? left : await evalLambdaBodyAsync(node.right, item, env)\n }\n return applyBinaryOp(op, await evalLambdaBodyAsync(node.left, item, env), await evalLambdaBodyAsync(node.right, item, env))\n }\n\n case 'UnaryExpression':\n return applyUnaryOp(node.operator, await evalLambdaBodyAsync(node.operand, item, env))\n\n case 'ConditionalExpression':\n return await evalLambdaBodyAsync(node.test, item, env)\n ? await evalLambdaBodyAsync(node.consequent, item, env)\n : await evalLambdaBodyAsync(node.alternate, item, env)\n\n case 'LambdaExpression':\n return await evalLambdaBodyAsync(node.body, item, env)\n\n default:\n ownDepth = false\n g.exitDepth()\n return await evalNodeAsync(node, env)\n }\n } finally {\n if (ownDepth) g.exitDepth()\n }\n}\n\nasync function getObjectPropertyKey(prop: ObjectProperty, env: AsyncEvalEnv): Promise<string> {\n const key = prop.computed ? String(await evalNodeAsync(prop.key, env)) : getObjectLiteralKeyName(prop.key)\n env.g.checkNameAccess(key, 'object-key')\n return key\n}\n\nfunction makeLambdaAccessor(property: string, guard: ExecutionContext): (item: Record<string, unknown>) => unknown {\n return (item: Record<string, unknown>) => {\n guard.checkNameAccess(property, 'member')\n return item?.[property]\n }\n}\n","import type { BonsaiOptions } from './types.js'\nimport { BonsaiSecurityError } from './errors.js'\n\n/**\n * Discriminates how a property name is being accessed so security checks can\n * apply different rules (e.g. root identifiers bypass allow/deny lists).\n */\nexport type AccessKind = 'identifier' | 'member' | 'method' | 'object-key'\n\nexport const BLOCKED_PROPERTIES: ReadonlySet<string> = new Set([\n '__proto__', 'constructor', 'prototype',\n])\n\nconst MAX_INDEX_DIGITS = 10\n\nfunction isCanonicalIndex(key: string): boolean {\n if (key.length === 0 || key.length > MAX_INDEX_DIGITS) return false\n const n = Number(key)\n return Number.isInteger(n) && n >= 0 && String(n) === key\n}\n\nconst TIMEOUT_CHECK_INTERVAL = 1000\nconst DEFAULT_MAX_DEPTH = 100\nconst DEFAULT_MAX_ARRAY_LENGTH = 100_000\n\n/** Immutable per-instance security configuration derived from BonsaiOptions. */\nexport class SecurityPolicy {\n readonly maxDepth: number\n readonly maxArrayLength: number\n readonly timeout: number\n readonly allowedProperties?: ReadonlySet<string>\n readonly deniedProperties?: ReadonlySet<string>\n\n constructor(options: BonsaiOptions = {}) {\n this.maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH\n this.maxArrayLength = options.maxArrayLength ?? DEFAULT_MAX_ARRAY_LENGTH\n this.timeout = options.timeout ?? 0\n this.allowedProperties = options.allowedProperties\n ? new Set(options.allowedProperties)\n : undefined\n this.deniedProperties = options.deniedProperties\n ? new Set(options.deniedProperties)\n : undefined\n }\n}\n\n/** Mutable per-evaluation state: tracks depth, step count, and deadline for a single evaluation. */\nexport class ExecutionContext {\n private stepCount = 0\n private depth = 0\n private readonly deadline: number\n readonly policy: SecurityPolicy\n private readonly now: () => number\n\n constructor(policy: SecurityPolicy, now: () => number = Date.now) {\n this.policy = policy\n this.now = now\n this.deadline = policy.timeout ? now() + policy.timeout : 0\n }\n\n step(): void {\n if (this.deadline) {\n this.stepCount++\n if (this.stepCount % TIMEOUT_CHECK_INTERVAL === 0) {\n this.checkTimeout()\n }\n }\n }\n\n checkTimeout(): void {\n if (this.deadline && this.now() >= this.deadline) {\n throw new BonsaiSecurityError(\n 'TIMEOUT',\n `Expression timeout: exceeded ${this.policy.timeout}ms`,\n )\n }\n }\n\n enterDepth(): void {\n if (++this.depth > this.policy.maxDepth) {\n throw new BonsaiSecurityError(\n 'MAX_DEPTH',\n `Maximum expression depth (${this.policy.maxDepth}) exceeded`,\n )\n }\n }\n\n exitDepth(): void {\n this.depth--\n }\n\n withDepth<T>(fn: () => T): T {\n this.enterDepth()\n try {\n return fn()\n } finally {\n this.exitDepth()\n }\n }\n\n checkNameAccess(key: string, kind: AccessKind): void {\n if (BLOCKED_PROPERTIES.has(key)) {\n throw new BonsaiSecurityError(\n 'BLOCKED_PROPERTY',\n `Blocked: access to \"${key}\" is not allowed`,\n )\n }\n\n if (kind === 'identifier' || kind === 'object-key') return\n\n if (isCanonicalIndex(key)) return\n\n if (this.policy.allowedProperties) {\n if (!this.policy.allowedProperties.has(key)) {\n throw new BonsaiSecurityError(\n 'PROPERTY_NOT_ALLOWED',\n `Blocked: \"${key}\" is not in allowed properties`,\n )\n }\n }\n\n if (this.policy.deniedProperties) {\n if (this.policy.deniedProperties.has(key)) {\n throw new BonsaiSecurityError(\n 'PROPERTY_DENIED',\n `Blocked: \"${key}\" is in denied properties`,\n )\n }\n }\n }\n\n checkArrayLength(length: number): void {\n if (length > this.policy.maxArrayLength) {\n throw new BonsaiSecurityError(\n 'MAX_ARRAY_LENGTH',\n `Array length (${length}) exceeds maximum (${this.policy.maxArrayLength})`,\n )\n }\n }\n}\n","export class LRUCache<K, V> {\n private readonly max: number\n private readonly map = new Map<K, V>()\n\n constructor(max: number) {\n this.max = max > 0 ? max : 0\n }\n\n get(key: K): V | undefined {\n if (!this.map.has(key)) return undefined\n const value = this.map.get(key) as V\n // Move to end (most recent)\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n\n set(key: K, value: V): void {\n if (this.max === 0) return\n\n if (this.map.has(key)) {\n this.map.delete(key)\n } else if (this.map.size >= this.max) {\n // Evict oldest (first key)\n const oldest = this.map.keys().next().value!\n this.map.delete(oldest)\n }\n this.map.set(key, value)\n }\n\n get size(): number {\n return this.map.size\n }\n\n clear(): void {\n this.map.clear()\n }\n}\n","import type { TransformFn, FunctionFn } from './types.js'\n\nexport interface PluginRegistry {\n addTransform(name: string, fn: TransformFn): void\n addFunction(name: string, fn: FunctionFn): void\n removeTransform(name: string): boolean\n removeFunction(name: string): boolean\n getTransform(name: string): TransformFn | undefined\n getFunction(name: string): FunctionFn | undefined\n getTransformNames(): string[]\n getFunctionNames(): string[]\n use(plugin: (registry: PluginRegistry) => void): void\n readonly transforms: Record<string, TransformFn>\n readonly functions: Record<string, FunctionFn>\n}\n\nexport function createPluginRegistry(): PluginRegistry {\n const transformMap = new Map<string, TransformFn>()\n const functionMap = new Map<string, FunctionFn>()\n\n // Cached snapshots — rebuilt only when registry changes\n let transformsCache: Record<string, TransformFn> = {}\n let functionsCache: Record<string, FunctionFn> = {}\n let transformsDirty = false\n let functionsDirty = false\n\n const registry: PluginRegistry = {\n addTransform(name, fn) { transformMap.set(name, fn); transformsDirty = true },\n addFunction(name, fn) { functionMap.set(name, fn); functionsDirty = true },\n removeTransform(name) { const r = transformMap.delete(name); if (r) transformsDirty = true; return r },\n removeFunction(name) { const r = functionMap.delete(name); if (r) functionsDirty = true; return r },\n getTransform(name) { return transformMap.get(name) },\n getFunction(name) { return functionMap.get(name) },\n getTransformNames() { return [...transformMap.keys()] },\n getFunctionNames() { return [...functionMap.keys()] },\n use(plugin) { plugin(registry) },\n get transforms() {\n if (transformsDirty) {\n transformsCache = Object.fromEntries(transformMap)\n transformsDirty = false\n }\n return transformsCache\n },\n get functions() {\n if (functionsDirty) {\n functionsCache = Object.fromEntries(functionMap)\n functionsDirty = false\n }\n return functionsCache\n },\n }\n\n return registry\n}\n","import type {\n BonsaiOptions,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n TransformFn,\n FunctionFn,\n BonsaiPlugin,\n ASTNode,\n} from './types.js'\nimport { parse } from './parser.js'\nimport { compile } from './compiler.js'\nimport { evaluate } from './evaluator.js'\nimport { evaluateAsync } from './evaluator-async.js'\nimport { SecurityPolicy, ExecutionContext } from './execution-context.js'\nimport { LRUCache } from './cache.js'\nimport { createPluginRegistry } from './plugins.js'\nimport { ExpressionError, formatError, offsetToPosition } from './errors.js'\nimport { getIdentifierName } from './eval-ops.js'\n\nexport { ExpressionError, BonsaiTypeError, BonsaiSecurityError, BonsaiReferenceError, formatError, formatBonsaiError } from './errors.js'\nexport { tokenize } from './lexer.js'\nexport { parse } from './parser.js'\nexport { compile } from './compiler.js'\nexport type {\n ASTNode,\n Token,\n TokenType,\n BonsaiPlugin,\n BonsaiInstance,\n CompiledExpression,\n ValidationResult,\n ExpressionReferences,\n BonsaiOptions,\n TransformFn,\n FunctionFn,\n} from './types.js'\n\nconst DEFAULT_CACHE_SIZE = 256\n\n// Shared instance for standalone one-off evaluation\nlet _shared: BonsaiInstance | undefined\n\n/**\n * Evaluate a single expression with default options. Uses a shared instance internally.\n * For repeated evaluation or custom configuration, use `bonsai()` to create a dedicated instance.\n */\nexport function evaluateExpression<T = unknown>(expression: string, context?: Record<string, unknown>): T {\n if (!_shared) _shared = bonsai()\n return _shared.evaluateSync<T>(expression, context)\n}\n\n/**\n * Create a new Bonsai instance with optional safety and caching configuration.\n * Register transforms and functions via `.use()`, `.addTransform()`, and `.addFunction()`.\n *\n * @example\n * ```ts\n * const expr = bonsai({ timeout: 50 })\n * expr.use(strings)\n * expr.evaluateSync('name |> trim |> upper', { name: ' hello ' }) // \"HELLO\"\n * ```\n */\nexport function bonsai(options: BonsaiOptions = {}): BonsaiInstance {\n const registry = createPluginRegistry()\n const cache = new LRUCache<string, CompiledExpression>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n const astCache = new LRUCache<string, ASTNode>(options.cacheSize ?? DEFAULT_CACHE_SIZE)\n\n const policy = new SecurityPolicy(options)\n\n function createExecutionContext(): ExecutionContext {\n return new ExecutionContext(policy)\n }\n\n function getAst(source: string): ASTNode {\n let ast = astCache.get(source)\n if (ast) return ast\n ast = compile(parse(source))\n astCache.set(source, ast)\n return ast\n }\n\n function compileExpr(source: string): CompiledExpression {\n const cached = cache.get(source)\n if (cached) return cached\n\n const optimized = getAst(source)\n\n const compiled: CompiledExpression = {\n ast: optimized,\n source,\n async evaluate<T = unknown>(context = {}) {\n return evaluateAsync(optimized, context, registry.transforms, registry.functions, createExecutionContext(), source) as Promise<T>\n },\n evaluateSync<T = unknown>(context = {}) {\n return evaluate(optimized, context, registry.transforms, registry.functions, createExecutionContext(), source) as T\n },\n }\n\n cache.set(source, compiled)\n return compiled\n }\n\n const instance: BonsaiInstance = {\n use(plugin) { plugin(instance); return instance },\n addTransform(name, fn) { registry.addTransform(name, fn); return instance },\n addFunction(name, fn) { registry.addFunction(name, fn); return instance },\n removeTransform(name) { return registry.removeTransform(name) },\n removeFunction(name) { return registry.removeFunction(name) },\n hasTransform(name) { return registry.getTransform(name) !== undefined },\n hasFunction(name) { return registry.getFunction(name) !== undefined },\n listTransforms() { return registry.getTransformNames() },\n listFunctions() { return registry.getFunctionNames() },\n clearCache() { cache.clear(); astCache.clear() },\n compile(expression) { return compileExpr(expression) },\n async evaluate<T = unknown>(expression: string, context = {}) {\n const ast = getAst(expression)\n return evaluateAsync(ast, context, registry.transforms, registry.functions, createExecutionContext(), expression) as Promise<T>\n },\n evaluateSync<T = unknown>(expression: string, context = {}) {\n // Hot path: skip CompiledExpression object creation, go straight to eval\n const ast = getAst(expression)\n return evaluate(ast, context, registry.transforms, registry.functions, createExecutionContext(), expression) as T\n },\n validate(expression) {\n try {\n const ast = parse(expression)\n return { valid: true, errors: [], ast, references: extractReferences(ast) }\n } catch (error: unknown) {\n let message: string\n if (error instanceof ExpressionError) {\n message = error.rawMessage\n } else if (error instanceof Error) {\n message = error.message\n } else {\n message = String(error)\n }\n const { start, end } = error instanceof ExpressionError ? error : { start: 0, end: 1 }\n const position = offsetToPosition(expression, start)\n return {\n valid: false,\n errors: [{\n message,\n position: { line: position.line, column: position.column },\n formatted: error instanceof ExpressionError\n ? error.message\n : formatError(message, { source: expression, start, end }),\n }],\n }\n }\n },\n }\n\n return instance\n}\n\nfunction extractReferences(node: ASTNode): ExpressionReferences {\n const identifiers = new Set<string>()\n const transforms = new Set<string>()\n const functions = new Set<string>()\n\n function walk(n: ASTNode): void {\n switch (n.type) {\n case 'Identifier':\n identifiers.add(n.name)\n break\n case 'PipeExpression':\n walk(n.input)\n if (n.transform.type === 'Identifier') {\n transforms.add(n.transform.name)\n } else if (n.transform.type === 'CallExpression') {\n if (n.transform.callee.type === 'Identifier') {\n transforms.add(getIdentifierName(n.transform.callee))\n }\n n.transform.args.forEach(walk)\n }\n break\n case 'CallExpression':\n if (n.callee.type === 'Identifier') {\n functions.add(n.callee.name)\n } else {\n walk(n.callee)\n }\n n.args.forEach(walk)\n break\n case 'BinaryExpression':\n walk(n.left)\n walk(n.right)\n break\n case 'UnaryExpression':\n walk(n.operand)\n break\n case 'ConditionalExpression':\n walk(n.test)\n walk(n.consequent)\n walk(n.alternate)\n break\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n walk(n.object)\n if (n.computed) walk(n.property)\n break\n case 'ArrayLiteral':\n n.elements.forEach(walk)\n break\n case 'ObjectLiteral':\n n.properties.forEach(p => { walk(p.key); walk(p.value) })\n break\n case 'TemplateLiteral':\n n.parts.forEach(walk)\n break\n case 'SpreadElement':\n walk(n.argument)\n break\n case 'LambdaExpression':\n walk(n.body)\n break\n }\n }\n\n walk(node)\n return {\n identifiers: [...identifiers],\n transforms: [...transforms],\n functions: [...functions],\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bonsai-js",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "A safe, zero-dependency expression language for rules, filters, and templates",
5
5
  "type": "module",
6
6
  "sideEffects": false,