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.
@@ -1,4 +1,4 @@
1
- import { r as BonsaiTypeError } from "../errors-t5i9AEaf.mjs";
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).localeCompare(String(b));
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 (typeof predicate !== "function") return arr.filter(Boolean);
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 (typeof fn !== "function") return arr;
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 (typeof predicate !== "function") return void 0;
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 (typeof predicate !== "function") return arr.some(Boolean);
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 (typeof predicate !== "function") return arr.every(Boolean);
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) => Math.min(Math.max(expectNumber$1(val, "clamp"), expectNumber$1(min, "clamp")), expectNumber$1(max, "clamp")));
126
- expr.addFunction("min", (...args) => Math.min(...args));
127
- expr.addFunction("max", (...args) => Math.max(...args));
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
- return fmt.replace("YYYY", String(date.getUTCFullYear())).replace("MM", pad(date.getUTCMonth() + 1)).replace("DD", pad(date.getUTCDate())).replace("HH", pad(date.getUTCHours())).replace("mm", pad(date.getUTCMinutes())).replace("ss", pad(date.getUTCSeconds()));
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":";;AAGA,SAASA,eAAa,KAAc,MAAsB;AACxD,KAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,gBAAgB,MAAM,YAAY,IAAI;AAC7E,QAAO;;AAGT,MAAM,oBAAoB;AAE1B,MAAa,WAAyB,SAAS;AAC7C,MAAK,aAAa,UAAU,QAAiBA,eAAa,KAAK,QAAQ,CAAC,aAAa,CAAC;AACtF,MAAK,aAAa,UAAU,QAAiBA,eAAa,KAAK,QAAQ,CAAC,aAAa,CAAC;AACtF,MAAK,aAAa,SAAS,QAAiBA,eAAa,KAAK,OAAO,CAAC,MAAM,CAAC;AAC7E,MAAK,aAAa,UAAU,KAAc,QAAiB;AACzD,MAAI,QAAQ,KAAA,EAAW,OAAM,IAAI,gBAAgB,SAAS,wBAAwB,IAAI;AACtF,SAAOA,eAAa,KAAK,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC;GACpD;AACF,MAAK,aAAa,YAAY,KAAc,QAAiB,gBAC3DA,eAAa,KAAK,UAAU,CAAC,QAAQ,OAAO,OAAO,EAAE,OAAO,YAAY,CAAC,CAAC;AAC5E,MAAK,aAAa,eAAe,KAAc,QAAiB,gBAC9DA,eAAa,KAAK,aAAa,CAAC,WAAW,OAAO,OAAO,EAAE,OAAO,YAAY,CAAC,CAAC;AAClF,MAAK,aAAa,eAAe,KAAc,WAAoBA,eAAa,KAAK,aAAa,CAAC,WAAW,OAAO,OAAO,CAAC,CAAC;AAC9H,MAAK,aAAa,aAAa,KAAc,WAAoBA,eAAa,KAAK,WAAW,CAAC,SAAS,OAAO,OAAO,CAAC,CAAC;AACxH,MAAK,aAAa,aAAa,KAAc,WAAoBA,eAAa,KAAK,WAAW,CAAC,SAAS,OAAO,OAAO,CAAC,CAAC;AACxH,MAAK,aAAa,aAAa,KAAc,QAAiB,SAAkB;EAC9E,MAAM,MAAM,OAAO,OAAO;AAC1B,MAAI,CAAC,OAAO,SAAS,IAAI,IAAI,MAAM,EAAG,OAAM,IAAI,gBAAgB,YAAY,oCAAoC,OAAO;AACvH,MAAI,MAAM,kBAAmB,OAAM,IAAI,gBAAgB,YAAY,cAAc,qBAAqB,OAAO;AAC7G,SAAOA,eAAa,KAAK,WAAW,CAAC,SAAS,KAAK,SAAS,KAAA,IAAY,MAAM,OAAO,KAAK,CAAC;GAC3F;AACF,MAAK,aAAa,WAAW,KAAc,QAAiB,SAAkB;EAC5E,MAAM,MAAM,OAAO,OAAO;AAC1B,MAAI,CAAC,OAAO,SAAS,IAAI,IAAI,MAAM,EAAG,OAAM,IAAI,gBAAgB,UAAU,oCAAoC,OAAO;AACrH,MAAI,MAAM,kBAAmB,OAAM,IAAI,gBAAgB,UAAU,cAAc,qBAAqB,OAAO;AAC3G,SAAOA,eAAa,KAAK,SAAS,CAAC,OAAO,KAAK,SAAS,KAAA,IAAY,MAAM,OAAO,KAAK,CAAC;GACvF;;;;ACjCJ,SAAS,YAAY,KAAc,MAAyB;AAC1D,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,OAAM,IAAI,gBAAgB,MAAM,YAAY,IAAI;AACzE,QAAO;;AAGT,SAAS,YAAY,SAA6B;AAChD,QAAO,QAAQ,MAAK,MAAK,aAAa,QAAQ;;AAGhD,MAAa,UAAwB,SAAS;AAC5C,MAAK,aAAa,UAAU,QAAiB,YAAY,KAAK,QAAQ,CAAC,OAAO;AAC9E,MAAK,aAAa,UAAU,QAAiB,YAAY,KAAK,QAAQ,CAAC,GAAG;AAC1E,MAAK,aAAa,SAAS,QAAiB;EAC1C,MAAM,MAAM,YAAY,KAAK,OAAO;AACpC,SAAO,IAAI,IAAI,SAAS;GACxB;AACF,MAAK,aAAa,YAAY,QAAiB,CAAC,GAAG,YAAY,KAAK,UAAU,CAAC,CAAC,SAAS,CAAC;AAC1F,MAAK,aAAa,YAAY,QAAiB,YAAY,KAAK,UAAU,CAAC,MAAM,CAAC;AAClF,MAAK,aAAa,WAAW,QAAiB,CAAC,GAAG,IAAI,IAAI,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;AACvF,MAAK,aAAa,SAAS,KAAc,QAAiB,YAAY,KAAK,OAAO,CAAC,KAAK,OAAO,OAAO,IAAI,CAAC,CAAC;AAC5G,MAAK,aAAa,SAAS,QAAiB;AAE1C,SADY,CAAC,GAAG,YAAY,KAAK,OAAO,CAAC,CAC9B,MAAM,GAAG,MAAM;AACxB,OAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,IAAI;AAC/D,UAAO,OAAO,EAAE,CAAC,cAAc,OAAO,EAAE,CAAC;IACzC;GACF;AAEF,MAAK,aAAa,WAAW,KAAc,cAAuB;EAChE,MAAM,MAAM,YAAY,KAAK,SAAS;AACtC,MAAI,OAAO,cAAc,WAAY,QAAO,IAAI,OAAO,QAAQ;EAC/D,MAAM,KAAK;EACX,MAAM,UAAU,IAAI,IAAI,GAAG;AAC3B,MAAI,YAAY,QAAQ,CACtB,QAAO,QAAQ,IAAI,QAAQ,CAAC,MAAK,aAAY,IAAI,QAAQ,GAAG,MAAM,SAAS,GAAG,CAAC;AAEjF,SAAO,IAAI,QAAQ,GAAG,MAAM,QAAQ,GAAG;GACvC;AAEF,MAAK,aAAa,QAAQ,KAAc,OAAgB;EACtD,MAAM,MAAM,YAAY,KAAK,MAAM;AACnC,MAAI,OAAO,OAAO,WAAY,QAAO;EACrC,MAAM,UAAU,IAAI,IAAI,GAAiC;AACzD,SAAO,YAAY,QAAQ,GAAG,QAAQ,IAAI,QAAQ,GAAG;GACrD;AAEF,MAAK,aAAa,SAAS,KAAc,cAAuB;EAC9D,MAAM,MAAM,YAAY,KAAK,OAAO;AACpC,MAAI,OAAO,cAAc,WAAY,QAAO,KAAA;EAC5C,MAAM,KAAK;EACX,MAAM,UAAU,IAAI,IAAI,GAAG;AAC3B,MAAI,YAAY,QAAQ,CACtB,QAAO,QAAQ,IAAI,QAAQ,CAAC,MAAK,aAAY;GAC3C,MAAM,MAAM,SAAS,UAAU,QAAQ;AACvC,UAAO,OAAO,IAAI,IAAI,OAAO,KAAA;IAC7B;EAEJ,MAAM,MAAM,QAAQ,UAAU,QAAQ;AACtC,SAAO,OAAO,IAAI,IAAI,OAAO,KAAA;GAC7B;AAEF,MAAK,aAAa,SAAS,KAAc,cAAuB;EAC9D,MAAM,MAAM,YAAY,KAAK,OAAO;AACpC,MAAI,OAAO,cAAc,WAAY,QAAO,IAAI,KAAK,QAAQ;EAC7D,MAAM,KAAK;EACX,MAAM,UAAU,IAAI,IAAI,GAAG;AAC3B,MAAI,YAAY,QAAQ,CACtB,QAAO,QAAQ,IAAI,QAAQ,CAAC,MAAK,aAAY,SAAS,KAAK,QAAQ,CAAC;AAEtE,SAAO,QAAQ,KAAK,QAAQ;GAC5B;AAEF,MAAK,aAAa,UAAU,KAAc,cAAuB;EAC/D,MAAM,MAAM,YAAY,KAAK,QAAQ;AACrC,MAAI,OAAO,cAAc,WAAY,QAAO,IAAI,MAAM,QAAQ;EAC9D,MAAM,KAAK;EACX,MAAM,UAAU,IAAI,IAAI,GAAG;AAC3B,MAAI,YAAY,QAAQ,CACtB,QAAO,QAAQ,IAAI,QAAQ,CAAC,MAAK,aAAY,SAAS,MAAM,QAAQ,CAAC;AAEvE,SAAO,QAAQ,MAAM,QAAQ;GAC7B;;;;ACjFJ,SAASC,eAAa,KAAc,MAAsB;AACxD,KAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,gBAAgB,MAAM,YAAY,IAAI;AAC7E,QAAO;;AAGT,SAAS,kBAAkB,KAAc,MAAwB;AAC/D,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,OAAM,IAAI,gBAAgB,MAAM,uBAAuB,IAAI;AACpF,MAAK,MAAM,QAAQ,IACjB,KAAI,OAAO,SAAS,SAAU,OAAM,IAAI,gBAAgB,MAAM,sDAAsD,KAAK;AAE3H,QAAO;;AAGT,MAAa,QAAsB,SAAS;AAC1C,MAAK,aAAa,UAAU,QAAiB,KAAK,MAAMA,eAAa,KAAK,QAAQ,CAAC,CAAC;AACpF,MAAK,aAAa,UAAU,QAAiB,KAAK,MAAMA,eAAa,KAAK,QAAQ,CAAC,CAAC;AACpF,MAAK,aAAa,SAAS,QAAiB,KAAK,KAAKA,eAAa,KAAK,OAAO,CAAC,CAAC;AACjF,MAAK,aAAa,QAAQ,QAAiB,KAAK,IAAIA,eAAa,KAAK,MAAM,CAAC,CAAC;AAC9E,MAAK,aAAa,QAAQ,QAAiB,kBAAkB,KAAK,MAAM,CAAC,QAAQ,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;AACpG,MAAK,aAAa,QAAQ,QAAiB;EACzC,MAAM,MAAM,kBAAkB,KAAK,MAAM;AACzC,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,SAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI;GAC5C;AACF,MAAK,aAAa,UAAU,KAAc,KAAc,QACtD,KAAK,IAAI,KAAK,IAAIA,eAAa,KAAK,QAAQ,EAAEA,eAAa,KAAK,QAAQ,CAAG,EAAEA,eAAa,KAAK,QAAQ,CAAC,CAAC;AAE3G,MAAK,YAAY,QAAQ,GAAG,SAAoB,KAAK,IAAI,GAAI,KAAkB,CAAC;AAChF,MAAK,YAAY,QAAQ,GAAG,SAAoB,KAAK,IAAI,GAAI,KAAkB,CAAC;;;;AC7BlF,MAAa,SAAuB,SAAS;AAC3C,MAAK,aAAa,aAAa,QAAiB,OAAO,QAAQ,SAAS;AACxE,MAAK,aAAa,aAAa,QAAiB,OAAO,QAAQ,SAAS;AACxE,MAAK,aAAa,YAAY,QAAiB,MAAM,QAAQ,IAAI,CAAC;AAClE,MAAK,aAAa,WAAW,QAAiB,QAAQ,KAAK;AAC3D,MAAK,aAAa,WAAW,QAAiB,QAAQ,IAAI,CAAC;AAC3D,MAAK,aAAa,aAAa,QAAiB,OAAO,IAAI,CAAC;AAC5D,MAAK,aAAa,aAAa,QAAiB,OAAO,IAAI,CAAC;;;;ACN9D,SAAS,aAAa,KAAc,MAAsB;AACxD,KAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,gBAAgB,MAAM,wBAAwB,IAAI;AACzF,QAAO;;AAGT,SAAS,aAAa,KAAc,MAAsB;AACxD,KAAI,OAAO,QAAQ,SAAU,OAAM,IAAI,gBAAgB,MAAM,YAAY,IAAI;AAC7E,QAAO;;AAGT,MAAa,SAAuB,SAAS;AAC3C,MAAK,YAAY,aAAa,KAAK,KAAK,CAAC;AAEzC,MAAK,aAAa,eAAe,KAAc,WAAoB;EACjE,MAAM,KAAK,aAAa,KAAK,aAAa;EAC1C,MAAM,OAAO,IAAI,KAAK,GAAG;AACzB,MAAI,MAAM,KAAK,SAAS,CAAC,CAAE,OAAM,IAAI,gBAAgB,cAAc,qBAAqB,GAAG;EAC3F,MAAM,MAAM,aAAa,QAAQ,aAAa;EAC9C,MAAM,YAAY;EAClB,MAAM,OAAO,MAAc,OAAO,EAAE,CAAC,SAAS,WAAW,IAAI;AAE7D,SAAO,IACJ,QAAQ,QAAQ,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAC9C,QAAQ,MAAM,IAAI,KAAK,aAAa,GAAG,EAAE,CAAC,CAC1C,QAAQ,MAAM,IAAI,KAAK,YAAY,CAAC,CAAC,CACrC,QAAQ,MAAM,IAAI,KAAK,aAAa,CAAC,CAAC,CACtC,QAAQ,MAAM,IAAI,KAAK,eAAe,CAAC,CAAC,CACxC,QAAQ,MAAM,IAAI,KAAK,eAAe,CAAC,CAAC;GAC3C;AAEF,MAAK,aAAa,aAAa,KAAc,UAAmB;AAE9D,SAAO,KAAK,IAAI,KAAK,OAAO,aAAa,KAAK,WAAW,GAAG,aAAa,OAAO,WAAW,IAD1E,MACuF,CAAC;GACzG;;;;;ACjBJ,MAAa,OAAqB,SAAS;AACzC,MAAK,IAAI,QAAQ;AACjB,MAAK,IAAI,OAAO;AAChB,MAAK,IAAI,KAAK;AACd,MAAK,IAAI,MAAM;AACf,MAAK,IAAI,MAAM"}
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 literal or spread size. Default: 100,000. */
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
- /** A plugin receives the Bonsai instance and extends it with transforms or functions. */
191
- type BonsaiPlugin = (instance: BonsaiInstance) => void;
192
- /** Core Bonsai instance returned by `bonsai()`. */
193
- interface BonsaiInstance {
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, context?: Record<string, unknown>): Promise<T>;
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, context?: Record<string, unknown>): T;
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>(context?: Record<string, unknown>): Promise<T>;
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>(context?: Record<string, unknown>): T;
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 { CompiledExpression as a, InferredTypeName as c, Token as d, TokenType as f, BonsaiPlugin as i, PolicySnapshot as l, ValidationResult as m, BonsaiInstance as n, ExpressionReferences as o, TransformFn as p, BonsaiOptions as r, FunctionFn as s, ASTNode as t, ResolveResult as u };
264
- //# sourceMappingURL=types-BhsZZsLY.d.mts.map
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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bonsai-js",
3
- "version": "0.3.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": ["expression", "evaluator", "parser", "safe", "sandbox", "template", "pipe", "transform", "formula", "dsl", "ast", "jexl", "compiler"],
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": ">=20"
72
+ "node": ">=22"
57
73
  },
58
74
  "devDependencies": {
59
- "@types/node": "^25.4.0",
60
- "jexl": "^2.3.0",
61
- "lefthook": "^2.1.3",
62
- "oxlint": "^1.51.0",
63
- "tsdown": "^0.21.0",
64
- "typescript": "^5.9.3",
65
- "vitest": "^4.0.18"
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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"}