bonsai-js 0.1.2 → 0.2.0
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 +9 -0
- package/README.md +62 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +78 -10
- package/dist/index.mjs.map +1 -1
- package/dist/stdlib/index.d.mts +1 -1
- package/dist/{types-Cbouo-QC.d.mts → types-ClpZDF5z.d.mts} +5 -2
- package/dist/{types-Cbouo-QC.d.mts.map → types-ClpZDF5z.d.mts.map} +1 -1
- package/package.json +1 -1
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.0] - 2026-03-15
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **JS-style array method chaining:** `users.filter(.age >= 18).map(.name)` — `filter`, `map`, `find`, `some`, and `every` now work as native array methods with lambda arguments, no stdlib import required
|
|
13
|
+
- **Bare dot identity lambda:** `. > 2` and `. * 10` now work as lambda shorthand for the current item itself, in both method calls and pipe transforms (e.g., `[1,2,3,4].filter(. > 2)`, `[1,2,3] |> map(. * 10)`)
|
|
14
|
+
- Async-safe evaluation for all higher-order array methods — lambda predicates that return Promises are correctly resolved in both top-level and nested contexts via `evaluate()`
|
|
15
|
+
- Documentation for array methods, lambda shorthand, and method chaining in README and website docs
|
|
16
|
+
|
|
8
17
|
## [Unreleased]
|
|
9
18
|
|
|
10
19
|
### Added
|
package/README.md
CHANGED
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/bonsai-js)
|
|
8
8
|
[](https://www.npmjs.com/package/bonsai-js)
|
|
9
9
|
[](https://github.com/danfry1/bonsai-js/actions/workflows/ci.yml)
|
|
10
|
+
[](https://github.com/danfry1/bonsai-js/actions/workflows/codeql.yml)
|
|
10
11
|
[](https://bundlephobia.com/package/bonsai-js)
|
|
11
12
|
[](https://www.npmjs.com/package/bonsai-js)
|
|
13
|
+
[](https://nodejs.org)
|
|
14
|
+
[](https://www.typescriptlang.org)
|
|
12
15
|
[](https://github.com/danfry1/bonsai-js/blob/main/LICENSE)
|
|
16
|
+
[](https://www.bestpractices.dev/projects/12173)
|
|
13
17
|
|
|
14
18
|
A safe expression language for rules, filters, templates, and user-authored logic. Runs in any JavaScript runtime.
|
|
15
19
|
|
|
@@ -58,6 +62,16 @@ expr.evaluateSync('users |> filter(.age >= 18) |> map(.name)', {
|
|
|
58
62
|
],
|
|
59
63
|
}) // ['Alice']
|
|
60
64
|
|
|
65
|
+
// JS-style method chaining works too
|
|
66
|
+
expr.evaluateSync('users.filter(.age >= 18).map(.name)', {
|
|
67
|
+
users: [
|
|
68
|
+
{ name: 'Alice', age: 25 },
|
|
69
|
+
{ name: 'Bob', age: 15 },
|
|
70
|
+
],
|
|
71
|
+
}) // ['Alice']
|
|
72
|
+
|
|
73
|
+
expr.evaluateSync('[1, 2, 3, 4].filter(. > 2)') // [3, 4]
|
|
74
|
+
|
|
61
75
|
expr.evaluateSync('user?.profile?.avatar ?? "default.png"', {
|
|
62
76
|
user: null,
|
|
63
77
|
}) // 'default.png'
|
|
@@ -122,6 +136,53 @@ if (result.valid) {
|
|
|
122
136
|
}
|
|
123
137
|
```
|
|
124
138
|
|
|
139
|
+
## Array Methods and Lambdas
|
|
140
|
+
|
|
141
|
+
Bonsai supports two styles for working with arrays: **pipe transforms** and **JS-style method chaining**. Both use the same lambda shorthand.
|
|
142
|
+
|
|
143
|
+
### Lambda shorthand
|
|
144
|
+
|
|
145
|
+
Inside array methods, `.` refers to the current item:
|
|
146
|
+
|
|
147
|
+
- `.property` — access a property on each item (e.g., `.age`, `.name`)
|
|
148
|
+
- `. > value` — compare each item directly (e.g., `. > 2`, `. == "x"`)
|
|
149
|
+
|
|
150
|
+
Compound predicates work too: `.age >= 18 && .active`
|
|
151
|
+
|
|
152
|
+
### Pipe transforms (via stdlib)
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { arrays } from 'bonsai-js/stdlib'
|
|
156
|
+
|
|
157
|
+
const expr = bonsai().use(arrays)
|
|
158
|
+
|
|
159
|
+
expr.evaluateSync('users |> filter(.age >= 18) |> map(.name)', {
|
|
160
|
+
users: [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 15 }],
|
|
161
|
+
}) // ['Alice']
|
|
162
|
+
|
|
163
|
+
expr.evaluateSync('[1, 2, 3, 4] |> filter(. > 2)') // [3, 4]
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### JS-style method chaining
|
|
167
|
+
|
|
168
|
+
No stdlib import required — `filter`, `map`, `find`, `some`, and `every` work as native array methods:
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
const expr = bonsai()
|
|
172
|
+
|
|
173
|
+
expr.evaluateSync('users.filter(.age >= 18).map(.name)', {
|
|
174
|
+
users: [{ name: 'Alice', age: 25 }, { name: 'Bob', age: 15 }],
|
|
175
|
+
}) // ['Alice']
|
|
176
|
+
|
|
177
|
+
expr.evaluateSync('[1, 2, 3, 4].filter(. > 2)') // [3, 4]
|
|
178
|
+
expr.evaluateSync('[1, 2, 3].map(. * 10)') // [10, 20, 30]
|
|
179
|
+
expr.evaluateSync('[1, 2, 3].find(. > 1)') // 2
|
|
180
|
+
expr.evaluateSync('[1, 2, 3].some(. > 2)') // true
|
|
181
|
+
expr.evaluateSync('[1, 2, 3].every(. > 0)') // true
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Both styles support async evaluation via `evaluate()`.
|
|
185
|
+
|
|
125
186
|
## API Reference
|
|
126
187
|
|
|
127
188
|
### `bonsai(options?)`
|
|
@@ -433,7 +494,7 @@ What Bonsai does:
|
|
|
433
494
|
- prevents expressions from reaching globals or importing modules
|
|
434
495
|
- looks up root identifiers via own-property checks only (`Object.hasOwn`), so context prototype chains cannot leak
|
|
435
496
|
- creates object literals with `null` prototypes, preventing prototype pollution through expression-constructed objects
|
|
436
|
-
- validates method call receivers against a safe allowlist of types (string, number, array, plain object)
|
|
497
|
+
- validates method call receivers against a safe allowlist of types (string, number, array, plain object) — array methods include `filter`, `map`, `find`, `some`, `every`, `includes`, `indexOf`, `slice`, `at`
|
|
437
498
|
- automatically bypasses allow/deny lists for canonical numeric array indices (e.g., `items[0]`)
|
|
438
499
|
- rejects `Promise` values in `evaluateSync()` with actionable errors that name the offending function/transform/method and suggest using `evaluate()` instead
|
|
439
500
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as CompiledExpression, c as Token, d as ValidationResult, i as BonsaiPlugin, l as TokenType, n as BonsaiInstance, o as ExpressionReferences, r as BonsaiOptions, s as FunctionFn, t as ASTNode, u as TransformFn } from "./types-
|
|
1
|
+
import { a as CompiledExpression, c as Token, d as ValidationResult, i as BonsaiPlugin, l as TokenType, n as BonsaiInstance, o as ExpressionReferences, r as BonsaiOptions, s as FunctionFn, t as ASTNode, u as TransformFn } from "./types-ClpZDF5z.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/errors.d.ts
|
|
4
4
|
interface ErrorLocation {
|
package/dist/index.mjs
CHANGED
|
@@ -813,13 +813,27 @@ function parse(source, _depth = 0) {
|
|
|
813
813
|
function parseLambdaExpression() {
|
|
814
814
|
const start = current().start;
|
|
815
815
|
advance();
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
type
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
816
|
+
let node;
|
|
817
|
+
if (current().type !== "Identifier") {
|
|
818
|
+
if (current().type !== "Operator" && current().type !== "NullishCoalescing") throw new ExpressionError(`Expected property name or operator after "."`, {
|
|
819
|
+
source,
|
|
820
|
+
start,
|
|
821
|
+
end: start + 1
|
|
822
|
+
});
|
|
823
|
+
node = {
|
|
824
|
+
type: "LambdaIdentity",
|
|
825
|
+
start,
|
|
826
|
+
end: start + 1
|
|
827
|
+
};
|
|
828
|
+
} else {
|
|
829
|
+
const prop = expect("Identifier");
|
|
830
|
+
node = {
|
|
831
|
+
type: "LambdaAccessor",
|
|
832
|
+
property: prop.value,
|
|
833
|
+
start,
|
|
834
|
+
end: prop.end
|
|
835
|
+
};
|
|
836
|
+
}
|
|
823
837
|
while (true) {
|
|
824
838
|
const tok = current();
|
|
825
839
|
if (tok.type === "Punctuation" && tok.value === ".") {
|
|
@@ -952,7 +966,7 @@ function parse(source, _depth = 0) {
|
|
|
952
966
|
end: alternate.end
|
|
953
967
|
};
|
|
954
968
|
}
|
|
955
|
-
if (node.type === "LambdaAccessor") return node;
|
|
969
|
+
if (node.type === "LambdaAccessor" || node.type === "LambdaIdentity") return node;
|
|
956
970
|
return {
|
|
957
971
|
type: "LambdaExpression",
|
|
958
972
|
body: node,
|
|
@@ -1267,6 +1281,11 @@ function isAllowedReceiver(obj, methodName) {
|
|
|
1267
1281
|
case "indexOf":
|
|
1268
1282
|
case "slice":
|
|
1269
1283
|
case "at": return t === "string" || Array.isArray(obj);
|
|
1284
|
+
case "filter":
|
|
1285
|
+
case "map":
|
|
1286
|
+
case "find":
|
|
1287
|
+
case "some":
|
|
1288
|
+
case "every": return Array.isArray(obj);
|
|
1270
1289
|
case "toFixed": return t === "number";
|
|
1271
1290
|
case "toString": return t === "string" || t === "number";
|
|
1272
1291
|
default: return false;
|
|
@@ -1467,6 +1486,7 @@ function evalNode(node, env) {
|
|
|
1467
1486
|
}
|
|
1468
1487
|
case "SpreadElement": return evalNode(node.argument, env);
|
|
1469
1488
|
case "LambdaAccessor": return makeLambdaAccessor$1(node.property, g);
|
|
1489
|
+
case "LambdaIdentity": return (item) => item;
|
|
1470
1490
|
case "LambdaExpression": return (item) => evalLambdaBody(node.body, item, env);
|
|
1471
1491
|
default: throw new Error(`Unknown node type: ${node.type}`);
|
|
1472
1492
|
}
|
|
@@ -1512,6 +1532,7 @@ function pushCallArgument(args, node, env) {
|
|
|
1512
1532
|
}
|
|
1513
1533
|
function evalArg(node, env) {
|
|
1514
1534
|
if (node.type === "LambdaAccessor") return makeLambdaAccessor$1(node.property, env.g);
|
|
1535
|
+
if (node.type === "LambdaIdentity") return (item) => item;
|
|
1515
1536
|
return evalNode(node, env);
|
|
1516
1537
|
}
|
|
1517
1538
|
function evalPipe(input, transformNode, env) {
|
|
@@ -1533,6 +1554,7 @@ function evalLambdaBody(node, item, env) {
|
|
|
1533
1554
|
let ownDepth = true;
|
|
1534
1555
|
try {
|
|
1535
1556
|
switch (node.type) {
|
|
1557
|
+
case "LambdaIdentity": return item;
|
|
1536
1558
|
case "LambdaAccessor":
|
|
1537
1559
|
g.checkNameAccess(node.property, "member");
|
|
1538
1560
|
return item?.[node.property];
|
|
@@ -1556,7 +1578,7 @@ function evalLambdaBody(node, item, env) {
|
|
|
1556
1578
|
const method = validateMethodCall(obj, methodName, g);
|
|
1557
1579
|
const args = [];
|
|
1558
1580
|
for (const arg of node.args) if (arg.type === "SpreadElement") args.push(...expandSpreadValue(evalNode(arg.argument, env), g.policy.maxArrayLength));
|
|
1559
|
-
else args.push(
|
|
1581
|
+
else args.push(evalArg(arg, env));
|
|
1560
1582
|
validateMethodArgs(methodName, args);
|
|
1561
1583
|
return rejectPromise(method.call(obj, ...args), "method", methodName);
|
|
1562
1584
|
}
|
|
@@ -1700,6 +1722,7 @@ async function evalNodeAsync(node, env) {
|
|
|
1700
1722
|
}
|
|
1701
1723
|
case "SpreadElement": return await evalNodeAsync(node.argument, env);
|
|
1702
1724
|
case "LambdaAccessor": return makeLambdaAccessor(node.property, g);
|
|
1725
|
+
case "LambdaIdentity": return (item) => item;
|
|
1703
1726
|
case "LambdaExpression": return (item) => evalLambdaBodyAsync(node.body, item, env);
|
|
1704
1727
|
default: throw new Error(`Unknown node type: ${node.type}`);
|
|
1705
1728
|
}
|
|
@@ -1719,6 +1742,15 @@ async function evalCallExpressionAsync(node, env) {
|
|
|
1719
1742
|
const args = [];
|
|
1720
1743
|
for (const arg of node.args) await pushCallArgumentAsync(args, arg, env);
|
|
1721
1744
|
validateMethodArgs(methodName, args);
|
|
1745
|
+
if (Array.isArray(obj) && args.length === 1 && typeof args[0] === "function") {
|
|
1746
|
+
const arr = obj;
|
|
1747
|
+
const predicate = args[0];
|
|
1748
|
+
const asyncResult = await evalAsyncArrayMethod(methodName, arr, predicate);
|
|
1749
|
+
if (asyncResult !== void 0) {
|
|
1750
|
+
g.checkTimeout();
|
|
1751
|
+
return asyncResult.value;
|
|
1752
|
+
}
|
|
1753
|
+
}
|
|
1722
1754
|
const result = await method.call(obj, ...args);
|
|
1723
1755
|
g.checkTimeout();
|
|
1724
1756
|
return result;
|
|
@@ -1747,8 +1779,36 @@ async function pushCallArgumentAsync(args, node, env) {
|
|
|
1747
1779
|
}
|
|
1748
1780
|
args.push(await evalArgAsync(node, env));
|
|
1749
1781
|
}
|
|
1782
|
+
async function evalAsyncArrayMethod(methodName, arr, predicate) {
|
|
1783
|
+
switch (methodName) {
|
|
1784
|
+
case "filter": {
|
|
1785
|
+
const results = arr.map(predicate);
|
|
1786
|
+
const resolved = results.some((r) => r instanceof Promise) ? await Promise.all(results) : results;
|
|
1787
|
+
return { value: arr.filter((_, i) => resolved[i]) };
|
|
1788
|
+
}
|
|
1789
|
+
case "map": {
|
|
1790
|
+
const results = arr.map(predicate);
|
|
1791
|
+
return { value: results.some((r) => r instanceof Promise) ? await Promise.all(results) : results };
|
|
1792
|
+
}
|
|
1793
|
+
case "find": {
|
|
1794
|
+
const results = arr.map(predicate);
|
|
1795
|
+
const idx = (results.some((r) => r instanceof Promise) ? await Promise.all(results) : results).findIndex(Boolean);
|
|
1796
|
+
return { value: idx >= 0 ? arr[idx] : void 0 };
|
|
1797
|
+
}
|
|
1798
|
+
case "some": {
|
|
1799
|
+
const results = arr.map(predicate);
|
|
1800
|
+
return { value: (results.some((r) => r instanceof Promise) ? await Promise.all(results) : results).some(Boolean) };
|
|
1801
|
+
}
|
|
1802
|
+
case "every": {
|
|
1803
|
+
const results = arr.map(predicate);
|
|
1804
|
+
return { value: (results.some((r) => r instanceof Promise) ? await Promise.all(results) : results).every(Boolean) };
|
|
1805
|
+
}
|
|
1806
|
+
default: return;
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1750
1809
|
async function evalArgAsync(node, env) {
|
|
1751
1810
|
if (node.type === "LambdaAccessor") return makeLambdaAccessor(node.property, env.g);
|
|
1811
|
+
if (node.type === "LambdaIdentity") return (item) => item;
|
|
1752
1812
|
return await evalNodeAsync(node, env);
|
|
1753
1813
|
}
|
|
1754
1814
|
async function evalPipeAsync(input, transformNode, env) {
|
|
@@ -1775,6 +1835,7 @@ async function evalLambdaBodyAsync(node, item, env) {
|
|
|
1775
1835
|
let ownDepth = true;
|
|
1776
1836
|
try {
|
|
1777
1837
|
switch (node.type) {
|
|
1838
|
+
case "LambdaIdentity": return item;
|
|
1778
1839
|
case "LambdaAccessor":
|
|
1779
1840
|
g.checkNameAccess(node.property, "member");
|
|
1780
1841
|
return item?.[node.property];
|
|
@@ -1798,8 +1859,15 @@ async function evalLambdaBodyAsync(node, item, env) {
|
|
|
1798
1859
|
const method = validateMethodCall(obj, methodName, g);
|
|
1799
1860
|
const args = [];
|
|
1800
1861
|
for (const arg of node.args) if (arg.type === "SpreadElement") args.push(...expandSpreadValue(await evalNodeAsync(arg.argument, env), g.policy.maxArrayLength));
|
|
1801
|
-
else args.push(await
|
|
1862
|
+
else args.push(await evalArgAsync(arg, env));
|
|
1802
1863
|
validateMethodArgs(methodName, args);
|
|
1864
|
+
if (Array.isArray(obj) && args.length === 1 && typeof args[0] === "function") {
|
|
1865
|
+
const asyncResult = await evalAsyncArrayMethod(methodName, obj, args[0]);
|
|
1866
|
+
if (asyncResult !== void 0) {
|
|
1867
|
+
g.checkTimeout();
|
|
1868
|
+
return asyncResult.value;
|
|
1869
|
+
}
|
|
1870
|
+
}
|
|
1803
1871
|
return await method.call(obj, ...args);
|
|
1804
1872
|
}
|
|
1805
1873
|
ownDepth = false;
|
package/dist/index.mjs.map
CHANGED
|
@@ -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 const prop = expect('Identifier')\n let node: ASTNode = {\n type: 'LambdaAccessor',\n property: prop.value,\n start,\n end: prop.end,\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, keep it as-is for backward compat\n if (node.type === 'LambdaAccessor') {\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 // 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 '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 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 '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(evalNode(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 '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 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\nasync function evalArgAsync(node: ASTNode, env: AsyncEvalEnv): Promise<unknown> {\n if (node.type === 'LambdaAccessor') {\n return makeLambdaAccessor(node.property, env.g)\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 '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 evalNodeAsync(arg, env))\n }\n }\n validateMethodArgs(methodName, args)\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 '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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"}
|
package/dist/stdlib/index.d.mts
CHANGED
|
@@ -149,7 +149,10 @@ interface LambdaExpression extends BaseNode {
|
|
|
149
149
|
type: 'LambdaExpression';
|
|
150
150
|
body: ASTNode;
|
|
151
151
|
}
|
|
152
|
-
|
|
152
|
+
interface LambdaIdentity extends BaseNode {
|
|
153
|
+
type: 'LambdaIdentity';
|
|
154
|
+
}
|
|
155
|
+
type ASTNode = NumberLiteral | StringLiteral | BooleanLiteral | NullLiteral | UndefinedLiteral | Identifier | BinaryExpression | UnaryExpression | ConditionalExpression | MemberExpression | OptionalMemberExpression | ArrayLiteral | ObjectLiteral | CallExpression | PipeExpression | TemplateLiteral | SpreadElement | LambdaAccessor | LambdaExpression | LambdaIdentity;
|
|
153
156
|
/** Options for creating a Bonsai instance via {@link BonsaiInstance}. */
|
|
154
157
|
interface BonsaiOptions {
|
|
155
158
|
/** Cooperative timeout in milliseconds. 0 (default) disables timeout checks. */
|
|
@@ -241,4 +244,4 @@ interface ValidationError {
|
|
|
241
244
|
}
|
|
242
245
|
//#endregion
|
|
243
246
|
export { CompiledExpression as a, Token as c, ValidationResult as d, BonsaiPlugin as i, TokenType as l, BonsaiInstance as n, ExpressionReferences as o, BonsaiOptions as r, FunctionFn as s, ASTNode as t, TransformFn as u };
|
|
244
|
-
//# sourceMappingURL=types-
|
|
247
|
+
//# sourceMappingURL=types-ClpZDF5z.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-ClpZDF5z.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";KAUY,cAAA;AAAA,KAOA,aAAA;AAAA,KACA,wBAAA,GAA2B,OAAA,CAAQ,cAAA;AAAA,KAEnC,aAAA,GAAgB,cAAA,GAAiB,aAAA;AAAA,KAEjC,gBAAA;AAAA,UAEF,SAAA;EACR,KAAA;EACA,GAAA;AAAA;AAAA,KAGU,KAAA;EACN,IAAA;EAAgB,KAAA;AAAA,IAAkB,SAAA;EAClC,IAAA;EAAgB,KAAA;AAAA,IAAkB,SAAA;EAClC,IAAA;EAAyB,KAAA;AAAA,IAAkB,SAAA;EAC3C,IAAA;EAAiB,KAAA;AAAA,IAA4B,SAAA;EAC7C,IAAA;EAAc,KAAA;AAAA,IAAkB,SAAA;EAChC,IAAA;EAAmB,KAAA;AAAA,IAAuB,SAAA;EAC1C,IAAA;EAAoB,KAAA;AAAA,IAAkB,SAAA;EACtC,IAAA;EAAkB,KAAA,EAAO,aAAA;AAAA,IAAkB,SAAA;EAC3C,IAAA;EAAqB,KAAA,EAAO,gBAAA;AAAA,IAAqB,SAAA;EACjD,IAAA;EAAc,KAAA;AAAA,IAAgB,SAAA;EAC9B,IAAA;EAAuB,KAAA;AAAA,IAAgB,SAAA;EACvC,IAAA;EAA2B,KAAA;AAAA,IAAgB,SAAA;EAC3C,IAAA;EAAgB,KAAA;AAAA,IAAiB,SAAA;EACjC,IAAA;EAAa,KAAA;AAAA,IAAc,SAAA;AAAA,KAErB,SAAA,GAAY,KAAA;AAAA,UAId,QAAA;EACR,KAAA;EACA,GAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,QAAA;EACrC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,QAAA;EACrC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA,SAAoB,QAAA;EACnC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,QAAA;EAClC,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,QAAA,EAAU,wBAAA;EACV,IAAA,EAAM,OAAA;EACN,KAAA,EAAO,OAAA;AAAA;AAAA,UAGQ,eAAA,SAAwB,QAAA;EACvC,IAAA;EACA,QAAA,EAAU,aAAA;EACV,OAAA,EAAS,OAAA;AAAA;AAAA,UAGM,qBAAA,SAA8B,QAAA;EAC7C,IAAA;EACA,IAAA,EAAM,OAAA;EACN,UAAA,EAAY,OAAA;EACZ,SAAA,EAAW,OAAA;AAAA;AAAA,UAGI,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,MAAA,EAAQ,OAAA;EACR,QAAA,EAAU,OAAA;EACV,QAAA;AAAA;AAAA,UAGe,wBAAA,SAAiC,QAAA;EAChD,IAAA;EACA,MAAA,EAAQ,OAAA;EACR,QAAA,EAAU,OAAA;EACV,QAAA;AAAA;AAAA,UAGe,YAAA,SAAqB,QAAA;EACpC,IAAA;EAAA,SACS,QAAA,YAAoB,OAAA,GAAU,aAAA;AAAA;AAAA,UAGxB,aAAA,SAAsB,QAAA;EACrC,IAAA;EAAA,SACS,UAAA,WAAqB,cAAA;AAAA;AAAA,UAGf,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,GAAA,EAAK,OAAA;EACL,KAAA,EAAO,OAAA;EACP,QAAA;AAAA;AAAA,UAGe,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,MAAA,EAAQ,OAAA;EAAA,SACC,IAAA,WAAe,OAAA;AAAA;AAAA,UAGT,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,KAAA,EAAO,OAAA;EACP,SAAA,EAAW,OAAA;AAAA;AAAA,UAGI,eAAA,SAAwB,QAAA;EACvC,IAAA;EAAA,SACS,KAAA,YAAiB,aAAA,GAAgB,OAAA;AAAA;AAAA,UAG3B,aAAA,SAAsB,QAAA;EACrC,IAAA;EACA,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,QAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,IAAA,EAAM,OAAA;AAAA;AAAA,UAGS,cAAA,SAAuB,QAAA;EACtC,IAAA;AAAA;AAAA,KAGU,OAAA,GACR,aAAA,GACA,aAAA,GACA,cAAA,GACA,WAAA,GACA,gBAAA,GACA,UAAA,GACA,gBAAA,GACA,eAAA,GACA,qBAAA,GACA,gBAAA,GACA,wBAAA,GACA,YAAA,GACA,aAAA,GACA,cAAA,GACA,cAAA,GACA,eAAA,GACA,aAAA,GACA,cAAA,GACA,gBAAA,GACA,cAAA;;UAKa,aAAA;EAnHX;EAqHJ,OAAA;EAlHgC;EAoHhC,QAAA;EAlHU;EAoHV,cAAA;EAlHO;EAoHP,iBAAA;EAxHgD;EA0HhD,gBAAA;EA1HwC;EA4HxC,SAAA;AAAA;;KAIU,WAAA,IAAe,KAAA,cAAmB,IAAA,0BAA8B,OAAA;;KAGhE,UAAA,OAAiB,IAAA,0BAA8B,OAAA;;KAG/C,YAAA,IAAgB,QAAA,EAAU,cAAA;;UAGrB,cAAA;EAlIgB;EAoI/B,GAAA,CAAI,MAAA,EAAQ,YAAA;EAlIF;EAoIV,YAAA,CAAa,IAAA,UAAc,EAAA,EAAI,WAAA;EAtIQ;EAwIvC,WAAA,CAAY,IAAA,UAAc,EAAA,EAAI,UAAA;EAxIiB;EA0I/C,eAAA,CAAgB,IAAA;EAzIhB;EA2IA,cAAA,CAAe,IAAA;EA1IL;EA4IV,YAAA,CAAa,IAAA;EA3IJ;EA6IT,WAAA,CAAY,IAAA;EA7II;EA+IhB,cAAA;EA5IqC;EA8IrC,aAAA;EA5IM;EA8IN,UAAA;EA5IW;EA8IX,OAAA,CAAQ,UAAA,WAAqB,kBAAA;EAlJwB;EAoJrD,QAAA,cAAsB,UAAA,UAAoB,OAAA,GAAU,MAAA,oBAA0B,OAAA,CAAQ,CAAA;EApJzC;EAsJ7C,YAAA,cAA0B,UAAA,UAAoB,OAAA,GAAU,MAAA,oBAA0B,CAAA;EApJlF;EAsJA,QAAA,CAAS,UAAA,WAAqB,gBAAA;AAAA;;UAIf,kBAAA;EAxJJ;EA0JX,QAAA,cAAsB,OAAA,GAAU,MAAA,oBAA0B,OAAA,CAAQ,CAAA;EA1JhD;EA4JlB,YAAA,cAA0B,OAAA,GAAU,MAAA,oBAA0B,CAAA;EAzJ9B;EAAA,SA2JvB,GAAA,EAAK,OAAA;EAzJN;EAAA,SA2JC,MAAA;AAAA;;UAIM,oBAAA;EACf,WAAA;EACA,UAAA;EACA,SAAA;AAAA;;KAIU,gBAAA;EACN,KAAA;EAAa,MAAA;EAAY,GAAA,EAAK,OAAA;EAAS,UAAA,EAAY,oBAAA;AAAA;EACnD,KAAA;EAAc,MAAA,EAAQ,eAAA;AAAA;;UAGX,eAAA;EACf,OAAA;EACA,QAAA;IAAY,IAAA;IAAc,MAAA;EAAA;EAC1B,UAAA;EACA,SAAA;AAAA"}
|