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.
- package/CHANGELOG.md +19 -5
- package/README.md +67 -7
- package/dist/autocomplete/index.d.mts +1 -1
- package/dist/autocomplete/index.mjs +8 -8
- package/dist/autocomplete/index.mjs.map +1 -1
- package/dist/{errors-t5i9AEaf.mjs → errors-BONB6P_5.mjs} +2 -3
- package/dist/{errors-t5i9AEaf.mjs.map → errors-BONB6P_5.mjs.map} +1 -1
- package/dist/{execution-context-DqYC3L92.mjs → execution-context-B-5hQ92X.mjs} +2 -2
- package/dist/{execution-context-DqYC3L92.mjs.map → execution-context-B-5hQ92X.mjs.map} +1 -1
- package/dist/index.d.mts +16 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +86 -32
- package/dist/index.mjs.map +1 -1
- package/dist/stdlib/index.d.mts +1 -1
- package/dist/stdlib/index.mjs +1 -1
- package/dist/stdlib/index.mjs.map +1 -1
- package/dist/{types-BhsZZsLY.d.mts → types-C58c6SlH.d.mts} +56 -16
- package/dist/{types-BhsZZsLY.d.mts.map → types-C58c6SlH.d.mts.map} +1 -1
- package/package.json +2 -2
|
@@ -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
|
-
/**
|
|
191
|
-
type
|
|
192
|
-
|
|
193
|
-
|
|
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,
|
|
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,
|
|
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>(
|
|
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>(
|
|
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 {
|
|
264
|
-
//# sourceMappingURL=types-
|
|
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-
|
|
1
|
+
{"version":3,"file":"types-C58c6SlH.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
|
+
"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": "^
|
|
64
|
+
"typescript": "^6.0.2",
|
|
65
65
|
"vitest": "^4.0.18"
|
|
66
66
|
}
|
|
67
67
|
}
|