bonsai-js 0.3.0 → 0.4.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 +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\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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"}
@@ -187,47 +187,87 @@ interface BonsaiOptions {
187
187
  type TransformFn = (value: unknown, ...args: unknown[]) => unknown | Promise<unknown>;
188
188
  /** A function is called directly by name: `myFunction(arg1, arg2)`. */
189
189
  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 {
190
+ /** The shape of an evaluation context object. */
191
+ type BonsaiContext = object;
192
+ type EmptyContext = Record<never, never>;
193
+ /**
194
+ * Evaluation/compiled call sites only require a `context` argument when the
195
+ * instance context type has required keys. Untyped instances keep the current
196
+ * ergonomic `evaluateSync(expr)` / `compiled.evaluateSync()` behavior.
197
+ */
198
+ type EvaluationContextArgs<TCtx extends BonsaiContext = Record<string, unknown>> = EmptyContext extends TCtx ? [context?: TCtx] : [context: TCtx];
199
+ /**
200
+ * A context-aware function. Receives the live evaluation context as its first
201
+ * parameter, followed by the call's argument values. The context is typed
202
+ * `Readonly<TCtx>` to signal read-only intent; it is passed by reference and is
203
+ * not copied or frozen, so treat it as read-only. Registered via
204
+ * {@link BonsaiInstance.addContextFunction}.
205
+ */
206
+ type ContextFunctionFn<TCtx extends BonsaiContext = Record<string, unknown>> = (context: Readonly<TCtx>, ...args: unknown[]) => unknown | Promise<unknown>;
207
+ /** A plugin receives a Bonsai instance and extends it with transforms or functions. */
208
+ type BonsaiPlugin<TCtx extends BonsaiContext = Record<string, unknown>> = (instance: BonsaiInstance<TCtx>) => void;
209
+ /**
210
+ * Core Bonsai instance returned by `bonsai()`.
211
+ *
212
+ * The members below are intentionally declared with method signatures rather
213
+ * than property signatures (so `oxlint`'s `typescript/method-signature-style`
214
+ * is disabled for this package). Method signatures are bivariant in their
215
+ * parameters, and that bivariance is load-bearing: it is what lets a plugin
216
+ * typed against a narrower context (`BonsaiPlugin<Minimal>`) apply to an
217
+ * instance with a wider context (`bonsai<Wider>()`), and lets an untyped
218
+ * plugin apply to a typed instance. Property signatures enforce strict
219
+ * contravariance, which rejects both of those documented affordances (because
220
+ * `TCtx` flows into the `context` parameter of `evaluate`/`evaluateSync`/
221
+ * `compile`). See the plugin-widening tests in `tests/context-functions*.ts`.
222
+ */
223
+ interface BonsaiInstance<TCtx extends BonsaiContext = Record<string, unknown>> {
194
224
  /** Register a plugin that extends this instance with transforms/functions. */
195
- use(plugin: BonsaiPlugin): this;
225
+ use(plugin: BonsaiPlugin<TCtx>): this;
196
226
  /** Register a named transform for use with the pipe operator (`|>`). */
197
227
  addTransform(name: string, fn: TransformFn): this;
198
228
  /** Register a named function callable as `name(args)` in expressions. */
199
229
  addFunction(name: string, fn: FunctionFn): this;
230
+ /**
231
+ * Register a context-aware function callable as `name(args)` in expressions.
232
+ * The function receives the live evaluation context as its first parameter
233
+ * (typed `Readonly<TCtx>` for read-only intent; passed by reference, not
234
+ * copied or frozen). Shares a namespace with {@link addFunction}: registering
235
+ * the same name with either method overwrites the previous registration.
236
+ */
237
+ addContextFunction(name: string, fn: ContextFunctionFn<TCtx>): this;
200
238
  /** Remove a previously registered transform. Returns true if it existed. */
201
239
  removeTransform(name: string): boolean;
202
- /** Remove a previously registered function. Returns true if it existed. */
240
+ /** Remove a previously registered function (pure or context-aware). Returns true if it existed. */
203
241
  removeFunction(name: string): boolean;
204
242
  /** Check whether a transform with the given name is registered. */
205
243
  hasTransform(name: string): boolean;
206
- /** Check whether a function with the given name is registered. */
244
+ /** Check whether a function (pure or context-aware) with the given name is registered. */
207
245
  hasFunction(name: string): boolean;
246
+ /** Check whether a function with the given name was registered via {@link addContextFunction}. */
247
+ isContextFunction(name: string): boolean;
208
248
  /** List all registered transform names. */
209
249
  listTransforms(): string[];
210
- /** List all registered function names. */
250
+ /** List all registered function names (both pure and context-aware). */
211
251
  listFunctions(): string[];
212
252
  /** Returns a read-only snapshot of the security policy for autocomplete filtering. */
213
253
  getPolicy(): PolicySnapshot;
214
254
  /** Clear the compiled expression and AST caches. */
215
255
  clearCache(): void;
216
256
  /** Pre-compile an expression for repeated evaluation. */
217
- compile(expression: string): CompiledExpression;
257
+ compile(expression: string): CompiledExpression<TCtx>;
218
258
  /** Evaluate an expression asynchronously. Required when transforms/functions are async. */
219
- evaluate<T = unknown>(expression: string, context?: Record<string, unknown>): Promise<T>;
259
+ evaluate<T = unknown>(expression: string, ...args: EvaluationContextArgs<TCtx>): Promise<T>;
220
260
  /** Evaluate an expression synchronously. Throws if a transform/function returns a Promise. */
221
- evaluateSync<T = unknown>(expression: string, context?: Record<string, unknown>): T;
261
+ evaluateSync<T = unknown>(expression: string, ...args: EvaluationContextArgs<TCtx>): T;
222
262
  /** Check if an expression is syntactically valid without evaluating it. */
223
263
  validate(expression: string): ValidationResult;
224
264
  }
225
265
  /** A pre-compiled expression that can be evaluated repeatedly with different contexts. */
226
- interface CompiledExpression {
266
+ interface CompiledExpression<TCtx extends BonsaiContext = Record<string, unknown>> {
227
267
  /** Evaluate asynchronously. Required when transforms/functions are async. */
228
- evaluate<T = unknown>(context?: Record<string, unknown>): Promise<T>;
268
+ evaluate<T = unknown>(...args: EvaluationContextArgs<TCtx>): Promise<T>;
229
269
  /** Evaluate synchronously. Throws if a transform/function returns a Promise. */
230
- evaluateSync<T = unknown>(context?: Record<string, unknown>): T;
270
+ evaluateSync<T = unknown>(...args: EvaluationContextArgs<TCtx>): T;
231
271
  /** The optimized AST after constant folding and dead branch elimination. */
232
272
  readonly ast: ASTNode;
233
273
  /** The original expression string. */
@@ -260,5 +300,5 @@ interface ValidationError {
260
300
  formatted?: string;
261
301
  }
262
302
  //#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
303
+ 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 };
304
+ //# sourceMappingURL=types-C58c6SlH.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-BhsZZsLY.d.mts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types-C58c6SlH.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;KAGY,gBAAA;;UAKK,cAAA;EAAA,SACN,iBAAA;EAAA,SACA,gBAAA;AAAA;;KAMC,aAAA;EACN,KAAA;EAAa,KAAA;AAAA;EACb,KAAA;EAAc,MAAA;AAAA;AAAA,KAYR,cAAA;AAAA,KAOA,aAAA;AAAA,KACA,wBAAA,GAA2B,OAAA,CAAQ,cAAA;AAAA,KAEnC,aAAA,GAAgB,cAAA,GAAiB,aAAA;AAAA,KAEjC,gBAAA;AAAA,UAEF,SAAA;EACR,KAAA;EACA,GAAA;AAAA;AAAA,KAGU,KAAA;EACN,IAAA;EAAgB,KAAA;AAAA,IAAkB,SAAA;EAClC,IAAA;EAAgB,KAAA;AAAA,IAAkB,SAAA;EAClC,IAAA;EAAyB,KAAA;AAAA,IAAkB,SAAA;EAC3C,IAAA;EAAiB,KAAA;AAAA,IAA4B,SAAA;EAC7C,IAAA;EAAc,KAAA;AAAA,IAAkB,SAAA;EAChC,IAAA;EAAmB,KAAA;AAAA,IAAuB,SAAA;EAC1C,IAAA;EAAoB,KAAA;AAAA,IAAkB,SAAA;EACtC,IAAA;EAAkB,KAAA,EAAO,aAAA;AAAA,IAAkB,SAAA;EAC3C,IAAA;EAAqB,KAAA,EAAO,gBAAA;AAAA,IAAqB,SAAA;EACjD,IAAA;EAAc,KAAA;AAAA,IAAgB,SAAA;EAC9B,IAAA;EAAuB,KAAA;AAAA,IAAgB,SAAA;EACvC,IAAA;EAA2B,KAAA;AAAA,IAAgB,SAAA;EAC3C,IAAA;EAAgB,KAAA;AAAA,IAAiB,SAAA;EACjC,IAAA;EAAa,KAAA;AAAA,IAAc,SAAA;AAAA,KAErB,SAAA,GAAY,KAAA;AAAA,UAId,QAAA;EACR,KAAA;EACA,GAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,QAAA;EACrC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,aAAA,SAAsB,QAAA;EACrC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA,SAAoB,QAAA;EACnC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,UAAA,SAAmB,QAAA;EAClC,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,QAAA,EAAU,wBAAA;EACV,IAAA,EAAM,OAAA;EACN,KAAA,EAAO,OAAA;AAAA;AAAA,UAGQ,eAAA,SAAwB,QAAA;EACvC,IAAA;EACA,QAAA,EAAU,aAAA;EACV,OAAA,EAAS,OAAA;AAAA;AAAA,UAGM,qBAAA,SAA8B,QAAA;EAC7C,IAAA;EACA,IAAA,EAAM,OAAA;EACN,UAAA,EAAY,OAAA;EACZ,SAAA,EAAW,OAAA;AAAA;AAAA,UAGI,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,MAAA,EAAQ,OAAA;EACR,QAAA,EAAU,OAAA;EACV,QAAA;AAAA;AAAA,UAGe,wBAAA,SAAiC,QAAA;EAChD,IAAA;EACA,MAAA,EAAQ,OAAA;EACR,QAAA,EAAU,OAAA;EACV,QAAA;AAAA;AAAA,UAGe,YAAA,SAAqB,QAAA;EACpC,IAAA;EAAA,SACS,QAAA,YAAoB,OAAA,GAAU,aAAA;AAAA;AAAA,UAGxB,aAAA,SAAsB,QAAA;EACrC,IAAA;EAAA,SACS,UAAA,WAAqB,cAAA;AAAA;AAAA,UAGf,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,GAAA,EAAK,OAAA;EACL,KAAA,EAAO,OAAA;EACP,QAAA;AAAA;AAAA,UAGe,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,MAAA,EAAQ,OAAA;EAAA,SACC,IAAA,WAAe,OAAA;AAAA;AAAA,UAGT,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,KAAA,EAAO,OAAA;EACP,SAAA,EAAW,OAAA;AAAA;AAAA,UAGI,eAAA,SAAwB,QAAA;EACvC,IAAA;EAAA,SACS,KAAA,YAAiB,aAAA,GAAgB,OAAA;AAAA;AAAA,UAG3B,aAAA,SAAsB,QAAA;EACrC,IAAA;EACA,QAAA,EAAU,OAAA;AAAA;AAAA,UAGK,cAAA,SAAuB,QAAA;EACtC,IAAA;EACA,QAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,QAAA;EACxC,IAAA;EACA,IAAA,EAAM,OAAA;AAAA;AAAA,UAGS,cAAA,SAAuB,QAAA;EACtC,IAAA;AAAA;AAAA,KAGU,OAAA,GACR,aAAA,GACA,aAAA,GACA,cAAA,GACA,WAAA,GACA,gBAAA,GACA,UAAA,GACA,gBAAA,GACA,eAAA,GACA,qBAAA,GACA,gBAAA,GACA,wBAAA,GACA,YAAA,GACA,aAAA,GACA,cAAA,GACA,cAAA,GACA,eAAA,GACA,aAAA,GACA,cAAA,GACA,gBAAA,GACA,cAAA;;UAKa,aAAA;EArH2B;EAuH1C,OAAA;EAtHA;EAwHA,QAAA;EAvHI;EAyHJ,cAAA;EAtHe;EAwHf,iBAAA;;EAEA,gBAAA;EAvHM;EAyHN,SAAA;AAAA;;KAIU,WAAA,IAAe,KAAA,cAAmB,IAAA,0BAA8B,OAAA;;KAGhE,UAAA,OAAiB,IAAA,0BAA8B,OAAA;;KAG/C,aAAA;AAAA,KACP,YAAA,GAAe,MAAA;;;;;;KAOR,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;;;;;;;;;;;AApJ5B;;;;UAoKiB,cAAA,cAA4B,aAAA,GAAgB,MAAA;EApKnB;EAsKxC,GAAA,CAAI,MAAA,EAAQ,YAAA,CAAa,IAAA;EAtKuB;EAwKhD,YAAA,CAAa,IAAA,UAAc,EAAA,EAAI,WAAA;EAvK/B;EAyKA,WAAA,CAAY,IAAA,UAAc,EAAA,EAAI,UAAA;EAxKtB;;;;;;AAKV;EA2KE,kBAAA,CAAmB,IAAA,UAAc,EAAA,EAAI,iBAAA,CAAkB,IAAA;;EAEvD,eAAA,CAAgB,IAAA;EA1KN;EA4KV,cAAA,CAAe,IAAA;EA/KyC;EAiLxD,YAAA,CAAa,IAAA;EAjLmC;EAmLhD,WAAA,CAAY,IAAA;EAjLZ;EAmLA,iBAAA,CAAkB,IAAA;EAlLlB;EAoLA,cAAA;EAnLA;EAqLA,aAAA;EArLQ;EAuLR,SAAA,IAAa,cAAA;EApLe;EAsL5B,UAAA;EApL6B;EAsL7B,OAAA,CAAQ,UAAA,WAAqB,kBAAA,CAAmB,IAAA;EAxLZ;EA0LpC,QAAA,cAAsB,UAAA,aAAuB,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,OAAA,CAAQ,CAAA;EA1L7C;EA4L5C,YAAA,cAA0B,UAAA,aAAuB,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,CAAA;EA3LrF;EA6LA,QAAA,CAAS,UAAA,WAAqB,gBAAA;AAAA;;UAIf,kBAAA,cAAgC,aAAA,GAAgB,MAAA;EAhMX;EAkMpD,QAAA,iBAAyB,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,OAAA,CAAQ,CAAA;EA/LxC;EAiM7B,YAAA,iBAA6B,IAAA,EAAM,qBAAA,CAAsB,IAAA,IAAQ,CAAA;EAjMpB;EAAA,SAmMpC,GAAA,EAAK,OAAA;EAlMd;EAAA,SAoMS,MAAA;AAAA;;UAIM,oBAAA;EACf,WAAA;EACA,UAAA;EACA,SAAA;AAAA;;KAIU,gBAAA;EACN,KAAA;EAAa,MAAA;EAAY,GAAA,EAAK,OAAA;EAAS,UAAA,EAAY,oBAAA;AAAA;EACnD,KAAA;EAAc,MAAA,EAAQ,eAAA;AAAA;;UAGX,eAAA;EACf,OAAA;EACA,QAAA;IAAY,IAAA;IAAc,MAAA;EAAA;EAC1B,UAAA;EACA,SAAA;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bonsai-js",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "A safe, zero-dependency expression language for rules, filters, and templates",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -61,7 +61,7 @@
61
61
  "lefthook": "^2.1.3",
62
62
  "oxlint": "^1.51.0",
63
63
  "tsdown": "^0.21.0",
64
- "typescript": "^5.9.3",
64
+ "typescript": "^6.0.2",
65
65
  "vitest": "^4.0.18"
66
66
  }
67
67
  }