bonsai-js 0.3.0 → 0.5.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 +41 -5
- package/README.md +84 -13
- package/dist/autocomplete/index.d.mts +1 -1
- package/dist/autocomplete/index.d.mts.map +1 -1
- package/dist/autocomplete/index.mjs +22 -61
- package/dist/autocomplete/index.mjs.map +1 -1
- package/dist/{errors-t5i9AEaf.mjs → errors-CCZDd1gK.mjs} +2 -3
- package/dist/errors-CCZDd1gK.mjs.map +1 -0
- package/dist/{execution-context-DqYC3L92.mjs → execution-context-b6FBfEdv.mjs} +147 -16
- package/dist/execution-context-b6FBfEdv.mjs.map +1 -0
- package/dist/index.d.mts +16 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +228 -111
- package/dist/index.mjs.map +1 -1
- package/dist/stdlib/index.d.mts +1 -1
- package/dist/stdlib/index.d.mts.map +1 -1
- package/dist/stdlib/index.mjs +43 -11
- package/dist/stdlib/index.mjs.map +1 -1
- package/dist/{types-BhsZZsLY.d.mts → types-DkXfy5IJ.d.mts} +59 -17
- package/dist/types-DkXfy5IJ.d.mts.map +1 -0
- package/package.json +37 -11
- package/dist/errors-t5i9AEaf.mjs.map +0 -1
- package/dist/execution-context-DqYC3L92.mjs.map +0 -1
- package/dist/types-BhsZZsLY.d.mts.map +0 -1
package/dist/stdlib/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as BonsaiTypeError } from "../errors-
|
|
1
|
+
import { r as BonsaiTypeError } from "../errors-CCZDd1gK.mjs";
|
|
2
2
|
//#region src/stdlib/strings.ts
|
|
3
3
|
function expectString$1(val, name) {
|
|
4
4
|
if (typeof val !== "string") throw new BonsaiTypeError(name, "a string", val);
|
|
@@ -40,6 +40,17 @@ function expectArray(val, name) {
|
|
|
40
40
|
function hasPromises(results) {
|
|
41
41
|
return results.some((r) => r instanceof Promise);
|
|
42
42
|
}
|
|
43
|
+
const LAMBDA_EXPECTED = "a lambda or function callback (e.g. .field or . > value)";
|
|
44
|
+
function compareCodePoints(a, b) {
|
|
45
|
+
const ia = a[Symbol.iterator]();
|
|
46
|
+
const ib = b[Symbol.iterator]();
|
|
47
|
+
for (;;) {
|
|
48
|
+
const x = ia.next();
|
|
49
|
+
const y = ib.next();
|
|
50
|
+
if (x.done || y.done) return (x.done ? 0 : 1) - (y.done ? 0 : 1);
|
|
51
|
+
if (x.value !== y.value) return (x.value.codePointAt(0) ?? 0) - (y.value.codePointAt(0) ?? 0);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
43
54
|
const arrays = (expr) => {
|
|
44
55
|
expr.addTransform("count", (val) => expectArray(val, "count").length);
|
|
45
56
|
expr.addTransform("first", (val) => expectArray(val, "first")[0]);
|
|
@@ -54,12 +65,13 @@ const arrays = (expr) => {
|
|
|
54
65
|
expr.addTransform("sort", (val) => {
|
|
55
66
|
return [...expectArray(val, "sort")].sort((a, b) => {
|
|
56
67
|
if (typeof a === "number" && typeof b === "number") return a - b;
|
|
57
|
-
return String(a)
|
|
68
|
+
return compareCodePoints(String(a), String(b));
|
|
58
69
|
});
|
|
59
70
|
});
|
|
60
71
|
expr.addTransform("filter", (val, predicate) => {
|
|
61
72
|
const arr = expectArray(val, "filter");
|
|
62
|
-
if (
|
|
73
|
+
if (predicate === void 0) return arr.filter(Boolean);
|
|
74
|
+
if (typeof predicate !== "function") throw new BonsaiTypeError("filter", LAMBDA_EXPECTED, predicate);
|
|
63
75
|
const fn = predicate;
|
|
64
76
|
const results = arr.map(fn);
|
|
65
77
|
if (hasPromises(results)) return Promise.all(results).then((resolved) => arr.filter((_, i) => resolved[i]));
|
|
@@ -67,13 +79,15 @@ const arrays = (expr) => {
|
|
|
67
79
|
});
|
|
68
80
|
expr.addTransform("map", (val, fn) => {
|
|
69
81
|
const arr = expectArray(val, "map");
|
|
70
|
-
if (
|
|
82
|
+
if (fn === void 0) return arr;
|
|
83
|
+
if (typeof fn !== "function") throw new BonsaiTypeError("map", LAMBDA_EXPECTED, fn);
|
|
71
84
|
const results = arr.map(fn);
|
|
72
85
|
return hasPromises(results) ? Promise.all(results) : results;
|
|
73
86
|
});
|
|
74
87
|
expr.addTransform("find", (val, predicate) => {
|
|
75
88
|
const arr = expectArray(val, "find");
|
|
76
|
-
if (
|
|
89
|
+
if (predicate === void 0) return void 0;
|
|
90
|
+
if (typeof predicate !== "function") throw new BonsaiTypeError("find", LAMBDA_EXPECTED, predicate);
|
|
77
91
|
const fn = predicate;
|
|
78
92
|
const results = arr.map(fn);
|
|
79
93
|
if (hasPromises(results)) return Promise.all(results).then((resolved) => {
|
|
@@ -85,7 +99,8 @@ const arrays = (expr) => {
|
|
|
85
99
|
});
|
|
86
100
|
expr.addTransform("some", (val, predicate) => {
|
|
87
101
|
const arr = expectArray(val, "some");
|
|
88
|
-
if (
|
|
102
|
+
if (predicate === void 0) return arr.some(Boolean);
|
|
103
|
+
if (typeof predicate !== "function") throw new BonsaiTypeError("some", LAMBDA_EXPECTED, predicate);
|
|
89
104
|
const fn = predicate;
|
|
90
105
|
const results = arr.map(fn);
|
|
91
106
|
if (hasPromises(results)) return Promise.all(results).then((resolved) => resolved.some(Boolean));
|
|
@@ -93,7 +108,8 @@ const arrays = (expr) => {
|
|
|
93
108
|
});
|
|
94
109
|
expr.addTransform("every", (val, predicate) => {
|
|
95
110
|
const arr = expectArray(val, "every");
|
|
96
|
-
if (
|
|
111
|
+
if (predicate === void 0) return arr.every(Boolean);
|
|
112
|
+
if (typeof predicate !== "function") throw new BonsaiTypeError("every", LAMBDA_EXPECTED, predicate);
|
|
97
113
|
const fn = predicate;
|
|
98
114
|
const results = arr.map(fn);
|
|
99
115
|
if (hasPromises(results)) return Promise.all(results).then((resolved) => resolved.every(Boolean));
|
|
@@ -122,9 +138,17 @@ const math = (expr) => {
|
|
|
122
138
|
if (arr.length === 0) return 0;
|
|
123
139
|
return arr.reduce((a, b) => a + b, 0) / arr.length;
|
|
124
140
|
});
|
|
125
|
-
expr.addTransform("clamp", (val, min, max) =>
|
|
126
|
-
|
|
127
|
-
|
|
141
|
+
expr.addTransform("clamp", (val, min, max) => {
|
|
142
|
+
const v = expectNumber$1(val, "clamp");
|
|
143
|
+
const lo = expectNumber$1(min, "clamp");
|
|
144
|
+
const hi = expectNumber$1(max, "clamp");
|
|
145
|
+
if (!Number.isFinite(lo)) throw new BonsaiTypeError("clamp", "a finite number for min", min);
|
|
146
|
+
if (!Number.isFinite(hi)) throw new BonsaiTypeError("clamp", "a finite number for max", max);
|
|
147
|
+
if (lo > hi) throw new BonsaiTypeError("clamp", "min to be <= max", max);
|
|
148
|
+
return Math.min(Math.max(v, lo), hi);
|
|
149
|
+
});
|
|
150
|
+
expr.addFunction("min", (...args) => args.length === 0 ? void 0 : Math.min(...args.map((a) => expectNumber$1(a, "min"))));
|
|
151
|
+
expr.addFunction("max", (...args) => args.length === 0 ? void 0 : Math.max(...args.map((a) => expectNumber$1(a, "max"))));
|
|
128
152
|
};
|
|
129
153
|
//#endregion
|
|
130
154
|
//#region src/stdlib/types.ts
|
|
@@ -156,7 +180,15 @@ const dates = (expr) => {
|
|
|
156
180
|
const fmt = expectString(format, "formatDate");
|
|
157
181
|
const PAD_WIDTH = 2;
|
|
158
182
|
const pad = (n) => String(n).padStart(PAD_WIDTH, "0");
|
|
159
|
-
|
|
183
|
+
const parts = {
|
|
184
|
+
YYYY: String(date.getUTCFullYear()),
|
|
185
|
+
MM: pad(date.getUTCMonth() + 1),
|
|
186
|
+
DD: pad(date.getUTCDate()),
|
|
187
|
+
HH: pad(date.getUTCHours()),
|
|
188
|
+
mm: pad(date.getUTCMinutes()),
|
|
189
|
+
ss: pad(date.getUTCSeconds())
|
|
190
|
+
};
|
|
191
|
+
return fmt.replace(/YYYY|MM|DD|HH|mm|ss/gu, (token) => parts[token]);
|
|
160
192
|
});
|
|
161
193
|
expr.addTransform("diffDays", (val, other) => {
|
|
162
194
|
return Math.abs(Math.round((expectNumber(val, "diffDays") - expectNumber(other, "diffDays")) / 864e5));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["expectString","expectNumber"],"sources":["../../src/stdlib/strings.ts","../../src/stdlib/arrays.ts","../../src/stdlib/math.ts","../../src/stdlib/types.ts","../../src/stdlib/dates.ts","../../src/stdlib/index.ts"],"sourcesContent":["import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectString(val: unknown, name: string): string {\n if (typeof val !== 'string') throw new BonsaiTypeError(name, 'a string', val)\n return val\n}\n\nconst MAX_STRING_LENGTH = 100_000\n\nexport const strings: BonsaiPlugin = (expr) => {\n expr.addTransform('upper', (val: unknown) => expectString(val, 'upper').toUpperCase())\n expr.addTransform('lower', (val: unknown) => expectString(val, 'lower').toLowerCase())\n expr.addTransform('trim', (val: unknown) => expectString(val, 'trim').trim())\n expr.addTransform('split', (val: unknown, sep: unknown) => {\n if (sep === undefined) throw new BonsaiTypeError('split', 'a separator argument', sep)\n return expectString(val, 'split').split(String(sep))\n })\n expr.addTransform('replace', (val: unknown, search: unknown, replacement: unknown) =>\n expectString(val, 'replace').replace(String(search), String(replacement)))\n expr.addTransform('replaceAll', (val: unknown, search: unknown, replacement: unknown) =>\n expectString(val, 'replaceAll').replaceAll(String(search), String(replacement)))\n expr.addTransform('startsWith', (val: unknown, search: unknown) => expectString(val, 'startsWith').startsWith(String(search)))\n expr.addTransform('endsWith', (val: unknown, search: unknown) => expectString(val, 'endsWith').endsWith(String(search)))\n expr.addTransform('includes', (val: unknown, search: unknown) => expectString(val, 'includes').includes(String(search)))\n expr.addTransform('padStart', (val: unknown, length: unknown, fill: unknown) => {\n const len = Number(length)\n if (!Number.isFinite(len) || len < 0) throw new BonsaiTypeError('padStart', 'a non-negative number for length', length)\n if (len > MAX_STRING_LENGTH) throw new BonsaiTypeError('padStart', `a length ≤ ${MAX_STRING_LENGTH}`, length)\n return expectString(val, 'padStart').padStart(len, fill === undefined ? ' ' : String(fill))\n })\n expr.addTransform('padEnd', (val: unknown, length: unknown, fill: unknown) => {\n const len = Number(length)\n if (!Number.isFinite(len) || len < 0) throw new BonsaiTypeError('padEnd', 'a non-negative number for length', length)\n if (len > MAX_STRING_LENGTH) throw new BonsaiTypeError('padEnd', `a length ≤ ${MAX_STRING_LENGTH}`, length)\n return expectString(val, 'padEnd').padEnd(len, fill === undefined ? ' ' : String(fill))\n })\n}\n","import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectArray(val: unknown, name: string): unknown[] {\n if (!Array.isArray(val)) throw new BonsaiTypeError(name, 'an array', val)\n return val\n}\n\nfunction hasPromises(results: unknown[]): boolean {\n return results.some(r => r instanceof Promise)\n}\n\nexport const arrays: BonsaiPlugin = (expr) => {\n expr.addTransform('count', (val: unknown) => expectArray(val, 'count').length)\n expr.addTransform('first', (val: unknown) => expectArray(val, 'first')[0])\n expr.addTransform('last', (val: unknown) => {\n const arr = expectArray(val, 'last')\n return arr[arr.length - 1]\n })\n expr.addTransform('reverse', (val: unknown) => [...expectArray(val, 'reverse')].reverse())\n expr.addTransform('flatten', (val: unknown) => expectArray(val, 'flatten').flat())\n expr.addTransform('unique', (val: unknown) => [...new Set(expectArray(val, 'unique'))])\n expr.addTransform('join', (val: unknown, sep: unknown) => expectArray(val, 'join').join(String(sep ?? ',')))\n expr.addTransform('sort', (val: unknown) => {\n const arr = [...expectArray(val, 'sort')]\n return arr.sort((a, b) => {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n return String(a).localeCompare(String(b))\n })\n })\n\n expr.addTransform('filter', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'filter')\n if (typeof predicate !== 'function') return arr.filter(Boolean)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => arr.filter((_, i) => resolved[i]))\n }\n return arr.filter((_, i) => results[i])\n })\n\n expr.addTransform('map', (val: unknown, fn: unknown) => {\n const arr = expectArray(val, 'map')\n if (typeof fn !== 'function') return arr\n const results = arr.map(fn as (item: unknown) => unknown)\n return hasPromises(results) ? Promise.all(results) : results\n })\n\n expr.addTransform('find', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'find')\n if (typeof predicate !== 'function') return undefined\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => {\n const idx = resolved.findIndex(Boolean)\n return idx >= 0 ? arr[idx] : undefined\n })\n }\n const idx = results.findIndex(Boolean)\n return idx >= 0 ? arr[idx] : undefined\n })\n\n expr.addTransform('some', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'some')\n if (typeof predicate !== 'function') return arr.some(Boolean)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => resolved.some(Boolean))\n }\n return results.some(Boolean)\n })\n\n expr.addTransform('every', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'every')\n if (typeof predicate !== 'function') return arr.every(Boolean)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => resolved.every(Boolean))\n }\n return results.every(Boolean)\n })\n}\n","import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectNumber(val: unknown, name: string): number {\n if (typeof val !== 'number') throw new BonsaiTypeError(name, 'a number', val)\n return val\n}\n\nfunction expectNumberArray(val: unknown, name: string): number[] {\n if (!Array.isArray(val)) throw new BonsaiTypeError(name, 'an array of numbers', val)\n for (const item of val) {\n if (typeof item !== 'number') throw new BonsaiTypeError(name, 'an array of numbers (all elements must be numbers)', item)\n }\n return val as number[]\n}\n\nexport const math: BonsaiPlugin = (expr) => {\n expr.addTransform('round', (val: unknown) => Math.round(expectNumber(val, 'round')))\n expr.addTransform('floor', (val: unknown) => Math.floor(expectNumber(val, 'floor')))\n expr.addTransform('ceil', (val: unknown) => Math.ceil(expectNumber(val, 'ceil')))\n expr.addTransform('abs', (val: unknown) => Math.abs(expectNumber(val, 'abs')))\n expr.addTransform('sum', (val: unknown) => expectNumberArray(val, 'sum').reduce((a, b) => a + b, 0))\n expr.addTransform('avg', (val: unknown) => {\n const arr = expectNumberArray(val, 'avg')\n if (arr.length === 0) return 0\n return arr.reduce((a, b) => a + b, 0) / arr.length\n })\n expr.addTransform('clamp', (val: unknown, min: unknown, max: unknown) =>\n Math.min(Math.max(expectNumber(val, 'clamp'), expectNumber(min, 'clamp'), ), expectNumber(max, 'clamp')))\n\n expr.addFunction('min', (...args: unknown[]) => Math.min(...(args as number[])))\n expr.addFunction('max', (...args: unknown[]) => Math.max(...(args as number[])))\n}\n","import type { BonsaiPlugin } from '../types.js'\n\nexport const types: BonsaiPlugin = (expr) => {\n expr.addTransform('isString', (val: unknown) => typeof val === 'string')\n expr.addTransform('isNumber', (val: unknown) => typeof val === 'number')\n expr.addTransform('isArray', (val: unknown) => Array.isArray(val))\n expr.addTransform('isNull', (val: unknown) => val === null)\n expr.addTransform('toBool', (val: unknown) => Boolean(val))\n expr.addTransform('toNumber', (val: unknown) => Number(val))\n expr.addTransform('toString', (val: unknown) => String(val))\n}\n","import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectNumber(val: unknown, name: string): number {\n if (typeof val !== 'number') throw new BonsaiTypeError(name, 'a number (timestamp)', val)\n return val\n}\n\nfunction expectString(val: unknown, name: string): string {\n if (typeof val !== 'string') throw new BonsaiTypeError(name, 'a string', val)\n return val\n}\n\nexport const dates: BonsaiPlugin = (expr) => {\n expr.addFunction('now', () => Date.now())\n\n expr.addTransform('formatDate', (val: unknown, format: unknown) => {\n const ts = expectNumber(val, 'formatDate')\n const date = new Date(ts)\n if (isNaN(date.getTime())) throw new BonsaiTypeError('formatDate', 'a valid timestamp', ts)\n const fmt = expectString(format, 'formatDate')\n const PAD_WIDTH = 2\n const pad = (n: number) => String(n).padStart(PAD_WIDTH, '0')\n\n return fmt\n .replace('YYYY', String(date.getUTCFullYear()))\n .replace('MM', pad(date.getUTCMonth() + 1))\n .replace('DD', pad(date.getUTCDate()))\n .replace('HH', pad(date.getUTCHours()))\n .replace('mm', pad(date.getUTCMinutes()))\n .replace('ss', pad(date.getUTCSeconds()))\n })\n\n expr.addTransform('diffDays', (val: unknown, other: unknown) => {\n const msPerDay = 86_400_000\n return Math.abs(Math.round((expectNumber(val, 'diffDays') - expectNumber(other, 'diffDays')) / msPerDay))\n })\n}\n","/** String transforms: upper, lower, trim, split, replace, startsWith, endsWith, includes, padStart, padEnd. */\nexport { strings } from './strings.js'\n/** Array transforms: filter, map, find, some, every, sort, reverse, flatten, unique, join, first, last, count. */\nexport { arrays } from './arrays.js'\n/** Math transforms and functions: round, floor, ceil, abs, sum, avg, clamp, min, max. */\nexport { math } from './math.js'\n/** Type-checking transforms: isString, isNumber, isArray, isNull, toBool, toNumber, toString. */\nexport { types } from './types.js'\n/** Date transforms and functions: now, formatDate, diffDays. */\nexport { dates } from './dates.js'\n\nimport type { BonsaiPlugin } from '../types.js'\nimport { strings } from './strings.js'\nimport { arrays } from './arrays.js'\nimport { math } from './math.js'\nimport { types } from './types.js'\nimport { dates } from './dates.js'\n\n/** Convenience plugin that registers all standard library modules at once. */\nexport const all: BonsaiPlugin = (expr) => {\n expr.use(strings)\n expr.use(arrays)\n expr.use(math)\n expr.use(types)\n expr.use(dates)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["expectString","expectNumber"],"sources":["../../src/stdlib/strings.ts","../../src/stdlib/arrays.ts","../../src/stdlib/math.ts","../../src/stdlib/types.ts","../../src/stdlib/dates.ts","../../src/stdlib/index.ts"],"sourcesContent":["import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectString(val: unknown, name: string): string {\n if (typeof val !== 'string') throw new BonsaiTypeError(name, 'a string', val)\n return val\n}\n\nconst MAX_STRING_LENGTH = 100_000\n\nexport const strings: BonsaiPlugin = (expr) => {\n expr.addTransform('upper', (val: unknown) => expectString(val, 'upper').toUpperCase())\n expr.addTransform('lower', (val: unknown) => expectString(val, 'lower').toLowerCase())\n expr.addTransform('trim', (val: unknown) => expectString(val, 'trim').trim())\n expr.addTransform('split', (val: unknown, sep: unknown) => {\n if (sep === undefined) throw new BonsaiTypeError('split', 'a separator argument', sep)\n return expectString(val, 'split').split(String(sep))\n })\n expr.addTransform('replace', (val: unknown, search: unknown, replacement: unknown) =>\n expectString(val, 'replace').replace(String(search), String(replacement)))\n expr.addTransform('replaceAll', (val: unknown, search: unknown, replacement: unknown) =>\n expectString(val, 'replaceAll').replaceAll(String(search), String(replacement)))\n expr.addTransform('startsWith', (val: unknown, search: unknown) => expectString(val, 'startsWith').startsWith(String(search)))\n expr.addTransform('endsWith', (val: unknown, search: unknown) => expectString(val, 'endsWith').endsWith(String(search)))\n expr.addTransform('includes', (val: unknown, search: unknown) => expectString(val, 'includes').includes(String(search)))\n expr.addTransform('padStart', (val: unknown, length: unknown, fill: unknown) => {\n const len = Number(length)\n if (!Number.isFinite(len) || len < 0) throw new BonsaiTypeError('padStart', 'a non-negative number for length', length)\n if (len > MAX_STRING_LENGTH) throw new BonsaiTypeError('padStart', `a length ≤ ${MAX_STRING_LENGTH}`, length)\n return expectString(val, 'padStart').padStart(len, fill === undefined ? ' ' : String(fill))\n })\n expr.addTransform('padEnd', (val: unknown, length: unknown, fill: unknown) => {\n const len = Number(length)\n if (!Number.isFinite(len) || len < 0) throw new BonsaiTypeError('padEnd', 'a non-negative number for length', length)\n if (len > MAX_STRING_LENGTH) throw new BonsaiTypeError('padEnd', `a length ≤ ${MAX_STRING_LENGTH}`, length)\n return expectString(val, 'padEnd').padEnd(len, fill === undefined ? ' ' : String(fill))\n })\n}\n","import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectArray(val: unknown, name: string): unknown[] {\n if (!Array.isArray(val)) throw new BonsaiTypeError(name, 'an array', val)\n return val\n}\n\nfunction hasPromises(results: unknown[]): boolean {\n return results.some(r => r instanceof Promise)\n}\n\nconst LAMBDA_EXPECTED = 'a lambda or function callback (e.g. .field or . > value)'\n\n// Compare two strings by Unicode code point, deterministically and independent\n// of locale. String iteration yields whole code points (surrogate pairs as one\n// unit), so astral-plane characters order by their scalar value rather than by\n// the leading UTF-16 surrogate, which a plain `<` comparison would use.\nfunction compareCodePoints(a: string, b: string): number {\n const ia = a[Symbol.iterator]()\n const ib = b[Symbol.iterator]()\n for (;;) {\n const x = ia.next()\n const y = ib.next()\n if (x.done || y.done) return (x.done ? 0 : 1) - (y.done ? 0 : 1)\n if (x.value !== y.value) {\n return (x.value.codePointAt(0) ?? 0) - (y.value.codePointAt(0) ?? 0)\n }\n }\n}\n\nexport const arrays: BonsaiPlugin = (expr) => {\n expr.addTransform('count', (val: unknown) => expectArray(val, 'count').length)\n expr.addTransform('first', (val: unknown) => expectArray(val, 'first')[0])\n expr.addTransform('last', (val: unknown) => {\n const arr = expectArray(val, 'last')\n return arr[arr.length - 1]\n })\n expr.addTransform('reverse', (val: unknown) => [...expectArray(val, 'reverse')].reverse())\n expr.addTransform('flatten', (val: unknown) => expectArray(val, 'flatten').flat())\n expr.addTransform('unique', (val: unknown) => [...new Set(expectArray(val, 'unique'))])\n expr.addTransform('join', (val: unknown, sep: unknown) => expectArray(val, 'join').join(String(sep ?? ',')))\n expr.addTransform('sort', (val: unknown) => {\n const arr = [...expectArray(val, 'sort')]\n return arr.sort((a, b) => {\n if (typeof a === 'number' && typeof b === 'number') return a - b\n // Code-point comparison rather than localeCompare: deterministic across\n // runtimes/locales, which matters for a rules engine that must behave\n // identically everywhere. Iterating by code point (not the UTF-16\n // code-unit `<`) keeps astral-plane characters ordered by their actual\n // scalar value.\n return compareCodePoints(String(a), String(b))\n })\n })\n\n // Higher-order transforms. A `undefined` predicate selects the no-argument\n // default behavior (`|> filter` keeps truthy values, `|> map` is identity).\n // Any other non-function value is a mistake (e.g. `map(inc(.x))`, where the\n // lambda shorthand `.x` was passed to a function and evaluated to a value\n // rather than used as a callback) and fails loud rather than silently\n // returning the input.\n expr.addTransform('filter', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'filter')\n if (predicate === undefined) return arr.filter(Boolean)\n if (typeof predicate !== 'function') throw new BonsaiTypeError('filter', LAMBDA_EXPECTED, predicate)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => arr.filter((_, i) => resolved[i]))\n }\n return arr.filter((_, i) => results[i])\n })\n\n expr.addTransform('map', (val: unknown, fn: unknown) => {\n const arr = expectArray(val, 'map')\n if (fn === undefined) return arr\n if (typeof fn !== 'function') throw new BonsaiTypeError('map', LAMBDA_EXPECTED, fn)\n const results = arr.map(fn as (item: unknown) => unknown)\n return hasPromises(results) ? Promise.all(results) : results\n })\n\n expr.addTransform('find', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'find')\n if (predicate === undefined) return undefined\n if (typeof predicate !== 'function') throw new BonsaiTypeError('find', LAMBDA_EXPECTED, predicate)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => {\n const idx = resolved.findIndex(Boolean)\n return idx >= 0 ? arr[idx] : undefined\n })\n }\n const idx = results.findIndex(Boolean)\n return idx >= 0 ? arr[idx] : undefined\n })\n\n expr.addTransform('some', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'some')\n if (predicate === undefined) return arr.some(Boolean)\n if (typeof predicate !== 'function') throw new BonsaiTypeError('some', LAMBDA_EXPECTED, predicate)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => resolved.some(Boolean))\n }\n return results.some(Boolean)\n })\n\n expr.addTransform('every', (val: unknown, predicate: unknown) => {\n const arr = expectArray(val, 'every')\n if (predicate === undefined) return arr.every(Boolean)\n if (typeof predicate !== 'function') throw new BonsaiTypeError('every', LAMBDA_EXPECTED, predicate)\n const fn = predicate as (item: unknown) => unknown\n const results = arr.map(fn)\n if (hasPromises(results)) {\n return Promise.all(results).then(resolved => resolved.every(Boolean))\n }\n return results.every(Boolean)\n })\n}\n","import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectNumber(val: unknown, name: string): number {\n if (typeof val !== 'number') throw new BonsaiTypeError(name, 'a number', val)\n return val\n}\n\nfunction expectNumberArray(val: unknown, name: string): number[] {\n if (!Array.isArray(val)) throw new BonsaiTypeError(name, 'an array of numbers', val)\n for (const item of val) {\n if (typeof item !== 'number') throw new BonsaiTypeError(name, 'an array of numbers (all elements must be numbers)', item)\n }\n return val as number[]\n}\n\nexport const math: BonsaiPlugin = (expr) => {\n expr.addTransform('round', (val: unknown) => Math.round(expectNumber(val, 'round')))\n expr.addTransform('floor', (val: unknown) => Math.floor(expectNumber(val, 'floor')))\n expr.addTransform('ceil', (val: unknown) => Math.ceil(expectNumber(val, 'ceil')))\n expr.addTransform('abs', (val: unknown) => Math.abs(expectNumber(val, 'abs')))\n expr.addTransform('sum', (val: unknown) => expectNumberArray(val, 'sum').reduce((a, b) => a + b, 0))\n expr.addTransform('avg', (val: unknown) => {\n const arr = expectNumberArray(val, 'avg')\n if (arr.length === 0) return 0\n return arr.reduce((a, b) => a + b, 0) / arr.length\n })\n expr.addTransform('clamp', (val: unknown, min: unknown, max: unknown) => {\n const v = expectNumber(val, 'clamp')\n const lo = expectNumber(min, 'clamp')\n const hi = expectNumber(max, 'clamp')\n if (!Number.isFinite(lo)) throw new BonsaiTypeError('clamp', 'a finite number for min', min)\n if (!Number.isFinite(hi)) throw new BonsaiTypeError('clamp', 'a finite number for max', max)\n if (lo > hi) throw new BonsaiTypeError('clamp', 'min to be <= max', max)\n return Math.min(Math.max(v, lo), hi)\n })\n\n // Functions, not transforms: called as min(a, b, ...) / max(...arr). With no\n // arguments they return undefined (not Infinity/-Infinity), and every argument\n // is validated as a number rather than silently coerced.\n expr.addFunction('min', (...args: unknown[]) =>\n args.length === 0 ? undefined : Math.min(...args.map(a => expectNumber(a, 'min'))))\n expr.addFunction('max', (...args: unknown[]) =>\n args.length === 0 ? undefined : Math.max(...args.map(a => expectNumber(a, 'max'))))\n}\n","import type { BonsaiPlugin } from '../types.js'\n\nexport const types: BonsaiPlugin = (expr) => {\n expr.addTransform('isString', (val: unknown) => typeof val === 'string')\n expr.addTransform('isNumber', (val: unknown) => typeof val === 'number')\n expr.addTransform('isArray', (val: unknown) => Array.isArray(val))\n expr.addTransform('isNull', (val: unknown) => val === null)\n expr.addTransform('toBool', (val: unknown) => Boolean(val))\n expr.addTransform('toNumber', (val: unknown) => Number(val))\n expr.addTransform('toString', (val: unknown) => String(val))\n}\n","import type { BonsaiPlugin } from '../types.js'\nimport { BonsaiTypeError } from '../errors.js'\n\nfunction expectNumber(val: unknown, name: string): number {\n if (typeof val !== 'number') throw new BonsaiTypeError(name, 'a number (timestamp)', val)\n return val\n}\n\nfunction expectString(val: unknown, name: string): string {\n if (typeof val !== 'string') throw new BonsaiTypeError(name, 'a string', val)\n return val\n}\n\nexport const dates: BonsaiPlugin = (expr) => {\n expr.addFunction('now', () => Date.now())\n\n expr.addTransform('formatDate', (val: unknown, format: unknown) => {\n const ts = expectNumber(val, 'formatDate')\n const date = new Date(ts)\n if (isNaN(date.getTime())) throw new BonsaiTypeError('formatDate', 'a valid timestamp', ts)\n const fmt = expectString(format, 'formatDate')\n const PAD_WIDTH = 2\n const pad = (n: number) => String(n).padStart(PAD_WIDTH, '0')\n\n // Single global pass so every occurrence of a token is replaced (chained\n // String.replace only replaces the first match) and tokens cannot interfere\n // with each other's output.\n const parts: Record<string, string> = {\n YYYY: String(date.getUTCFullYear()),\n MM: pad(date.getUTCMonth() + 1),\n DD: pad(date.getUTCDate()),\n HH: pad(date.getUTCHours()),\n mm: pad(date.getUTCMinutes()),\n ss: pad(date.getUTCSeconds()),\n }\n return fmt.replace(/YYYY|MM|DD|HH|mm|ss/gu, token => parts[token])\n })\n\n expr.addTransform('diffDays', (val: unknown, other: unknown) => {\n const msPerDay = 86_400_000\n return Math.abs(Math.round((expectNumber(val, 'diffDays') - expectNumber(other, 'diffDays')) / msPerDay))\n })\n}\n","/** String transforms: upper, lower, trim, split, replace, startsWith, endsWith, includes, padStart, padEnd. */\nexport { strings } from './strings.js'\n/** Array transforms: filter, map, find, some, every, sort, reverse, flatten, unique, join, first, last, count. */\nexport { arrays } from './arrays.js'\n/** Math transforms and functions: round, floor, ceil, abs, sum, avg, clamp, min, max. */\nexport { math } from './math.js'\n/** Type-checking transforms: isString, isNumber, isArray, isNull, toBool, toNumber, toString. */\nexport { types } from './types.js'\n/** Date transforms and functions: now, formatDate, diffDays. */\nexport { dates } from './dates.js'\n\nimport type { BonsaiPlugin } from '../types.js'\nimport { strings } from './strings.js'\nimport { arrays } from './arrays.js'\nimport { math } from './math.js'\nimport { types } from './types.js'\nimport { dates } from './dates.js'\n\n/** Convenience plugin that registers all standard library modules at once. */\nexport const all: BonsaiPlugin = (expr) => {\n expr.use(strings)\n expr.use(arrays)\n expr.use(math)\n expr.use(types)\n expr.use(dates)\n}\n"],"mappings":"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"}
|
|
@@ -174,8 +174,10 @@ interface BonsaiOptions {
|
|
|
174
174
|
timeout?: number;
|
|
175
175
|
/** Maximum expression nesting depth. Default: 100. */
|
|
176
176
|
maxDepth?: number;
|
|
177
|
-
/** Maximum array
|
|
177
|
+
/** Maximum array size produced during evaluation (literals, spread, and array-returning methods). Default: 100,000. */
|
|
178
178
|
maxArrayLength?: number;
|
|
179
|
+
/** Maximum string size produced by a string-returning method (padStart, padEnd, repeat, join, concat, slice, ...). Default: 100,000. */
|
|
180
|
+
maxStringLength?: number;
|
|
179
181
|
/** Allowlist of property/method names expressions can access. */
|
|
180
182
|
allowedProperties?: string[];
|
|
181
183
|
/** Denylist of property/method names expressions cannot access. */
|
|
@@ -187,47 +189,87 @@ interface BonsaiOptions {
|
|
|
187
189
|
type TransformFn = (value: unknown, ...args: unknown[]) => unknown | Promise<unknown>;
|
|
188
190
|
/** A function is called directly by name: `myFunction(arg1, arg2)`. */
|
|
189
191
|
type FunctionFn = (...args: unknown[]) => unknown | Promise<unknown>;
|
|
190
|
-
/**
|
|
191
|
-
type
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
/** The shape of an evaluation context object. */
|
|
193
|
+
type BonsaiContext = object;
|
|
194
|
+
type EmptyContext = Record<never, never>;
|
|
195
|
+
/**
|
|
196
|
+
* Evaluation/compiled call sites only require a `context` argument when the
|
|
197
|
+
* instance context type has required keys. Untyped instances keep the current
|
|
198
|
+
* ergonomic `evaluateSync(expr)` / `compiled.evaluateSync()` behavior.
|
|
199
|
+
*/
|
|
200
|
+
type EvaluationContextArgs<TCtx extends BonsaiContext = Record<string, unknown>> = EmptyContext extends TCtx ? [context?: TCtx] : [context: TCtx];
|
|
201
|
+
/**
|
|
202
|
+
* A context-aware function. Receives the live evaluation context as its first
|
|
203
|
+
* parameter, followed by the call's argument values. The context is typed
|
|
204
|
+
* `Readonly<TCtx>` to signal read-only intent; it is passed by reference and is
|
|
205
|
+
* not copied or frozen, so treat it as read-only. Registered via
|
|
206
|
+
* {@link BonsaiInstance.addContextFunction}.
|
|
207
|
+
*/
|
|
208
|
+
type ContextFunctionFn<TCtx extends BonsaiContext = Record<string, unknown>> = (context: Readonly<TCtx>, ...args: unknown[]) => unknown | Promise<unknown>;
|
|
209
|
+
/** A plugin receives a Bonsai instance and extends it with transforms or functions. */
|
|
210
|
+
type BonsaiPlugin<TCtx extends BonsaiContext = Record<string, unknown>> = (instance: BonsaiInstance<TCtx>) => void;
|
|
211
|
+
/**
|
|
212
|
+
* Core Bonsai instance returned by `bonsai()`.
|
|
213
|
+
*
|
|
214
|
+
* The members below are intentionally declared with method signatures rather
|
|
215
|
+
* than property signatures (so `oxlint`'s `typescript/method-signature-style`
|
|
216
|
+
* is disabled for this package). Method signatures are bivariant in their
|
|
217
|
+
* parameters, and that bivariance is load-bearing: it is what lets a plugin
|
|
218
|
+
* typed against a narrower context (`BonsaiPlugin<Minimal>`) apply to an
|
|
219
|
+
* instance with a wider context (`bonsai<Wider>()`), and lets an untyped
|
|
220
|
+
* plugin apply to a typed instance. Property signatures enforce strict
|
|
221
|
+
* contravariance, which rejects both of those documented affordances (because
|
|
222
|
+
* `TCtx` flows into the `context` parameter of `evaluate`/`evaluateSync`/
|
|
223
|
+
* `compile`). See the plugin-widening tests in `tests/context-functions*.ts`.
|
|
224
|
+
*/
|
|
225
|
+
interface BonsaiInstance<TCtx extends BonsaiContext = Record<string, unknown>> {
|
|
194
226
|
/** Register a plugin that extends this instance with transforms/functions. */
|
|
195
|
-
use(plugin: BonsaiPlugin): this;
|
|
227
|
+
use(plugin: BonsaiPlugin<TCtx>): this;
|
|
196
228
|
/** Register a named transform for use with the pipe operator (`|>`). */
|
|
197
229
|
addTransform(name: string, fn: TransformFn): this;
|
|
198
230
|
/** Register a named function callable as `name(args)` in expressions. */
|
|
199
231
|
addFunction(name: string, fn: FunctionFn): this;
|
|
232
|
+
/**
|
|
233
|
+
* Register a context-aware function callable as `name(args)` in expressions.
|
|
234
|
+
* The function receives the live evaluation context as its first parameter
|
|
235
|
+
* (typed `Readonly<TCtx>` for read-only intent; passed by reference, not
|
|
236
|
+
* copied or frozen). Shares a namespace with {@link addFunction}: registering
|
|
237
|
+
* the same name with either method overwrites the previous registration.
|
|
238
|
+
*/
|
|
239
|
+
addContextFunction(name: string, fn: ContextFunctionFn<TCtx>): this;
|
|
200
240
|
/** Remove a previously registered transform. Returns true if it existed. */
|
|
201
241
|
removeTransform(name: string): boolean;
|
|
202
|
-
/** Remove a previously registered function. Returns true if it existed. */
|
|
242
|
+
/** Remove a previously registered function (pure or context-aware). Returns true if it existed. */
|
|
203
243
|
removeFunction(name: string): boolean;
|
|
204
244
|
/** Check whether a transform with the given name is registered. */
|
|
205
245
|
hasTransform(name: string): boolean;
|
|
206
|
-
/** Check whether a function with the given name is registered. */
|
|
246
|
+
/** Check whether a function (pure or context-aware) with the given name is registered. */
|
|
207
247
|
hasFunction(name: string): boolean;
|
|
248
|
+
/** Check whether a function with the given name was registered via {@link addContextFunction}. */
|
|
249
|
+
isContextFunction(name: string): boolean;
|
|
208
250
|
/** List all registered transform names. */
|
|
209
251
|
listTransforms(): string[];
|
|
210
|
-
/** List all registered function names. */
|
|
252
|
+
/** List all registered function names (both pure and context-aware). */
|
|
211
253
|
listFunctions(): string[];
|
|
212
254
|
/** Returns a read-only snapshot of the security policy for autocomplete filtering. */
|
|
213
255
|
getPolicy(): PolicySnapshot;
|
|
214
256
|
/** Clear the compiled expression and AST caches. */
|
|
215
257
|
clearCache(): void;
|
|
216
258
|
/** Pre-compile an expression for repeated evaluation. */
|
|
217
|
-
compile(expression: string): CompiledExpression
|
|
259
|
+
compile(expression: string): CompiledExpression<TCtx>;
|
|
218
260
|
/** Evaluate an expression asynchronously. Required when transforms/functions are async. */
|
|
219
|
-
evaluate<T = unknown>(expression: string,
|
|
261
|
+
evaluate<T = unknown>(expression: string, ...args: EvaluationContextArgs<TCtx>): Promise<T>;
|
|
220
262
|
/** Evaluate an expression synchronously. Throws if a transform/function returns a Promise. */
|
|
221
|
-
evaluateSync<T = unknown>(expression: string,
|
|
263
|
+
evaluateSync<T = unknown>(expression: string, ...args: EvaluationContextArgs<TCtx>): T;
|
|
222
264
|
/** Check if an expression is syntactically valid without evaluating it. */
|
|
223
265
|
validate(expression: string): ValidationResult;
|
|
224
266
|
}
|
|
225
267
|
/** A pre-compiled expression that can be evaluated repeatedly with different contexts. */
|
|
226
|
-
interface CompiledExpression {
|
|
268
|
+
interface CompiledExpression<TCtx extends BonsaiContext = Record<string, unknown>> {
|
|
227
269
|
/** Evaluate asynchronously. Required when transforms/functions are async. */
|
|
228
|
-
evaluate<T = unknown>(
|
|
270
|
+
evaluate<T = unknown>(...args: EvaluationContextArgs<TCtx>): Promise<T>;
|
|
229
271
|
/** Evaluate synchronously. Throws if a transform/function returns a Promise. */
|
|
230
|
-
evaluateSync<T = unknown>(
|
|
272
|
+
evaluateSync<T = unknown>(...args: EvaluationContextArgs<TCtx>): T;
|
|
231
273
|
/** The optimized AST after constant folding and dead branch elimination. */
|
|
232
274
|
readonly ast: ASTNode;
|
|
233
275
|
/** The original expression string. */
|
|
@@ -260,5 +302,5 @@ interface ValidationError {
|
|
|
260
302
|
formatted?: string;
|
|
261
303
|
}
|
|
262
304
|
//#endregion
|
|
263
|
-
export {
|
|
264
|
-
//# sourceMappingURL=types-
|
|
305
|
+
export { BonsaiPlugin as a, ExpressionReferences as c, PolicySnapshot as d, ResolveResult as f, ValidationResult as g, TransformFn as h, BonsaiOptions as i, FunctionFn as l, TokenType as m, BonsaiContext as n, CompiledExpression as o, Token as p, BonsaiInstance as r, ContextFunctionFn as s, ASTNode as t, InferredTypeName as u };
|
|
306
|
+
//# sourceMappingURL=types-DkXfy5IJ.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-DkXfy5IJ.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;KAGY,gBAAA;;UAKK,cAAA;EAAA,SACN,iBAAA;EAAA,SACA,gBAAgB;AAAA;;KAMf,aAAA;EACN,KAAA;EAAa,KAAA;AAAA;EACb,KAAA;EAAc,MAAA;AAAA;AAAA,KAYR,cAAA;AAAA,KAOA,aAAA;AAAA,KACA,wBAAA,GAA2B,OAAO,CAAC,cAAA;AAAA,KAEnC,aAAA,GAAgB,cAAA,GAAiB,aAAa;AAAA,KAE9C,gBAAA;AAAA,UAEF,SAAA;EACR,KAAA;EACA,GAAG;AAAA;AAAA,KAGO,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,KAAK;AAAA,UAInB,QAAA;EACR,KAAA;EACA,GAAG;AAAA;AAAA,UAGY,aAAA,SAAsB,QAAQ;EAC7C,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,QAAQ;EAC7C,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA,SAAuB,QAAQ;EAC9C,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA,SAAoB,QAAQ;EAC3C,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAQ;EAChD,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,QAAQ;EAC1C,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,QAAQ;EAC7C,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,QAAQ;EAC7C,IAAA;EACA,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,cAAA,SAAuB,QAAQ;EAC9C,IAAA;EACA,QAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAQ;EAChD,IAAA;EACA,IAAA,EAAM,OAAA;AAAA;AAAA,UAGS,cAAA,SAAuB,QAAQ;EAC9C,IAAI;AAAA;AAAA,KAGM,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;EArH2B;EAuH1C,OAAA;EAtHA;EAwHA,QAAA;EAvHI;EAyHJ,cAAA;EAtHe;EAwHf,eAAA;;EAEA,iBAAA;EAvHM;EAyHN,gBAAA;EA5HwC;EA8HxC,SAAA;AAAA;;KAIU,WAAA,IAAe,KAAA,cAAmB,IAAA,0BAA8B,OAAO;;KAGvE,UAAA,OAAiB,IAAA,0BAA8B,OAAO;;KAGtD,aAAA;AAAA,KACP,YAAA,GAAe,MAAM;;;AArIV;AAGhB;;KAyIY,qBAAA,cAAmC,aAAA,GAAgB,MAAA,qBAC7D,YAAA,SAAqB,IAAA,IAAQ,OAAA,GAAU,IAAA,KAAS,OAAA,EAAS,IAAA;;;;;;;;KAS/C,iBAAA,cAA+B,aAAA,GAAgB,MAAA,sBACxD,OAAA,EAAS,QAAA,CAAS,IAAA,MAAU,IAAA,0BAA8B,OAAA;;KAcjD,YAAA,cAA0B,aAAA,GAAgB,MAAA,sBACnD,QAAA,EAAU,cAAA,CAAe,IAAA;;;;;;;;AAzJR;AAGpB;;;;;;UAsKiB,cAAA,cAA4B,aAAA,GAAgB,MAAA;EAtKX;EAwKhD,GAAA,CAAI,MAAA,EAAQ,YAAA,CAAa,IAAA;EAvKzB;EAyKA,YAAA,CAAa,IAAA,UAAc,EAAA,EAAI,WAAA;EAxKvB;EA0KR,WAAA,CAAY,IAAA,UAAc,EAAA,EAAI,UAAA;EAzKpB;;;AACF;AAGV;;;EA6KE,kBAAA,CAAmB,IAAA,UAAc,EAAA,EAAI,iBAAA,CAAkB,IAAA;EA1K7C;EA4KV,eAAA,CAAgB,IAAA;EA/KwC;EAiLxD,cAAA,CAAe,IAAA;EAjLiC;EAmLhD,YAAA,CAAa,IAAA;EAjLb;EAmLA,WAAA,CAAY,IAAA;EAlLZ;EAoLA,iBAAA,CAAkB,IAAA;EAnLlB;EAqLA,cAAA;EArLQ;EAuLR,aAAA;EApL4B;EAsL5B,SAAA,IAAa,cAAA;EApLgB;EAsL7B,UAAA;EAxLoC;EA0LpC,OAAA,CAAQ,UAAA,WAAqB,kBAAA,CAAmB,IAAA;EA1LJ;EA4L5C,QAAA,cAAsB,UAAA,aAAuB,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,OAAA,CAAQ,CAAA;EA3LzF;EA6LA,YAAA,cAA0B,UAAA,aAAuB,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,CAAA;EA5LxD;EA8L7B,QAAA,CAAS,UAAA,WAAqB,gBAAA;AAAA;AA9LsB;AAAA,UAkMrC,kBAAA,cAAgC,aAAA,GAAgB,MAAA;EA/LlC;EAiM7B,QAAA,iBAAyB,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,OAAA,CAAQ,CAAA;EAjMxB;EAmM7C,YAAA,iBAA6B,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,CAAA;EAlMjE;EAAA,SAoMS,GAAA,EAAK,OAAA;EAnMgB;EAAA,SAqMrB,MAAA;AAAA;AAlMX;AAAA,UAsMiB,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;AA3MlB;AAAA,UA8MO,eAAA;EACf,OAAA;EACA,QAAA;IAAY,IAAA;IAAc,MAAA;EAAA;EAC1B,UAAA;EACA,SAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bonsai-js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "A safe, zero-dependency expression language for rules, filters, and templates",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -44,24 +44,50 @@
|
|
|
44
44
|
"bench:gate": "bun run scripts/perf-gate.ts",
|
|
45
45
|
"check:package": "bun run build && bun run scripts/check-package.ts",
|
|
46
46
|
"lint": "oxlint --deny-warnings src tests scripts",
|
|
47
|
+
"knip": "knip",
|
|
47
48
|
"typecheck": "tsc -p tsconfig.typecheck.json --noEmit",
|
|
48
49
|
"build:website": "bun website/build.ts",
|
|
49
50
|
"prepare": "test -n \"$CI\" || lefthook install",
|
|
50
|
-
"prepublishOnly": "bun run lint && bun run typecheck && bun run test && bun run bench:gate && bun run check:package"
|
|
51
|
+
"prepublishOnly": "bun run lint && bun run typecheck && bun run test && bun run bench:gate && bun run check:package",
|
|
52
|
+
"test:coverage": "vitest run --coverage"
|
|
51
53
|
},
|
|
52
|
-
"keywords": [
|
|
54
|
+
"keywords": [
|
|
55
|
+
"expression",
|
|
56
|
+
"evaluator",
|
|
57
|
+
"parser",
|
|
58
|
+
"safe",
|
|
59
|
+
"sandbox",
|
|
60
|
+
"template",
|
|
61
|
+
"pipe",
|
|
62
|
+
"transform",
|
|
63
|
+
"formula",
|
|
64
|
+
"dsl",
|
|
65
|
+
"ast",
|
|
66
|
+
"jexl",
|
|
67
|
+
"compiler"
|
|
68
|
+
],
|
|
53
69
|
"author": "Daniel Fry",
|
|
54
70
|
"license": "MIT",
|
|
55
71
|
"engines": {
|
|
56
|
-
"node": ">=
|
|
72
|
+
"node": ">=22"
|
|
57
73
|
},
|
|
58
74
|
"devDependencies": {
|
|
59
|
-
"@
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
75
|
+
"@arethetypeswrong/cli": "0.18.3",
|
|
76
|
+
"@fast-check/vitest": "0.4.1",
|
|
77
|
+
"@types/node": "22.19.19",
|
|
78
|
+
"@vitest/coverage-v8": "4.1.7",
|
|
79
|
+
"fast-check": "4.8.0",
|
|
80
|
+
"jexl": "2.3.0",
|
|
81
|
+
"knip": "6.14.2",
|
|
82
|
+
"lefthook": "2.1.8",
|
|
83
|
+
"oxlint": "1.67.0",
|
|
84
|
+
"tsdown": "0.22.0",
|
|
85
|
+
"typescript": "6.0.3",
|
|
86
|
+
"vitest": "4.1.7"
|
|
87
|
+
},
|
|
88
|
+
"overrides": {
|
|
89
|
+
"vite": "7.3.3",
|
|
90
|
+
"postcss": "8.5.11",
|
|
91
|
+
"picomatch": "4.0.4"
|
|
66
92
|
}
|
|
67
93
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors-t5i9AEaf.mjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import type { SourcePosition } from './types.js'\n\nconst NEWLINE_CODE = 10\n\nexport interface ErrorLocation {\n source: string\n start: number\n end: number\n}\n\n/** Syntax error thrown during parsing. Contains source location and formatted caret display. */\nexport class ExpressionError extends Error {\n readonly rawMessage: string\n readonly start: number\n readonly end: number\n readonly source: string\n readonly suggestion?: string\n\n constructor(\n message: string,\n location: ErrorLocation,\n suggestion?: string,\n ) {\n const formatted = formatError(message, location, suggestion)\n super(formatted)\n this.name = 'ExpressionError'\n this.rawMessage = message\n this.start = location.start\n this.end = location.end\n this.source = location.source\n this.suggestion = suggestion\n }\n}\n\n/** Runtime type error when a transform, function, or method receives an unexpected value type. */\nexport class BonsaiTypeError extends Error {\n readonly transform: string\n readonly expected: string\n readonly received: string\n location?: ErrorLocation\n formatted?: string\n\n constructor(transform: string, expected: string, value: unknown) {\n let received: string\n if (value === null) received = 'null'\n else if (value instanceof Promise) received = 'Promise'\n else if (Array.isArray(value)) received = 'array'\n else received = typeof value\n super(`\"${transform}\" expects ${expected}, got ${received}`)\n this.name = 'BonsaiTypeError'\n this.transform = transform\n this.expected = expected\n this.received = received\n }\n}\n\n/** Security violation: blocked property access, timeout, depth limit, or array size limit. */\nexport class BonsaiSecurityError extends Error {\n readonly code: string\n location?: ErrorLocation\n formatted?: string\n\n constructor(code: string, message: string) {\n super(message)\n this.name = 'BonsaiSecurityError'\n this.code = code\n }\n}\n\n/** Unknown transform, function, or method name. Includes a \"did you mean?\" suggestion when possible. */\nexport class BonsaiReferenceError extends Error {\n readonly identifier: string\n readonly kind: 'transform' | 'function' | 'method'\n readonly suggestion?: string\n location?: ErrorLocation\n formatted?: string\n\n constructor(kind: 'transform' | 'function' | 'method', identifier: string, suggestion?: string) {\n const msg = suggestion\n ? `Unknown ${kind} \"${identifier}\". Did you mean \"${suggestion}\"?`\n : `Unknown ${kind} \"${identifier}\"`\n super(msg)\n this.name = 'BonsaiReferenceError'\n this.identifier = identifier\n this.kind = kind\n this.suggestion = suggestion\n }\n}\n\nexport type BonsaiRuntimeError = BonsaiTypeError | BonsaiSecurityError | BonsaiReferenceError\nexport type BonsaiError = ExpressionError | BonsaiRuntimeError\n\nfunction clampOffset(source: string, offset: number): number {\n return Math.max(0, Math.min(offset, source.length))\n}\n\nfunction getLineStart(source: string, offset: number): number {\n let index = clampOffset(source, offset)\n while (index > 0 && source.charCodeAt(index - 1) !== NEWLINE_CODE) index--\n return index\n}\n\nfunction getLineEnd(source: string, offset: number): number {\n let index = clampOffset(source, offset)\n while (index < source.length && source.charCodeAt(index) !== NEWLINE_CODE) index++\n return index\n}\n\nexport function offsetToPosition(source: string, offset: number): SourcePosition {\n const safeOffset = clampOffset(source, offset)\n let line = 1\n let column = 1\n\n for (let index = 0; index < safeOffset; index++) {\n if (source.charCodeAt(index) === NEWLINE_CODE) {\n line++\n column = 1\n } else {\n column++\n }\n }\n\n return { line, column, offset: safeOffset }\n}\n\nexport function hasErrorLocation(error: unknown): error is BonsaiRuntimeError & { location: ErrorLocation } {\n return (\n (error instanceof BonsaiTypeError\n || error instanceof BonsaiSecurityError\n || error instanceof BonsaiReferenceError)\n && error.location !== undefined\n )\n}\n\nexport function attachLocation(error: unknown, source: string, start: number, end: number): void {\n if (error instanceof BonsaiTypeError || error instanceof BonsaiSecurityError || error instanceof BonsaiReferenceError) {\n if (!error.location) {\n error.location = { source, start, end }\n error.formatted = formatError(error.message, error.location)\n }\n }\n}\n\n/** Format an error message with source context, caret display, and position info. */\nexport function formatError(\n message: string,\n location: ErrorLocation,\n suggestion?: string,\n): string {\n const { source } = location\n const start = clampOffset(source, location.start)\n const rawEnd = clampOffset(source, location.end)\n const end = Math.max(start + 1, rawEnd)\n const startPos = offsetToPosition(source, start)\n const lineStart = getLineStart(source, start)\n const lineEnd = getLineEnd(source, start)\n const lineText = source.slice(lineStart, lineEnd)\n const caretStart = start - lineStart\n const caretEnd = Math.min(end, lineEnd)\n const caretLength = Math.max(1, caretEnd - start)\n const gutter = `${startPos.line} | `\n const padding = ' '.repeat(gutter.length + caretStart)\n const carets = '^'.repeat(caretLength)\n\n let result = `${message}\\n\\n${gutter}${lineText}\\n${padding}${carets}`\n\n if (suggestion) {\n result += ` Did you mean \"${suggestion}\"?`\n }\n\n result += `\\n\\nat line ${startPos.line}, column ${startPos.column} (offset ${start}-${end})`\n\n return result\n}\n\n/** Format any Bonsai error into a human-readable string with source context when available. */\nexport function formatBonsaiError(error: unknown): string {\n if (error instanceof ExpressionError) return error.message\n if (hasErrorLocation(error)) {\n return error.formatted ?? formatError(error.message, error.location)\n }\n if (error instanceof Error) return error.message\n return String(error)\n}\n\nconst MAX_SUGGEST_LENGTH = 64\n\nexport function suggest(\n input: string,\n known: string[],\n maxDistance = 2,\n): string | undefined {\n if (input.length > MAX_SUGGEST_LENGTH) return undefined\n let best: string | undefined\n let bestDistance = maxDistance + 1\n\n for (const candidate of known) {\n const distance = levenshtein(input, candidate)\n if (distance < bestDistance) {\n bestDistance = distance\n best = candidate\n }\n }\n\n return best\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0))\n\n for (let i = 0; i <= m; i++) dp[i][0] = i\n for (let j = 0; j <= n; j++) dp[0][j] = j\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1,\n dp[i][j - 1] + 1,\n dp[i - 1][j - 1] + cost,\n )\n }\n }\n\n return dp[m][n]\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execution-context-DqYC3L92.mjs","names":[],"sources":["../src/lexer.ts","../src/execution-context.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 { 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 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 /** Reset mutable state for reuse. Avoids allocating a new instance per evaluation. */\n reset(): void {\n this.stepCount = 0\n this.depth = 0\n this.deadline = this.policy.timeout ? this.now() + this.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"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-BhsZZsLY.d.mts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
|