From cbe69d7a0ab0a89d81d51f5357d31f84901a59fc Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:22:40 +0300 Subject: [PATCH 01/25] refactor(evaluator): print AST nodes as text Add a precedence-aware `stringify` that renders an AST node back into mathematical notation. Parentheses are derived from operator precedence and associativity rather than patched in afterwards with a regex. Not wired up yet - the existing solution stack still drives `solve`. Co-Authored-By: Claude Opus 5 (1M context) --- src/evaluator/solution.ts | 84 ++++++++++++++++++++++++++++++++++++++- tests/solution.test.ts | 62 +++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 tests/solution.test.ts diff --git a/src/evaluator/solution.ts b/src/evaluator/solution.ts index 72c03ad..d1fd1c3 100644 --- a/src/evaluator/solution.ts +++ b/src/evaluator/solution.ts @@ -1,4 +1,5 @@ -import { isBinaryOperator, isAlpha } from '../lexer/tokens'; +import { NODE, type INode } from '../parser'; +import { isBinaryOperator, isAlpha, SYMBOL } from '../lexer/tokens'; type ISolutionConfig = { id: number; @@ -116,3 +117,84 @@ function removeExtraParen(t: string): string { }); return t.startsWith('(') ? t.slice(1, -1) : t; } + +/** + * Operator precedence, used to decide where parentheses are required. + * Unary sits between `* /` and `^`: `-2^2` is `-(2^2)`, but `-2*3` is `(-2)*3`. + */ +const PRECEDENCE: Record = { + '+': 1, + '-': 1, + '*': 2, + '/': 2, + '^': 4 +}; + +const UNARY = 3; +const ATOM = 5; + +function precedence(node: INode): number { + if (node.type === NODE.BINARY) return PRECEDENCE[node.value] ?? ATOM; + if (node.type === NODE.UNARY) return UNARY; + return ATOM; +} + +/** + * A reduced literal can hold a negative value; `2 - -7` is valid but reads + * badly, and `-7 ^ 2` would parse back as `-(7 ^ 2)`. + */ +function isNegative(node: INode): boolean { + return node.type === NODE.LITERAL && node.value.startsWith('-'); +} + +/** + * Render an operand, parenthesizing it only when precedence or associativity + * demands it - `^` is right-associative, every other operator is left. + */ +function operand( + node: INode, + parent: number, + isRight = false, + rightAssoc = false +): string { + const child = precedence(node); + + const parens = + child < parent || + (child === parent && isRight !== rightAssoc) || + (isNegative(node) && (isRight || parent >= UNARY)); + + const text = stringify(node); + + return parens ? `(${text})` : text; +} + +/** + * Render an AST node as the mathematical notation it came from + */ +export function stringify(node: INode): string { + switch (node.type) { + case NODE.UNARY: + return node.value + operand(node.right!, UNARY); + + case NODE.BINARY: { + const parent = PRECEDENCE[node.value] ?? ATOM; + const rightAssoc = node.value === SYMBOL.POW; + + return [ + operand(node.left!, parent, false, rightAssoc), + node.value, + operand(node.right!, parent, true, rightAssoc) + ].join(' '); + } + + case NODE.CALL: + return `${node.value}(${node.arguments!.map(stringify).join(', ')})`; + + case NODE.ASSIGNMENT: + return `${node.left!.value} = ${stringify(node.right!)}`; + + default: + return node.value; + } +} diff --git a/tests/solution.test.ts b/tests/solution.test.ts new file mode 100644 index 0000000..0c9bb96 --- /dev/null +++ b/tests/solution.test.ts @@ -0,0 +1,62 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { tokenize } from '../src/lexer'; +import { type IContext, createContext } from '../src/context'; +import { parse } from '../src/parser'; +import { stringify } from '../src/evaluator/solution'; + +let ctx: IContext; + +beforeEach(() => { + ctx = createContext(); +}); + +function print(expr: string): string { + return stringify(parse(tokenize(ctx, expr)).body[0]); +} + +describe('stringify', () => { + test('keeps expressions that need no parentheses flat', () => { + expect(print('1+2')).toBe('1 + 2'); + expect(print('1 + 2 + 3')).toBe('1 + 2 + 3'); + expect(print('2*3/4')).toBe('2 * 3 / 4'); + expect(print('2*(3+4)-5')).toBe('2 * (3 + 4) - 5'); + }); + + test('parenthesizes by precedence', () => { + expect(print('(1+2)*3')).toBe('(1 + 2) * 3'); + expect(print('(1+2)*(3+4)')).toBe('(1 + 2) * (3 + 4)'); + expect(print('((1+2)*(3+4))/(5-3)')).toBe( + '(1 + 2) * (3 + 4) / (5 - 3)' + ); + }); + + test('parenthesizes right operands that are not left-associative', () => { + expect(print('1 - (2 - 3)')).toBe('1 - (2 - 3)'); + expect(print('2/(3*4)')).toBe('2 / (3 * 4)'); + expect(print('1 + (2 + 3)')).toBe('1 + (2 + 3)'); + }); + + test('renders unary expressions', () => { + expect(print('-(3+4)')).toBe('-(3 + 4)'); + expect(print('-x')).toBe('-x'); + expect(print('2 - -1')).toBe('2 - -1'); + }); + + test('renders calls with any number of arguments', () => { + expect(print('add(1,2,3)')).toBe('add(1, 2, 3)'); + expect(print('sqrt(16)')).toBe('sqrt(16)'); + expect(print('sin(cos(0))')).toBe('sin(cos(0))'); + expect(print('1 + add(2,3)')).toBe('1 + add(2, 3)'); + }); + + test('renders assignments', () => { + expect(print('x = 3sin(30)')).toBe('x = 3 * sin(30)'); + expect(print('y = 2(x + 1)')).toBe('y = 2 * (x + 1)'); + }); + + test('makes implicit multiplication explicit', () => { + expect(print('2x + 1')).toBe('2 * x + 1'); + expect(print('3pi - 1')).toBe('3 * pi - 1'); + expect(print('(1+3)2')).toBe('(1 + 3) * 2'); + }); +}); From 5dc033795bb9bbfde421c3d49ef281b71ae3ba29 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:26:25 +0300 Subject: [PATCH 02/25] refactor(evaluator)!: generate solutions by AST reduction Solutions were built from a flat string log: `evaluate` pushed partial text and `#N` markers into a WeakMap, and `buildSolution` rebuilt the steps by assuming `raw[i-2]` was an expression and `raw[i-1]` its result. That encoding was positional, so any node the evaluator did not explicitly instrument vanished from the output: add(1,2,3) -> ["6"] pow(2,3)+1 -> ["8 + 1", "9"] -(3+4) -> ["3 + 4", "-7"] Reduce the tree instead. Each step collapses every sub-expression whose operands are already values, and the resulting tree is printed with `stringify`. This is uniform over every node type, so calls of any arity and unary expressions can no longer drop out, and parentheses come from precedence rather than a regex. add(1,2,3) -> ["add(1, 2, 3)", "6"] pow(2,3)+1 -> ["pow(2, 3) + 1", "8 + 1", "9"] -(3+4) -> ["-(3 + 4)", "-7"] Assignments no longer repeat their value on a final bare line, which drops the `steps.pop()` workaround in the demo. Names are resolved to values up front, which is also where an unknown variable is now reported instead of silently evaluating to 0. BREAKING CHANGE: `createSolutionStack` and `ISolution` are removed, and `evaluate` no longer takes a solution argument. Use `explain(ctx, node)` to get `{ value, solution }` for a single node; `solve` and `solveBatch` are unchanged. Unknown variables now throw a RuntimeError. Co-Authored-By: Claude Opus 5 (1M context) --- demo/main.ts | 17 +- src/evaluator/index.ts | 317 +++++++++++++++++++++++--------------- src/evaluator/solution.ts | 119 +------------- src/index.ts | 6 +- src/safe.ts | 14 +- src/solve.ts | 15 +- tests/context.test.ts | 9 +- tests/evaluator.test.ts | 25 +-- tests/safe.test.ts | 9 +- 9 files changed, 237 insertions(+), 294 deletions(-) diff --git a/demo/main.ts b/demo/main.ts index 7bc0811..33bd213 100644 --- a/demo/main.ts +++ b/demo/main.ts @@ -1,10 +1,9 @@ import { tokenize } from '../src/lexer'; import { parse } from '../src/parser'; -import { evaluate } from '../src/evaluator'; +import { explain } from '../src/evaluator'; import { renderTokensAsHTML } from '../src/render/html'; // import { renderTokensAsLaTeX } from '../src/render/latex'; import { createContext } from '../src/context'; -import { createSolutionStack } from '../src/evaluator/solution'; const input = document.querySelector('textarea')!; @@ -49,26 +48,20 @@ function solve(code = '') { const ast = parse(tokens); console.log('ast:', ast); - const result = ast.body.map((node) => { - const solution = createSolutionStack(); - const value = evaluate(ctx, node, solution); - return { value, solution }; - }); + const result = ast.body.map((node) => explain(ctx, node)); console.log( 'result:', result.map((r) => r.value) ); console.log( 'solution:', - result.map((r) => r.solution.steps) + result.map((r) => r.solution) ); let solution = ''; for (const r of result) { - const steps = r.solution.steps; - steps.pop(); - if (steps.length < 2) continue; - solution += steps.join('\n') + '\n\n'; + if (r.solution.length < 2) continue; + solution += r.solution.join('\n') + '\n\n'; } const content = renderTokensAsHTML(tokenize(ctx, solution), { diff --git a/src/evaluator/index.ts b/src/evaluator/index.ts index 2b66f65..7d74c4c 100644 --- a/src/evaluator/index.ts +++ b/src/evaluator/index.ts @@ -2,7 +2,12 @@ import { type INode, NODE } from '../parser'; import { type IContext } from '../context'; import { createError, ERRORS } from '../error'; import { SYMBOL } from '../lexer/tokens'; -import { ISolution, advance, pushValue } from './solution'; +import { stringify } from './solution'; + +export type IResult = { + value: number; + solution: string[]; +}; function compute(op: SYMBOL, a: number, b: number): number { switch (op) { @@ -18,163 +23,233 @@ function compute(op: SYMBOL, a: number, b: number): number { return a ** b; default: throw createError(ERRORS.RUNTIME, `unknown operator: '${op}'`); - break; } } /** - * Run through the entire AST evaluating the expressions on each subtree left to right + * Apply the context's rounding preferences - this happens on every node, not + * just the final result, so that each step of a solution adds up on its own. */ -export function evaluate( - ctx: IContext, - node: INode, - solution: ISolution -): number { - let result: number; - let left: number; - let right: number; - - function toNumber(value: string | number) { - value = value.toString(); - if (ctx.preferences.precision && ctx.preferences.precision > 0) { - value = Number(value).toPrecision(ctx.preferences.precision); - } - if ( - ctx.preferences.fractionDigits && - ctx.preferences.fractionDigits > 0 - ) { - value = Number(value).toFixed(ctx.preferences.fractionDigits); - } - return Number.parseFloat(value); +function toNumber(ctx: IContext, value: string | number): number { + value = value.toString(); + if (ctx.preferences.precision && ctx.preferences.precision > 0) { + value = Number(value).toPrecision(ctx.preferences.precision); } + if (ctx.preferences.fractionDigits && ctx.preferences.fractionDigits > 0) { + value = Number(value).toFixed(ctx.preferences.fractionDigits); + } + return Number.parseFloat(value); +} + +/** + * A computed value, as a node that can take the place of the sub-tree it came + * from. Children are dropped - the sub-tree has been reduced away. + */ +function literal(node: INode, value: number): INode { + return { + type: NODE.LITERAL, + value: String(value), + position: node.position, + line: node.line, + column: node.column + }; +} + +function valueOf(node: INode): number { + return Number(node.value); +} +function isValue(node: INode): boolean { + return node.type === NODE.LITERAL; +} + +/** + * Apply a sign to a value. `-3` is notation for a negative number rather than + * a step of working out, so it never earns a line of its own in a solution. + */ +function signed(ctx: IContext, node: INode, operand: INode): INode { + const result = compute(node.value as SYMBOL, 0, valueOf(operand)); + return literal(node, toNumber(ctx, result)); +} + +/** + * Replace every name with the value it stands for, so that what is left is + * pure arithmetic. An assignment target is a name, not a value, and is left + * alone. + */ +function resolve(ctx: IContext, node: INode): INode { switch (node.type) { - // handle both floats and integers - case NODE.LITERAL: { - result = toNumber(node.value); - pushValue(solution, result); - break; - } + case NODE.LITERAL: + return literal(node, toNumber(ctx, node.value)); - // explicit negative/positive sign - case NODE.UNARY: { - left = 0; - right = evaluate(ctx, node.right!, solution); - result = compute(node.value as SYMBOL, left, right); + case NODE.IDENTIFIER: { + const source = ctx.constants.has(node.value) + ? ctx.constants + : ctx.variables; - pushValue(solution, result); - break; - } + if (!source.has(node.value)) { + throw createError( + ERRORS.RUNTIME, + `unknown variable '${node.value}' at ${node.line}:${node.column}`, + `declare it first, e.g. ${node.value} = 1` + ); + } - // handle all binary operations - case NODE.BINARY: { - // build the solution in parts - let partial: string; + return literal(node, toNumber(ctx, source.get(node.value)!)); + } - // compute node.left first - left = evaluate(ctx, node.left!, solution); + case NODE.UNARY: { + const right = resolve(ctx, node.right!); + return isValue(right) + ? signed(ctx, node, right) + : { ...node, right }; + } - // build node.left solution - const trackLeft = - node.left?.type === NODE.BINARY || - node.left?.type === NODE.CALL; - if (trackLeft) advance(solution); - partial = `(${trackLeft ? '#' + solution.id : left} ${node.value} `; + case NODE.BINARY: + return { + ...node, + left: resolve(ctx, node.left!), + right: resolve(ctx, node.right!) + }; - // compute node.right - right = evaluate(ctx, node.right!, solution); + case NODE.CALL: + return { + ...node, + arguments: node.arguments!.map((arg) => resolve(ctx, arg)) + }; - // build node.right solution - const trackRight = - node.right?.type === NODE.BINARY || - node.right?.type === NODE.CALL; - if (trackRight) advance(solution); - partial += `${trackRight ? '#' + solution.id : right})`; + case NODE.ASSIGNMENT: + if (ctx.constants.has(node.left!.value)) { + throw createError( + ERRORS.RUNTIME, + `invalid operation: '${node.left!.value}' is a constant` + ); + } + return { ...node, right: resolve(ctx, node.right!) }; - // save solutions for both nodes - left & right - pushValue(solution, partial); + default: + return node; + } +} - // apply binary operator - result = compute(node.value as SYMBOL, left, right); +function isReducible(node: INode): boolean { + switch (node.type) { + case NODE.UNARY: + case NODE.BINARY: + case NODE.CALL: + return true; + case NODE.ASSIGNMENT: + return !isValue(node.right!); + default: + return false; + } +} - result = toNumber(result); +/** + * Collapse every sub-expression whose operands are already values, leaving the + * rest of the tree untouched. One call is one step of the solution. + */ +function reduceOnce(ctx: IContext, node: INode): INode { + switch (node.type) { + case NODE.UNARY: { + const right = isValue(node.right!) + ? node.right! + : reduceOnce(ctx, node.right!); - // save final result - pushValue(solution, result); - break; + return isValue(right) + ? signed(ctx, node, right) + : { ...node, right }; } - case NODE.CALL: { - // first evaluate the arguments - // e.g. sin(15 + 15) - compute (15 + 15) first - const args = node.arguments!.map((arg) => - evaluate(ctx, arg, solution) - ); - const fn = ctx.functions.get(node.value)!; - result = fn(...args); - - result = toNumber(result); - - if (args.length === 1) { - advance(solution); - pushValue(solution, `${node.value}(#${solution.id})`); + case NODE.BINARY: { + const left = node.left!; + const right = node.right!; + + if (isValue(left) && isValue(right)) { + const result = compute( + node.value as SYMBOL, + valueOf(left), + valueOf(right) + ); + return literal(node, toNumber(ctx, result)); } - pushValue(solution, result); - - break; + return { + ...node, + left: isReducible(left) ? reduceOnce(ctx, left) : left, + right: isReducible(right) ? reduceOnce(ctx, right) : right + }; } - case NODE.IDENTIFIER: { - if (ctx.constants.has(node.value)) { - result = ctx.constants.get(node.value)!; - } else { - result = ctx.variables.get(node.value) || 0; + case NODE.CALL: { + const args = node.arguments!; + + if (args.every(isValue)) { + const fn = ctx.functions.get(node.value)!; + return literal(node, toNumber(ctx, fn(...args.map(valueOf)))); } - result = toNumber(result); - pushValue(solution, result); - break; + return { + ...node, + arguments: args.map((arg) => + isReducible(arg) ? reduceOnce(ctx, arg) : arg + ) + }; } - case NODE.ASSIGNMENT: { - if (ctx.constants.has(node.left!.value)) { - throw createError( - ERRORS.RUNTIME, - `invalid operation: '${node.left!.value}' is a constant` - ); - } + case NODE.ASSIGNMENT: + return { ...node, right: reduceOnce(ctx, node.right!) }; - // build solution like binary ops + default: + return node; + } +} - let partial = `${node.left!.value} ${node.value} `; +/** + * Reduce a tree to a single value, reporting each intermediate tree + */ +function run( + ctx: IContext, + node: INode, + onStep?: (node: INode) => void +): number { + let current = resolve(ctx, node); - // compute node.right - right = evaluate(ctx, node.right!, solution); + onStep?.(current); - // build node.right solution - const trackRight = - node.right?.type === NODE.BINARY || - node.right?.type === NODE.CALL; - if (trackRight) advance(solution); - partial += `${trackRight ? '#' + solution.id : right}`; + while (isReducible(current)) { + current = reduceOnce(ctx, current); + onStep?.(current); + } - pushValue(solution, partial); + const assignment = current.type === NODE.ASSIGNMENT; - result = right; - ctx.variables.set(node.left!.value, right); + if (!assignment && !isValue(current)) { + throw createError(ERRORS.RUNTIME, `unknown node type: ${current.type}`); + } - pushValue(solution, result); - break; - } + const value = valueOf(assignment ? current.right! : current); - default: { - throw createError( - ERRORS.RUNTIME, - `unknown node type: ${node.type}` - ); - } + if (assignment) { + ctx.variables.set(current.left!.value, value); } - return toNumber(result); + return value; +} + +/** + * Run through the entire AST evaluating the expressions on each subtree + */ +export function evaluate(ctx: IContext, node: INode): number { + return run(ctx, node); +} + +/** + * Evaluate an expression, recording the working out step by step + */ +export function explain(ctx: IContext, node: INode): IResult { + const solution: string[] = []; + const value = run(ctx, node, (step) => solution.push(stringify(step))); + + return { value, solution }; } diff --git a/src/evaluator/solution.ts b/src/evaluator/solution.ts index d1fd1c3..7547413 100644 --- a/src/evaluator/solution.ts +++ b/src/evaluator/solution.ts @@ -1,122 +1,5 @@ import { NODE, type INode } from '../parser'; -import { isBinaryOperator, isAlpha, SYMBOL } from '../lexer/tokens'; - -type ISolutionConfig = { - id: number; - parts: string[]; -}; - -export type ISolution = { - readonly steps: string[]; - readonly id: number; -}; - -const store = new WeakMap(); - -export function advance(solution: ISolution) { - if (!store.has(solution)) return; - const c = store.get(solution)!; - c.parts.push(`#${++c.id}`); -} - -export function pushValue(solution: ISolution, value: string | number) { - if (!store.has(solution)) return; - const c = store.get(solution)!; - c.parts.push(value.toString()); -} - -export function createSolutionStack() { - const c: ISolutionConfig = { - id: 0, - parts: [] - }; - - const s = { - get steps() { - return buildSolution(c.parts); - }, - get id() { - return c.id; - } - }; - - store.set(s, c); - - return s; -} - -type IMapTerm = { - [k: string]: { - result: string; - expr: string; - }; -}; - -export function buildSolution(raw: string[]): string[] { - // console.log('raw:', raw); - - if (!raw.includes('#1') || raw.length < 2) { - return raw - .filter((t, i) => { - return t.startsWith('(') || i === raw.length - 1; - }) - .map((step) => removeExtraParen(step)); - } - - const map: IMapTerm = {}; - let expr: string; - let hasExpression: boolean; - - for (const [i, t] of raw.entries()) { - if (t.startsWith('#')) { - expr = raw[i - 2] || ''; - hasExpression = - !expr.startsWith('#') && - [...expr].some((v) => isBinaryOperator(v) || isAlpha(v)); - map[t] = { - result: raw[i - 1], - expr: hasExpression ? expr : '' - }; - } - } - - // console.log(map); - - const solution: string[] = []; - - function step(str: string, box: string[]) { - if (str) { - const tmp = str.replaceAll(/#\d+/g, (m) => map[m]?.result || ''); - str = str.replaceAll(/#\d+/g, (m) => { - return map[m]?.expr || map[m]?.result || ''; - }); - if (tmp !== str) { - box.unshift(tmp); - } - if (!str.includes('#')) { - box.unshift(str); - } - } - if (str.includes('#')) { - step(str, box); - } - } - - step(raw.at(-2) || '', solution); - - solution.push(raw.at(-1) as string); - - // console.log('sln:', solution); - - return solution.map((step) => removeExtraParen(step)); -} - -function removeExtraParen(t: string): string { - t = t.replace(/\(\((.*)\)\)/g, (m, x) => { - return x.includes('(') ? m : m.slice(1, -1); - }); - return t.startsWith('(') ? t.slice(1, -1) : t; -} +import { SYMBOL } from '../lexer/tokens'; /** * Operator precedence, used to decide where parentheses are required. diff --git a/src/index.ts b/src/index.ts index 3f8291b..58c41f5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,9 +7,8 @@ export { export { tokenize } from './lexer'; export { TOKEN, type IToken } from './lexer/tokens'; export { parse, NODE, type IParseTree, type INode } from './parser'; -export { createSolutionStack, type ISolution } from './evaluator/solution'; -export { evaluate } from './evaluator'; -export { solve, solveBatch, type IResult } from './solve'; +export { evaluate, explain, type IResult } from './evaluator'; +export { solve, solveBatch } from './solve'; export { renderTokensAsHTML, type IHTMLRenderOptions, @@ -18,6 +17,7 @@ export { export { renderTokensAsLaTeX, type ILaTeXRenderOptions } from './render/latex'; export { safeEvaluate, + safeExplain, safeParse, safeSolve, safeSolveBatch, diff --git a/src/safe.ts b/src/safe.ts index 2bc8cfd..dbda4f4 100644 --- a/src/safe.ts +++ b/src/safe.ts @@ -1,7 +1,6 @@ import { type IContext } from './context'; import { safeExecutor } from './error'; -import { evaluate } from './evaluator'; -import { type ISolution } from './evaluator/solution'; +import { evaluate, explain } from './evaluator'; import { tokenize } from './lexer'; import { type IToken } from './lexer/tokens'; import { type INode, parse } from './parser'; @@ -26,8 +25,15 @@ export function safeParse(tokens: IToken[]) { /** * Safely evaluate without throwing an error */ -export function safeEvaluate(ctx: IContext, node: INode, solution: ISolution) { - return safeExecutor(() => evaluate(ctx, node, solution)); +export function safeEvaluate(ctx: IContext, node: INode) { + return safeExecutor(() => evaluate(ctx, node)); +} + +/** + * Safely evaluate with a step-by-step solution, without throwing an error + */ +export function safeExplain(ctx: IContext, node: INode) { + return safeExecutor(() => explain(ctx, node)); } /** diff --git a/src/solve.ts b/src/solve.ts index 9bc3cd3..5ab8fa1 100644 --- a/src/solve.ts +++ b/src/solve.ts @@ -1,13 +1,9 @@ import { type IContext } from './context'; -import { evaluate } from './evaluator'; +import { explain, type IResult } from './evaluator'; import { parse } from './parser'; import { tokenize } from './lexer'; -import { createSolutionStack } from './evaluator/solution'; -export type IResult = { - value: number; - solution: string[]; -}; +export { type IResult }; /** * evaluate a one-line expression @@ -22,10 +18,5 @@ export function solve(ctx: IContext, code: string): IResult { export function solveBatch(ctx: IContext, code: string): IResult[] { const tokens = tokenize(ctx, code); const ast = parse(tokens); - const result = ast.body.map((node) => { - const solution = createSolutionStack(); - const value = evaluate(ctx, node, solution); - return { value, solution: solution.steps }; - }); - return result; + return ast.body.map((node) => explain(ctx, node)); } diff --git a/tests/context.test.ts b/tests/context.test.ts index a4e036e..9bd4902 100644 --- a/tests/context.test.ts +++ b/tests/context.test.ts @@ -68,16 +68,11 @@ describe('context helpers', () => { ctx.solveBatch(`x = 3sin(30)\ny = 2cos(60)\n\nx + y`) ).toStrictEqual([ { - solution: [ - 'x = (3 * sin(30))', - 'x = (3 * 0.5)', - 'x = 1.5', - '1.5' - ], + solution: ['x = 3 * sin(30)', 'x = 3 * 0.5', 'x = 1.5'], value: 1.5 }, { - solution: ['y = (2 * cos(60))', 'y = (2 * 0.5)', 'y = 1', '1'], + solution: ['y = 2 * cos(60)', 'y = 2 * 0.5', 'y = 1'], value: 1 }, { diff --git a/tests/evaluator.test.ts b/tests/evaluator.test.ts index 9d1bbbe..24d3308 100644 --- a/tests/evaluator.test.ts +++ b/tests/evaluator.test.ts @@ -2,11 +2,9 @@ import { describe, test, expect, beforeEach } from 'vitest'; import { tokenize } from '../src/lexer'; import { parse } from '../src/parser'; import { type IContext, createContext } from '../src/context'; -import { evaluate } from '../src/evaluator'; -import { createSolutionStack, type ISolution } from '../src/evaluator/solution'; +import { evaluate, explain } from '../src/evaluator'; let ctx: IContext; -let solution: ISolution; beforeEach(() => { ctx = createContext({ @@ -16,7 +14,6 @@ beforeEach(() => { angles: 'deg' } }); - solution = createSolutionStack(); }); describe('evaluator', () => { @@ -24,16 +21,23 @@ describe('evaluator', () => { const expr = '1+2+x'; const tokens = tokenize(ctx, expr); const ast = parse(tokens); - expect(() => evaluate(ctx, ast.body[0], solution)).not.toThrow(); - expect(evaluate(ctx, ast.body[0], solution)).toBe(4); + expect(() => evaluate(ctx, ast.body[0])).not.toThrow(); + expect(evaluate(ctx, ast.body[0])).toBe(4); }); test('complex ast tree', () => { const expr = `1 + add(x + 3, cos(60) + 0.25, 0.25)`; const tokens = tokenize(ctx, expr); const ast = parse(tokens); - expect(() => evaluate(ctx, ast.body[0], solution)).not.toThrow(); - expect(evaluate(ctx, ast.body[0], solution)).toBe(6); + expect(() => evaluate(ctx, ast.body[0])).not.toThrow(); + expect(evaluate(ctx, ast.body[0])).toBe(6); + }); + + test('unknown variables', () => { + const ast = parse(tokenize(ctx, 'nope + 1')); + expect(() => evaluate(ctx, ast.body[0])).toThrow( + /unknown variable 'nope'/ + ); }); }); @@ -43,9 +47,8 @@ describe('solution generator', () => { const tokens = tokenize(ctx, expr); const ast = parse(tokens); ctx.preferences.precision = 4; - evaluate(ctx, ast.body[0], solution); - expect(solution.steps).toStrictEqual([ - '(3 * 3.142) - 1', + expect(explain(ctx, ast.body[0]).solution).toStrictEqual([ + '3 * 3.142 - 1', '9.426 - 1', '8.426' ]); diff --git a/tests/safe.test.ts b/tests/safe.test.ts index ee3d3c6..ef7acf7 100644 --- a/tests/safe.test.ts +++ b/tests/safe.test.ts @@ -1,10 +1,8 @@ import { describe, test, beforeEach, expect } from 'vitest'; import { createContext, IContext } from '../src/context'; -import { createSolutionStack, ISolution } from '../src/evaluator/solution'; import { safeEvaluate, safeParse, safeTokenize, safeSolve } from '../src/safe'; let ctx: IContext; -let solution: ISolution; beforeEach(() => { ctx = createContext({ @@ -14,7 +12,6 @@ beforeEach(() => { angles: 'deg' } }); - solution = createSolutionStack(); }); describe('safe tokenization', () => { @@ -59,20 +56,20 @@ describe('safe evaluation', () => { test('invoking safeEvaluate does not throw errors', () => { const tokens = safeTokenize(ctx, '2+sin(45)*5x+y+z').data!; const tree = safeParse(tokens).data!; - safeEvaluate(ctx, tree.body[0], solution); + safeEvaluate(ctx, tree.body[0]); }); test('evaluation with errors', () => { const tokens = safeTokenize(ctx, 'y = 2').data!; const tree = safeParse(tokens).data!; - const res = safeEvaluate(ctx, tree.body[0], solution); + const res = safeEvaluate(ctx, tree.body[0]); expect(res).toHaveProperty('data', undefined); }); test('evaluation without errors', () => { const tokens = safeTokenize(ctx, '2+sin(45)*5x').data!; const tree = safeParse(tokens).data!; - const res = safeEvaluate(ctx, tree.body[0], solution); + const res = safeEvaluate(ctx, tree.body[0]); expect(res).toHaveProperty('error', undefined); }); }); From 6173c4f11cdc24b64f6762ce3943dea4f856bdd8 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:27:10 +0300 Subject: [PATCH 03/25] test(evaluator): pin solution output per node shape One case per node shape, so a step that silently drops out of a solution fails a test instead of going unnoticed. Co-Authored-By: Claude Opus 5 (1M context) --- tests/solution.test.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/solution.test.ts b/tests/solution.test.ts index 0c9bb96..bc7e924 100644 --- a/tests/solution.test.ts +++ b/tests/solution.test.ts @@ -60,3 +60,36 @@ describe('stringify', () => { expect(print('(1+3)2')).toBe('(1 + 3) * 2'); }); }); + +describe('solution steps', () => { + // one case per node shape - a step that silently drops out of the output + // is the failure mode this table exists to catch + const cases: [string, number, string[]][] = [ + ['5', 5, ['5']], + ['', 0, []], + ['1 + 2 + 3', 6, ['1 + 2 + 3', '3 + 3', '6']], + ['(1+2)*(3+4)', 21, ['(1 + 2) * (3 + 4)', '3 * 7', '21']], + [ + '((1+2)*(3+4))/(5-3)', + 10.5, + ['(1 + 2) * (3 + 4) / (5 - 3)', '3 * 7 / 2', '21 / 2', '10.5'] + ], + ['add(1,2,3)', 6, ['add(1, 2, 3)', '6']], + ['pow(2,3)+1', 9, ['pow(2, 3) + 1', '8 + 1', '9']], + ['1 + add(2,3)', 6, ['1 + add(2, 3)', '1 + 5', '6']], + ['sqrt(abs(-16))', 4, ['sqrt(abs(-16))', 'sqrt(16)', '4']], + ['-(3+4)', -7, ['-(3 + 4)', '-7']], + ['2 - -3', 5, ['2 - (-3)', '5']], + ['2x + 1', 5, ['2 * 2 + 1', '4 + 1', '5']], + ['x = 2(x + 1)', 6, ['x = 2 * (2 + 1)', 'x = 2 * 3', 'x = 6']] + ]; + + test.each(cases)('%s', (expr, value, steps) => { + const scope = createContext({ + variables: { x: 2 }, + preferences: { angles: 'deg' } + }); + + expect(scope.solve(expr)).toStrictEqual({ value, solution: steps }); + }); +}); From f6c647b5bb5b9a3e8833a6f03dc0d6c32b5494ac Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:28:36 +0300 Subject: [PATCH 04/25] fix(parser)!: right-associative exponentiation and unary precedence `2^3^2` threw a syntax error: `parsePower` matched a single `^` and left the second one for `parseProgram`, which had no rule for a bare operator. And because unary was handled inside `parseFactor`, `-2^2` parsed as `(-2)^2` and returned 4. Give unary its own level between `*` and `^`: parseTerm -> parseUnary -> parsePower -> parseFactor `parsePower` now takes its exponent from `parseUnary`, which makes `^` right-associative and keeps `2^-1` working. 2^3^2 512 (was a syntax error) -2^2 -4 (was 4) BREAKING CHANGE: `-2^2` is now -4, following standard mathematical precedence. Write `(-2)^2` for the old result. Co-Authored-By: Claude Opus 5 (1M context) --- src/parser/index.ts | 45 ++++++++++++++++++++++++++------------------- tests/index.test.ts | 11 +++++++++++ 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/parser/index.ts b/src/parser/index.ts index b646881..548a406 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -158,7 +158,7 @@ export function parse(tokens: IToken[]): IParseTree { // multiplication and division function parseTerm() { - let node = parsePower(); + let node = parseUnary(); while ( !stream.isEOF && @@ -166,7 +166,7 @@ export function parse(tokens: IToken[]): IParseTree { matchValue(SYMBOL.MUL, SYMBOL.DIV) ) { const op = stream.previous; - const factor = parsePower(); + const factor = parseUnary(); node = { ...op, @@ -179,13 +179,35 @@ export function parse(tokens: IToken[]): IParseTree { return node; } - // power - exponential + // unary +x or -3 + // + // binds looser than `^` so that `-2^2` is `-(2^2)`, and tighter than `*` + // so that `-2*3` is `(-2)*3` + function parseUnary(): INode | undefined { + if ( + !stream.isEOF && + isUnaryOperator(stream.current.value) && + matchType(TOKEN.OPERATOR) + ) { + const op = stream.previous; + + return { + ...op, + type: NODE.UNARY, + right: parseUnary() + }; + } + + return parsePower(); + } + + // power - exponential, right-associative: `2^3^2` is `2^(3^2)` function parsePower() { const node = parseFactor(); if (check(TOKEN.OPERATOR) && matchValue(SYMBOL.POW)) { const op = stream.previous; - const factor = parseFactor(); + const factor = parseUnary(); return { ...op, @@ -217,21 +239,6 @@ export function parse(tokens: IToken[]): IParseTree { return node; } - // unary +x or -3 - if ( - !stream.isEOF && - isUnaryOperator(stream.current.value) && - matchType(TOKEN.OPERATOR) - ) { - const node = stream.previous; - const value = parseFactor(); - return { - ...node, - type: NODE.UNARY, - right: value - }; - } - // function call if (matchType(TOKEN.FUNCTION) && stream.current.type === TOKEN.LPAREN) { const node = stream.previous; diff --git a/tests/index.test.ts b/tests/index.test.ts index f545458..b26d531 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -60,6 +60,17 @@ describe('mathflow - evaluate', () => { expect(() => ctx.solve(`^2`)).toThrow(); }); + test('operator precedence', () => { + // `^` is right-associative, and binds tighter than unary minus + expect(ctx.solve(`2^3^2`)).toHaveProperty('value', 512); + expect(ctx.solve(`-2^2`)).toHaveProperty('value', -4); + expect(ctx.solve(`(-2)^2`)).toHaveProperty('value', 4); + expect(ctx.solve(`-2^2+1`)).toHaveProperty('value', -3); + expect(ctx.solve(`2^-1`)).toHaveProperty('value', 0.5); + expect(ctx.solve(`-2*3`)).toHaveProperty('value', -6); + expect(ctx.solve(`2*-3`)).toHaveProperty('value', -6); + }); + test('built-in constants', () => { expect(ctx.solve(`pi`).value).toBeCloseTo(Math.PI); }); From e4ccb4c116699794c52906b1a0cced123afcd7db Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:29:46 +0300 Subject: [PATCH 05/25] fix(parser): report a clear error for a missing ')' Both the group and the call-argument branches assumed the next token was a closing paren and skipped it unchecked, so a stray token was silently swallowed and surfaced later as a confusing error somewhere else: (1,2) near ')' at 1:18 sin(1 2) parsed as sin(1), then failed on the leftover ')' Consume it with an `expect` helper that names what was missing instead: (1,2) near ',' at 1:3 (expecting ')') sin(1 2) near '2' at 1:8 (expecting ')') Co-Authored-By: Claude Opus 5 (1M context) --- src/parser/index.ts | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/parser/index.ts b/src/parser/index.ts index 548a406..66923d3 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -76,6 +76,19 @@ export function parse(tokens: IToken[]): IParseTree { return false; } + // consume a token that the grammar requires, or say what was missing + function expect(type: TOKEN, symbol: SYMBOL) { + if (matchType(type)) return; + + const token = stream.current || stream.previous; + + throw createError( + ERRORS.SYNTAX, + `unexpected token near '${token.value}' at ${token.line}:${token.column}`, + `expecting '${symbol}'` + ); + } + // parse multiple line program function parseProgram(): IParseTree { const statements: INode[] = []; @@ -109,8 +122,10 @@ export function parse(tokens: IToken[]): IParseTree { // // 1. assignment expression // 2. addition and subtraction (lowest precendence) - // 3. multiplication, division, exponential (highest precendence) - // 4. unary, literals, identifiers, parentheses, function call expression + // 3. multiplication and division + // 4. unary plus and minus + // 5. exponential (highest precendence, right-associative) + // 6. literals, identifiers, parentheses, function call expression function parseAssignment() { const node = parseExpression(); @@ -235,7 +250,7 @@ export function parse(tokens: IToken[]): IParseTree { // brackets if (matchType(TOKEN.LPAREN)) { const node = parseExpression(); - stream.advance(); + expect(TOKEN.RPAREN, SYMBOL.RPAREN); return node; } @@ -254,8 +269,7 @@ export function parse(tokens: IToken[]): IParseTree { if (arg) args.push(arg); } while (!stream.isEOF && matchType(TOKEN.COMMA)); - // skip ) - stream.advance(); + expect(TOKEN.RPAREN, SYMBOL.RPAREN); return { ...node, type: NODE.CALL, arguments: args }; } From 2054a53ae8d5db650b6fcd1062138e3fd62d439b Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:31:24 +0300 Subject: [PATCH 06/25] fix(lexer): accept signed exponents and a trailing 'e' `1e-3` was a lexical error: extraction stopped at the sign and then rejected the number for ending in `e`. So was `2e`, which should read as 2 times the constant `e`. Only treat `e` as an exponent marker when digits follow it, optionally signed; otherwise leave it for the identifier scanner, which already inserts the implicit multiplication. 1e-3 0.001 (was a lexical error) 2e 5.43656... (was a lexical error) This also matters for solutions: a step is re-tokenized to be rendered, and small values stringify to exactly this form. Co-Authored-By: Claude Opus 5 (1M context) --- src/lexer/index.ts | 13 ++++++++++++- tests/lexer.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/lexer/index.ts b/src/lexer/index.ts index 1a2d03e..d805ec2 100644 --- a/src/lexer/index.ts +++ b/src/lexer/index.ts @@ -4,6 +4,7 @@ import { isDigit, isAlpha, isBinaryOperator, + isUnaryOperator, isWhitespace, TOKEN, type IToken, @@ -90,15 +91,25 @@ export function tokenize(ctx: IContext, code: string): IToken[] { !hasExponent && !!num.length ) { + // an exponent only if digits follow, optionally signed - + // anything else is the constant `e`, as in `2e` + const signed = isUnaryOperator(code[position + 1]) ? 1 : 0; + if (!isDigit(code[position + 1 + signed])) break; + hasExponent = true; num += x; advance(); + + if (signed) { + num += code[position]; + advance(); + } } else { break; } } - if (num.endsWith(SYMBOL.DOT) || num.endsWith(SYMBOL.EXPONENT)) { + if (num.endsWith(SYMBOL.DOT)) { throw createError( ERRORS.LEXICAL, `unexpected token '${x}' at ${line}:${column}` diff --git a/tests/lexer.test.ts b/tests/lexer.test.ts index 4f10582..692db9d 100644 --- a/tests/lexer.test.ts +++ b/tests/lexer.test.ts @@ -87,6 +87,30 @@ describe('lexer', () => { { value: 'EOF', type: TOKEN.EOF } ]); }); + test('scientific notation', () => { + expect(tokenize(ctx, `1e-3`)[0]).toMatchObject({ + value: '1e-3', + type: TOKEN.NUMBER + }); + expect(tokenize(ctx, `1e+2`)[0]).toMatchObject({ + value: '1e+2', + type: TOKEN.NUMBER + }); + expect(tokenize(ctx, `2.5e3`)[0]).toMatchObject({ + value: '2.5e3', + type: TOKEN.NUMBER + }); + + // a trailing `e` is the constant, not an exponent + expect(tokenize(ctx, `2e`)).toMatchObject([ + { value: '2', type: TOKEN.NUMBER }, + { value: '*', type: TOKEN.OPERATOR }, + { value: 'e', type: TOKEN.IDENTIFIER }, + { value: '\n', type: TOKEN.NEWLINE }, + { value: 'EOF', type: TOKEN.EOF } + ]); + }); + test('invalid expression', () => { expect(() => tokenize(ctx, `sin(x`)).toThrow(); expect(() => tokenize(ctx, `2. + 3`)).toThrow(); From 23e42fdf5bc7c8f9eb3a30ed06e6e32791e3ace8 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:32:35 +0300 Subject: [PATCH 07/25] fix(functions)!: cbrt, root, log base, hypot and coversin Five builtins were wrong or incomplete: - `cbrt(-8)` returned NaN. `Math.pow(x, 1/3)` cannot take a cube root of a negative number; `Math.cbrt` can. - `root(-32, 5)` had the same problem. An odd root of a negative number is real, an even one is not. - `log(8)` returned NaN - the base was required. It now defaults to 10, which is what the single-argument form means everywhere else. - `hypot` took exactly two arguments and squared them by hand, despite TODO.md advertising it as variadic. `Math.hypot` is variadic and avoids overflow. - `coversin` computed `(1 - cos x) / 2`, which is the haversine. The coversine is `1 - sin x`. BREAKING CHANGE: `coversin` returns the coversine rather than the haversine, and negative arguments to `cbrt`/`root` now return a real root instead of NaN. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/logarithms.ts | 2 +- src/functions/numbers.ts | 8 ++++++-- src/functions/trignometry.ts | 4 ++-- tests/index.test.ts | 11 +++++++++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/functions/logarithms.ts b/src/functions/logarithms.ts index 281f1f9..578f911 100644 --- a/src/functions/logarithms.ts +++ b/src/functions/logarithms.ts @@ -2,7 +2,7 @@ export default function initLogarithms() { return { exp: (x: number) => Math.exp(x), ln: (x: number) => Math.log(x), - log: (x: number, y: number) => Math.log10(x) / Math.log10(y), + log: (x: number, y = 10) => Math.log10(x) / Math.log10(y), log10: (x: number) => Math.log10(x), log2: (x: number) => Math.log2(x) }; diff --git a/src/functions/numbers.ts b/src/functions/numbers.ts index e09452a..cf05a72 100644 --- a/src/functions/numbers.ts +++ b/src/functions/numbers.ts @@ -10,8 +10,12 @@ export default function initNumbers() { floor: (x: number) => Math.floor(x), sqrt: (x: number) => Math.sqrt(x), pow: (x: number, y: number) => Math.pow(x, y), - cbrt: (x: number) => Math.pow(x, 1 / 3), - root: (x: number, y: number) => Math.pow(x, 1 / y), + cbrt: (x: number) => Math.cbrt(x), + root: (x: number, y: number) => + // an odd root of a negative number is real: root(-8, 3) is -2 + x < 0 && Number.isInteger(y) && y % 2 !== 0 + ? -Math.pow(-x, 1 / y) + : Math.pow(x, 1 / y), trunc: (x: number) => Math.trunc(x) }; } diff --git a/src/functions/trignometry.ts b/src/functions/trignometry.ts index 2586da8..ce60769 100644 --- a/src/functions/trignometry.ts +++ b/src/functions/trignometry.ts @@ -25,8 +25,8 @@ export default function initTrignometry(pref: IContext['preferences']) { asinh: (x: number) => res(Math.asinh(val(x))), acosh: (x: number) => res(Math.acosh(val(x))), atanh: (x: number) => res(Math.atanh(val(x))), - hypot: (x: number, y: number) => Math.sqrt(x * x + y * y), + hypot: (...x: number[]) => Math.hypot(...x), versin: (x: number) => 1 - Math.cos(val(x)), - coversin: (x: number) => (1 - Math.cos(val(x))) / 2 + coversin: (x: number) => 1 - Math.sin(val(x)) }; } diff --git a/tests/index.test.ts b/tests/index.test.ts index b26d531..9938be0 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -92,6 +92,17 @@ describe('mathflow - evaluate', () => { expect(ctx.solve(`deg(5)`).value).toBeCloseTo((5 * 180) / Math.PI); }); + test('real roots, log bases and euclidean norms', () => { + expect(ctx.solve(`cbrt(-8)`).value).toBe(-2); + expect(ctx.solve(`root(-32,5)`).value).toBe(-2); + expect(ctx.solve(`root(-4,2)`).value).toBeNaN(); + expect(ctx.solve(`log(8)`).value).toBeCloseTo(Math.log10(8)); + expect(ctx.solve(`log(8,2)`).value).toBeCloseTo(3); + expect(ctx.solve(`hypot(1,2,2)`).value).toBeCloseTo(3); + expect(ctx.solve(`coversin(0)`).value).toBeCloseTo(1); + expect(ctx.solve(`versin(0)`).value).toBeCloseTo(0); + }); + test('implicit multiplication', () => { expect(ctx.solve(`2(1+3)`).value).toBe(2 * (1 + 3)); expect(ctx.solve(`(1+3)2`).value).toBe((1 + 3) * 2); From 7be9061680642174717dfb834025a5e5485fc7c5 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:34:38 +0300 Subject: [PATCH 08/25] feat(functions): complete number and logarithm utilities Implements the number and exponent entries left open in TODO.md, all number-in/number-out: sign round fix clamp roundToNearest precision sigFigs gcd lcm modExp lerp hermite pow10 pow2 expm1 log1p `sign` was already ticked in TODO.md but had never been implemented. `modExp` runs in BigInt so that a modulus above ~9.5e7 cannot overflow the intermediate product. `hermite` takes the standard five-argument cubic form - the `hermite(p0, p1, t)` in TODO.md is missing its tangents. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/logarithms.ts | 6 +++- src/functions/numbers.ts | 70 ++++++++++++++++++++++++++++++++++++- tests/functions.test.ts | 68 +++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 tests/functions.test.ts diff --git a/src/functions/logarithms.ts b/src/functions/logarithms.ts index 578f911..e9017f0 100644 --- a/src/functions/logarithms.ts +++ b/src/functions/logarithms.ts @@ -1,9 +1,13 @@ export default function initLogarithms() { return { exp: (x: number) => Math.exp(x), + expm1: (x: number) => Math.expm1(x), ln: (x: number) => Math.log(x), log: (x: number, y = 10) => Math.log10(x) / Math.log10(y), log10: (x: number) => Math.log10(x), - log2: (x: number) => Math.log2(x) + log2: (x: number) => Math.log2(x), + log1p: (x: number) => Math.log1p(x), + pow10: (x: number) => 10 ** x, + pow2: (x: number) => 2 ** x }; } diff --git a/src/functions/numbers.ts b/src/functions/numbers.ts index cf05a72..164ac6a 100644 --- a/src/functions/numbers.ts +++ b/src/functions/numbers.ts @@ -1,3 +1,32 @@ +function gcd2(a: number, b: number): number { + return b ? gcd2(b, a % b) : Math.abs(a); +} + +// `toPrecision` only accepts 1..100 significant digits +function significant(x: number, n: number): number { + return Number(x.toPrecision(Math.min(Math.max(Math.trunc(n), 1), 100))); +} + +// modular exponentiation, in BigInt so that a large modulus cannot overflow +function modExp(base: number, exponent: number, modulus: number): number { + if (modulus <= 0 || exponent < 0) return NaN; + + let result = 1n; + let b = BigInt(Math.trunc(base)); + let e = BigInt(Math.trunc(exponent)); + const m = BigInt(Math.trunc(modulus)); + + b = ((b % m) + m) % m; + + while (e > 0n) { + if (e % 2n === 1n) result = (result * b) % m; + b = (b * b) % m; + e /= 2n; + } + + return Number(result); +} + export default function initNumbers() { return { add: (...x: number[]) => x.reduce((s, c) => s + c, 0), @@ -6,6 +35,7 @@ export default function initNumbers() { div: (x: number, y: number) => x / y, mod: (x: number, y: number) => x % y, abs: (x: number) => Math.abs(x), + sign: (x: number) => Math.sign(x), ceil: (x: number) => Math.ceil(x), floor: (x: number) => Math.floor(x), sqrt: (x: number) => Math.sqrt(x), @@ -16,6 +46,44 @@ export default function initNumbers() { x < 0 && Number.isInteger(y) && y % 2 !== 0 ? -Math.pow(-x, 1 / y) : Math.pow(x, 1 / y), - trunc: (x: number) => Math.trunc(x) + trunc: (x: number) => Math.trunc(x), + fix: (x: number) => Math.trunc(x), + round: (x: number, n = 0) => { + const scale = 10 ** n; + return Math.round(x * scale) / scale; + }, + roundToNearest: (x: number, step: number) => + Math.round(x / step) * step, + precision: (x: number, n: number) => significant(x, n), + sigFigs: (x: number, n: number) => significant(x, n), + clamp: (x: number, min: number, max: number) => + Math.min(Math.max(x, min), max), + gcd: (...x: number[]) => x.map(Math.trunc).reduce(gcd2, 0), + lcm: (...x: number[]) => + x + .map(Math.trunc) + .reduce( + (a, b) => (a && b ? Math.abs(a * b) / gcd2(a, b) : 0), + 1 + ), + modExp, + lerp: (a: number, b: number, t: number) => a + (b - a) * t, + hermite: ( + p0: number, + m0: number, + p1: number, + m1: number, + t: number + ) => { + const t2 = t * t; + const t3 = t2 * t; + + return ( + (2 * t3 - 3 * t2 + 1) * p0 + + (t3 - 2 * t2 + t) * m0 + + (-2 * t3 + 3 * t2) * p1 + + (t3 - t2) * m1 + ); + } }; } diff --git a/tests/functions.test.ts b/tests/functions.test.ts new file mode 100644 index 0000000..85b6d31 --- /dev/null +++ b/tests/functions.test.ts @@ -0,0 +1,68 @@ +import { describe, test, expect, beforeEach } from 'vitest'; +import { type IContextAPI, createContext } from '../src/context'; + +let ctx: IContextAPI; + +beforeEach(() => { + ctx = createContext({ preferences: { angles: 'deg' } }); +}); + +// every case goes through `solve` rather than `ctx.functions`, so a builtin +// that was never registered fails here instead of lexing as a variable +function check(cases: [string, number][]) { + for (const [expr, expected] of cases) { + expect(ctx.solve(expr).value, expr).toBeCloseTo(expected, 8); + } +} + +describe('numbers', () => { + test('rounding', () => { + check([ + ['sign(-3)', -1], + ['sign(0)', 0], + ['round(2.567, 2)', 2.57], + ['round(2.5)', 3], + ['round(-1.4)', -1], + ['fix(-2.7)', -2], + ['trunc(2.7)', 2], + ['roundToNearest(7, 5)', 5], + ['roundToNearest(8, 5)', 10], + ['precision(3.14159, 3)', 3.14], + ['sigFigs(123456, 2)', 120000], + ['clamp(5, 1, 3)', 3], + ['clamp(0, 1, 3)', 1], + ['clamp(2, 1, 3)', 2] + ]); + }); + + test('divisors and interpolation', () => { + check([ + ['gcd(12, 18)', 6], + ['gcd(12, 18, 24)', 6], + ['gcd(7, 13)', 1], + ['lcm(4, 6)', 12], + ['lcm(4, 6, 10)', 60], + ['lcm(0, 5)', 0], + ['modExp(2, 10, 1000)', 24], + ['modExp(4, 13, 497)', 445], + ['lerp(0, 10, 0.25)', 2.5], + ['hermite(0, 0, 1, 0, 0.5)', 0.5], + ['hermite(0, 0, 1, 0, 1)', 1] + ]); + }); +}); + +describe('logarithms', () => { + test('exponents and logs', () => { + check([ + ['pow10(3)', 1000], + ['pow2(10)', 1024], + ['expm1(0)', 0], + ['expm1(1)', Math.E - 1], + ['log1p(0)', 0], + ['log1p(1)', Math.LN2], + ['log(100)', 2], + ['log2(64)', 6] + ]); + }); +}); From b09915299ad5c2169d6c85d8dbab229a6e5710a6 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:36:17 +0300 Subject: [PATCH 09/25] feat(functions)!: complete trigonometry Adds the entries TODO.md already ticked but never implemented - `sind`, `cosd`, `tand`, `versind`, `coversind` - plus `atan2`. Also fixes which arguments the angle preference applies to. It was applied to every argument and every result, but an inverse function takes a *ratio* and returns an angle, and a hyperbolic function takes and returns a plain real. In degree mode `asin(0.5)` returned 0.5 instead of 30. BREAKING CHANGE: in degree mode, `asin`, `acos` and `atan` now take a plain ratio, and the hyperbolic functions no longer convert their argument or result. Radian mode is unaffected, since the conversions were identities there. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/trignometry.ts | 29 +++++++++++++++++--------- tests/functions.test.ts | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/functions/trignometry.ts b/src/functions/trignometry.ts index ce60769..c7a6f46 100644 --- a/src/functions/trignometry.ts +++ b/src/functions/trignometry.ts @@ -4,6 +4,7 @@ export default function initTrignometry(pref: IContext['preferences']) { const deg = (x: number) => (x * 180) / Math.PI; const rad = (x: number) => (x * Math.PI) / 180; + // an angle going in, and an angle coming out const val = (x: number) => (pref.angles === 'deg' ? rad(x) : x); const res = (x: number) => (pref.angles === 'deg' ? deg(x) : x); @@ -13,20 +14,28 @@ export default function initTrignometry(pref: IContext['preferences']) { sin: (x: number) => Math.sin(val(x)), cos: (x: number) => Math.cos(val(x)), tan: (x: number) => Math.tan(val(x)), - asin: (x: number) => res(Math.asin(val(x))), - acos: (x: number) => res(Math.acos(val(x))), - atan: (x: number) => res(Math.atan(val(x))), + sind: (x: number) => Math.sin(rad(x)), + cosd: (x: number) => Math.cos(rad(x)), + tand: (x: number) => Math.tan(rad(x)), + // the argument is a ratio, not an angle - only the result is converted + asin: (x: number) => res(Math.asin(x)), + acos: (x: number) => res(Math.acos(x)), + atan: (x: number) => res(Math.atan(x)), + atan2: (y: number, x: number) => res(Math.atan2(y, x)), csc: (x: number) => 1 / Math.sin(val(x)), sec: (x: number) => 1 / Math.cos(val(x)), cot: (x: number) => 1 / Math.tan(val(x)), - sinh: (x: number) => Math.sinh(val(x)), - cosh: (x: number) => Math.cosh(val(x)), - tanh: (x: number) => Math.tanh(val(x)), - asinh: (x: number) => res(Math.asinh(val(x))), - acosh: (x: number) => res(Math.acosh(val(x))), - atanh: (x: number) => res(Math.atanh(val(x))), + // hyperbolic functions take and return plain reals, not angles + sinh: (x: number) => Math.sinh(x), + cosh: (x: number) => Math.cosh(x), + tanh: (x: number) => Math.tanh(x), + asinh: (x: number) => Math.asinh(x), + acosh: (x: number) => Math.acosh(x), + atanh: (x: number) => Math.atanh(x), hypot: (...x: number[]) => Math.hypot(...x), versin: (x: number) => 1 - Math.cos(val(x)), - coversin: (x: number) => 1 - Math.sin(val(x)) + coversin: (x: number) => 1 - Math.sin(val(x)), + versind: (x: number) => 1 - Math.cos(rad(x)), + coversind: (x: number) => 1 - Math.sin(rad(x)) }; } diff --git a/tests/functions.test.ts b/tests/functions.test.ts index 85b6d31..be5f7e2 100644 --- a/tests/functions.test.ts +++ b/tests/functions.test.ts @@ -52,6 +52,46 @@ describe('numbers', () => { }); }); +describe('trigonometry', () => { + test('degree variants are independent of the angle preference', () => { + ctx.preferences.angles = 'rad'; + check([ + ['sind(30)', 0.5], + ['cosd(60)', 0.5], + ['tand(45)', 1], + ['versind(0)', 0], + ['coversind(90)', 0] + ]); + }); + + test('inverse functions take a ratio and return an angle', () => { + check([ + ['asin(0.5)', 30], + ['acos(0.5)', 60], + ['atan(1)', 45], + ['atan2(1, 1)', 45], + ['atan2(0, -1)', 180] + ]); + + ctx.preferences.angles = 'rad'; + check([ + ['asin(0.5)', Math.PI / 6], + ['atan2(1, 1)', Math.PI / 4] + ]); + }); + + test('hyperbolic functions ignore the angle preference', () => { + check([ + ['sinh(1)', Math.sinh(1)], + ['cosh(1)', Math.cosh(1)], + ['tanh(1)', Math.tanh(1)], + ['asinh(1)', Math.asinh(1)], + ['acosh(2)', Math.acosh(2)], + ['atanh(0.5)', Math.atanh(0.5)] + ]); + }); +}); + describe('logarithms', () => { test('exponents and logs', () => { check([ From 9c0f83c1f6421681a74650b11c4b286811f0a727 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:38:11 +0300 Subject: [PATCH 10/25] feat(functions): add statistics sum prod min max mean median mode quantile variance std mad entropy geometricMean harmonicMean skewness kurtosis All variadic, so a data set is written `mean(1, 2, 3)` and no array value type is needed. `min` and `max` were already mapped by the LaTeX renderer despite never having been implemented, so `max(1, 2)` was a syntax error. Conventions worth knowing, since TODO.md leaves them open: - `variance` and `std` use the sample (n - 1) normalization, as mathjs does. TODO.md's `normalization?` argument cannot be expressed variadically. - `mode` returns the smallest value when several tie. - `quantile(p, ...values)` takes the probability first so the data can be variadic, and interpolates as numpy does by default. - `kurtosis` is excess kurtosis, 0 for a normal distribution. - `entropy` is in nats, over the distribution the values describe. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/index.ts | 4 +- src/functions/statistics.ts | 87 +++++++++++++++++++++++++++++++++++++ tests/functions.test.ts | 36 +++++++++++++++ 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/functions/statistics.ts diff --git a/src/functions/index.ts b/src/functions/index.ts index e1f773b..a095627 100644 --- a/src/functions/index.ts +++ b/src/functions/index.ts @@ -1,6 +1,7 @@ import initNumbers from './numbers'; import initLogarithms from './logarithms'; import initTrignometry from './trignometry'; +import initStatistics from './statistics'; import { type IContext } from '../context'; export type IComputeFunction = (...args: number[]) => number; @@ -9,7 +10,8 @@ export function addBuiltinFunctions(ctx: IContext) { const fns: Record = { ...initNumbers(), ...initLogarithms(), - ...initTrignometry(ctx.preferences) + ...initTrignometry(ctx.preferences), + ...initStatistics() }; for (const name in fns) { diff --git a/src/functions/statistics.ts b/src/functions/statistics.ts new file mode 100644 index 0000000..728709d --- /dev/null +++ b/src/functions/statistics.ts @@ -0,0 +1,87 @@ +const total = (x: number[]) => x.reduce((s, c) => s + c, 0); + +const average = (x: number[]) => total(x) / x.length; + +const ascending = (x: number[]) => [...x].sort((a, b) => a - b); + +// central moment of order k, about the mean +function moment(x: number[], k: number): number { + const m = average(x); + return average(x.map((v) => (v - m) ** k)); +} + +// sample variance - the (n - 1) normalization, as in mathjs +function variance(x: number[]): number { + if (x.length < 2) return 0; + + const m = average(x); + return total(x.map((v) => (v - m) ** 2)) / (x.length - 1); +} + +// linear interpolation between order statistics, as in numpy's default +function quantile(p: number, x: number[]): number { + if (!x.length) return NaN; + + const values = ascending(x); + const h = (values.length - 1) * Math.min(Math.max(p, 0), 1); + const lower = Math.floor(h); + const upper = Math.ceil(h); + + return values[lower] + (h - lower) * (values[upper] - values[lower]); +} + +// the most frequent value, the smallest of them if several tie +function mode(x: number[]): number { + const counts = new Map(); + + for (const v of x) counts.set(v, (counts.get(v) ?? 0) + 1); + + let best = NaN; + let seen = 0; + + for (const v of ascending(x)) { + const count = counts.get(v)!; + if (count > seen) { + best = v; + seen = count; + } + } + + return best; +} + +export default function initStatistics() { + return { + sum: (...x: number[]) => total(x), + prod: (...x: number[]) => x.reduce((s, c) => s * c, 1), + min: (...x: number[]) => Math.min(...x), + max: (...x: number[]) => Math.max(...x), + mean: (...x: number[]) => average(x), + median: (...x: number[]) => quantile(0.5, x), + mode: (...x: number[]) => mode(x), + quantile: (p: number, ...x: number[]) => quantile(p, x), + variance: (...x: number[]) => variance(x), + std: (...x: number[]) => Math.sqrt(variance(x)), + // mean absolute deviation + mad: (...x: number[]) => { + const m = average(x); + return average(x.map((v) => Math.abs(v - m))); + }, + // shannon entropy in nats, over the distribution the values describe + entropy: (...x: number[]) => { + const scale = total(x); + return -total( + x.map((v) => { + const p = v / scale; + return p > 0 ? p * Math.log(p) : 0; + }) + ); + }, + geometricMean: (...x: number[]) => + Math.exp(average(x.map((v) => Math.log(v)))), + harmonicMean: (...x: number[]) => x.length / total(x.map((v) => 1 / v)), + skewness: (...x: number[]) => moment(x, 3) / moment(x, 2) ** 1.5, + // excess kurtosis - 0 for a normal distribution + kurtosis: (...x: number[]) => moment(x, 4) / moment(x, 2) ** 2 - 3 + }; +} diff --git a/tests/functions.test.ts b/tests/functions.test.ts index be5f7e2..8d585cc 100644 --- a/tests/functions.test.ts +++ b/tests/functions.test.ts @@ -92,6 +92,42 @@ describe('trigonometry', () => { }); }); +describe('statistics', () => { + test('totals and averages', () => { + check([ + ['sum(1, 2, 3)', 6], + ['prod(2, 3, 4)', 24], + ['min(4, 9, 2)', 2], + ['max(4, 9, 2)', 9], + ['mean(1, 2, 3)', 2], + ['median(1, 2, 3, 4)', 2.5], + ['median(3, 1, 2)', 2], + ['mode(1, 2, 2, 3)', 2], + // the smallest value wins a tie + ['mode(1, 1, 2, 2)', 1], + ['geometricMean(1, 4, 16)', 4], + ['harmonicMean(1, 2, 4)', 3 / 1.75] + ]); + }); + + test('spread and shape', () => { + check([ + // sample variance, the (n - 1) normalization + ['variance(2, 4, 4, 4, 5, 5, 7, 9)', 32 / 7], + ['std(2, 4, 4, 4, 5, 5, 7, 9)', Math.sqrt(32 / 7)], + ['variance(5)', 0], + ['mad(1, 2, 3, 4)', 1], + ['quantile(0.5, 1, 2, 3, 4)', 2.5], + ['quantile(0, 3, 1, 2)', 1], + ['quantile(1, 3, 1, 2)', 3], + ['entropy(0.5, 0.5)', Math.LN2], + ['entropy(1, 1, 1, 1)', Math.log(4)], + ['skewness(1, 2, 3)', 0], + ['kurtosis(1, 2, 3, 4, 5)', -1.3] + ]); + }); +}); + describe('logarithms', () => { test('exponents and logs', () => { check([ From 013e99270e3f778cdf223cfc1210c412b6f6f193 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:40:54 +0300 Subject: [PATCH 11/25] feat(functions): add probability and combinatorics factorial combinations permutations stirlingApproximation isPrime fibonacci birthdayProblem random randomInt pickRandom `combinations` uses the multiplicative form, which stays exact far longer than n! / (k! (n - k)!) - combinations(52, 5) is exact where the factorial form has already lost precision. Predicates return 1 or 0, since every mathflow value is a number. `random` and `randomInt` follow mathjs: no arguments, an upper bound, or a pair of bounds. TODO.md's `rand`/`randi` are the same functions under another name and are not implemented twice. This also needed a parser fix: a call with an empty argument list was a syntax error, so `random()` could not be written at all. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/index.ts | 4 +- src/functions/probability.ts | 99 ++++++++++++++++++++++++++++++++++++ src/parser/index.ts | 11 ++-- tests/functions.test.ts | 62 +++++++++++++++++++++- tests/parser.test.ts | 6 +++ 5 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 src/functions/probability.ts diff --git a/src/functions/index.ts b/src/functions/index.ts index a095627..175eb9b 100644 --- a/src/functions/index.ts +++ b/src/functions/index.ts @@ -2,6 +2,7 @@ import initNumbers from './numbers'; import initLogarithms from './logarithms'; import initTrignometry from './trignometry'; import initStatistics from './statistics'; +import initProbability from './probability'; import { type IContext } from '../context'; export type IComputeFunction = (...args: number[]) => number; @@ -11,7 +12,8 @@ export function addBuiltinFunctions(ctx: IContext) { ...initNumbers(), ...initLogarithms(), ...initTrignometry(ctx.preferences), - ...initStatistics() + ...initStatistics(), + ...initProbability() }; for (const name in fns) { diff --git a/src/functions/probability.ts b/src/functions/probability.ts new file mode 100644 index 0000000..7a4ef7c --- /dev/null +++ b/src/functions/probability.ts @@ -0,0 +1,99 @@ +// 171! overflows a double, so there is nothing to gain by looping further +const MAX_FACTORIAL = 170; + +function factorial(n: number): number { + if (n < 0 || !Number.isInteger(n)) return NaN; + if (n > MAX_FACTORIAL) return Infinity; + + let result = 1; + for (let i = 2; i <= n; i++) result *= i; + + return result; +} + +// multiplicative form, which stays exact far longer than n! / (k! (n - k)!) +function combinations(n: number, k: number): number { + n = Math.trunc(n); + k = Math.trunc(k); + + if (n < 0 || k < 0 || k > n) return 0; + + k = Math.min(k, n - k); + + let result = 1; + for (let i = 1; i <= k; i++) result = (result * (n - k + i)) / i; + + return Math.round(result); +} + +function permutations(n: number, k: number): number { + n = Math.trunc(n); + k = Math.trunc(k); + + if (n < 0 || k < 0 || k > n) return 0; + + let result = 1; + for (let i = 0; i < k; i++) result *= n - i; + + return result; +} + +function isPrime(n: number): number { + if (!Number.isInteger(n) || n < 2) return 0; + if (n < 4) return 1; + if (n % 2 === 0) return 0; + + for (let i = 3; i * i <= n; i += 2) { + if (n % i === 0) return 0; + } + + return 1; +} + +function fibonacci(n: number): number { + if (n < 0 || !Number.isInteger(n)) return NaN; + + let a = 0; + let b = 1; + + for (let i = 0; i < n; i++) [a, b] = [b, a + b]; + + return a; +} + +export default function initProbability() { + return { + factorial, + combinations, + permutations, + isPrime, + fibonacci, + stirlingApproximation: (n: number) => + Math.sqrt(2 * Math.PI * n) * (n / Math.E) ** n, + // random(), random(max) and random(min, max) + random: (min?: number, max?: number) => { + if (min === undefined) return Math.random(); + if (max === undefined) return Math.random() * min; + return min + Math.random() * (max - min); + }, + randomInt: (min?: number, max?: number) => { + if (min === undefined) return Math.round(Math.random()); + if (max === undefined) return Math.floor(Math.random() * min); + return min + Math.floor(Math.random() * (max - min)); + }, + pickRandom: (...x: number[]) => + x.length ? x[Math.floor(Math.random() * x.length)] : NaN, + // the chance that two of `n` share one of `days` days + birthdayProblem: (n: number, days = 365) => { + n = Math.trunc(n); + + if (n < 0 || days <= 0) return NaN; + if (n > days) return 1; + + let distinct = 1; + for (let i = 0; i < n; i++) distinct *= (days - i) / days; + + return 1 - distinct; + } + }; +} diff --git a/src/parser/index.ts b/src/parser/index.ts index 66923d3..153f20b 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -264,10 +264,13 @@ export function parse(tokens: IToken[]): IParseTree { // skip ( stream.advance(); - do { - const arg = parseExpression(); - if (arg) args.push(arg); - } while (!stream.isEOF && matchType(TOKEN.COMMA)); + // a call can take no arguments at all, as in `random()` + if (!check(TOKEN.RPAREN)) { + do { + const arg = parseExpression(); + if (arg) args.push(arg); + } while (!stream.isEOF && matchType(TOKEN.COMMA)); + } expect(TOKEN.RPAREN, SYMBOL.RPAREN); diff --git a/tests/functions.test.ts b/tests/functions.test.ts index 8d585cc..e59be6a 100644 --- a/tests/functions.test.ts +++ b/tests/functions.test.ts @@ -11,7 +11,20 @@ beforeEach(() => { // that was never registered fails here instead of lexing as a variable function check(cases: [string, number][]) { for (const [expr, expected] of cases) { - expect(ctx.solve(expr).value, expr).toBeCloseTo(expected, 8); + const actual = ctx.solve(expr).value; + + if (Number.isNaN(expected)) { + expect(actual, expr).toBeNaN(); + continue; + } + + // relative, so a large result is not held to an absolute epsilon + const tolerance = 1e-9 * Math.max(1, Math.abs(expected)); + + expect( + Math.abs(actual - expected), + `${expr} gave ${actual}, expected ${expected}` + ).toBeLessThanOrEqual(tolerance); } } @@ -128,6 +141,53 @@ describe('statistics', () => { }); }); +describe('probability', () => { + test('counting', () => { + check([ + ['factorial(0)', 1], + ['factorial(5)', 120], + ['factorial(-1)', NaN], + ['combinations(5, 2)', 10], + ['combinations(52, 5)', 2598960], + ['combinations(5, 6)', 0], + ['permutations(5, 2)', 20], + ['permutations(5, 0)', 1], + ['fibonacci(0)', 0], + ['fibonacci(10)', 55], + ['isPrime(1)', 0], + ['isPrime(2)', 1], + ['isPrime(97)', 1], + ['isPrime(91)', 0], + [ + 'stirlingApproximation(10)', + Math.sqrt(20 * Math.PI) * (10 / Math.E) ** 10 + ], + ['birthdayProblem(23)', 0.5072972343], + ['birthdayProblem(1)', 0], + ['birthdayProblem(400)', 1] + ]); + }); + + test('random values stay in range', () => { + for (let i = 0; i < 50; i++) { + const unit = ctx.solve('random()').value; + expect(unit).toBeGreaterThanOrEqual(0); + expect(unit).toBeLessThan(1); + + const scaled = ctx.solve('random(5, 10)').value; + expect(scaled).toBeGreaterThanOrEqual(5); + expect(scaled).toBeLessThan(10); + + const whole = ctx.solve('randomInt(1, 7)').value; + expect(Number.isInteger(whole)).toBe(true); + expect(whole).toBeGreaterThanOrEqual(1); + expect(whole).toBeLessThan(7); + + expect([3, 5, 8]).toContain(ctx.solve('pickRandom(3, 5, 8)').value); + } + }); +}); + describe('logarithms', () => { test('exponents and logs', () => { check([ diff --git a/tests/parser.test.ts b/tests/parser.test.ts index 7ba710b..29b8c91 100644 --- a/tests/parser.test.ts +++ b/tests/parser.test.ts @@ -67,6 +67,12 @@ describe('parser', () => { ] }); }); + test('calls with no arguments', () => { + expect(parse(tokenize(ctx, 'random()'))).toMatchObject({ + body: [{ type: NODE.CALL, value: 'random', arguments: [] }] + }); + }); + test('invalid token streams', () => { expect(() => { const tokens = tokenize( From 45fcd52fa28aedd9fe9a27125664ea67efc5a8d3 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:43:01 +0300 Subject: [PATCH 12/25] feat(functions): add special functions gamma lngamma digamma beta gammaIncomplete erf erfc zeta lambertW sinc heaviside Implementations follow the standard numerical recipes: Lanczos for gamma, series below a+1 and a continued fraction above it for the incomplete gamma, a reflection plus an asymptotic series for digamma, the accelerated alternating series for zeta with the functional equation covering s < 1/2, and Halley iteration for the Lambert W principal branch. `erf` is derived from the regularized incomplete gamma rather than a rational approximation, which is accurate to machine precision instead of ~1e-7. Each is pinned in the tests against a known closed form - gamma(1/2) = sqrt(pi), zeta(2) = pi^2/6, zeta(-1) = -1/12, digamma(1) = -gamma, and the identity W(x)e^W(x) = x. `gammaIncomplete` is the lower incomplete gamma, unregularized. `sinc` is unnormalized and always in radians. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/index.ts | 4 +- src/functions/special.ts | 205 +++++++++++++++++++++++++++++++++++++++ tests/functions.test.ts | 58 +++++++++++ 3 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 src/functions/special.ts diff --git a/src/functions/index.ts b/src/functions/index.ts index 175eb9b..7a1c866 100644 --- a/src/functions/index.ts +++ b/src/functions/index.ts @@ -3,6 +3,7 @@ import initLogarithms from './logarithms'; import initTrignometry from './trignometry'; import initStatistics from './statistics'; import initProbability from './probability'; +import initSpecial from './special'; import { type IContext } from '../context'; export type IComputeFunction = (...args: number[]) => number; @@ -13,7 +14,8 @@ export function addBuiltinFunctions(ctx: IContext) { ...initLogarithms(), ...initTrignometry(ctx.preferences), ...initStatistics(), - ...initProbability() + ...initProbability(), + ...initSpecial() }; for (const name in fns) { diff --git a/src/functions/special.ts b/src/functions/special.ts new file mode 100644 index 0000000..eb625ed --- /dev/null +++ b/src/functions/special.ts @@ -0,0 +1,205 @@ +// Lanczos approximation, g = 7 +const LANCZOS = [ + 0.99999999999980993, 676.5203681218851, -1259.1392167224028, + 771.32342877765313, -176.61502916214059, 12.507343278686905, + -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7 +]; + +const SQRT_2PI = Math.sqrt(2 * Math.PI); + +function series(x: number): number { + let a = LANCZOS[0]; + for (let i = 1; i < LANCZOS.length; i++) a += LANCZOS[i] / (x + i); + return a; +} + +function gamma(x: number): number { + // poles at zero and the negative integers + if (Number.isInteger(x) && x <= 0) return NaN; + + // reflection, since the approximation only holds for x >= 0.5 + if (x < 0.5) return Math.PI / (Math.sin(Math.PI * x) * gamma(1 - x)); + + x -= 1; + const t = x + 7.5; + + return SQRT_2PI * t ** (x + 0.5) * Math.exp(-t) * series(x); +} + +function lngamma(x: number): number { + if (x < 0.5) { + return ( + Math.log(Math.PI / Math.abs(Math.sin(Math.PI * x))) - lngamma(1 - x) + ); + } + + x -= 1; + const t = x + 7.5; + + return ( + Math.log(SQRT_2PI) + (x + 0.5) * Math.log(t) - t + Math.log(series(x)) + ); +} + +// regularized lower incomplete gamma, by series - converges for x < a + 1 +function gammaSeries(a: number, x: number): number { + let term = 1 / a; + let sum = term; + let n = a; + + for (let i = 0; i < 300; i++) { + n++; + term *= x / n; + sum += term; + if (Math.abs(term) < Math.abs(sum) * 1e-16) break; + } + + return sum * Math.exp(-x + a * Math.log(x) - lngamma(a)); +} + +// regularized upper incomplete gamma, by continued fraction - for x >= a + 1 +function gammaFraction(a: number, x: number): number { + const tiny = 1e-300; + + let b = x + 1 - a; + let c = 1 / tiny; + let d = 1 / b; + let h = d; + + for (let i = 1; i < 300; i++) { + const an = -i * (i - a); + + b += 2; + d = an * d + b; + if (Math.abs(d) < tiny) d = tiny; + c = b + an / c; + if (Math.abs(c) < tiny) c = tiny; + d = 1 / d; + + const delta = d * c; + h *= delta; + + if (Math.abs(delta - 1) < 1e-16) break; + } + + return Math.exp(-x + a * Math.log(x) - lngamma(a)) * h; +} + +// P(a, x) +function gammaRegularized(a: number, x: number): number { + if (a <= 0 || x < 0) return NaN; + if (x === 0) return 0; + + return x < a + 1 ? gammaSeries(a, x) : 1 - gammaFraction(a, x); +} + +function erf(x: number): number { + if (x === 0) return 0; + return Math.sign(x) * gammaRegularized(0.5, x * x); +} + +function digamma(x: number): number { + if (Number.isInteger(x) && x <= 0) return NaN; + + // reflection + if (x < 0) return digamma(1 - x) - Math.PI / Math.tan(Math.PI * x); + + let result = 0; + + // shift upwards, where the asymptotic series is accurate + while (x < 6) { + result -= 1 / x; + x++; + } + + const i = 1 / x; + const i2 = i * i; + + return ( + result + + Math.log(x) - + 0.5 * i - + i2 * + (1 / 12 - + i2 * (1 / 120 - i2 * (1 / 252 - i2 * (1 / 240 - i2 / 132)))) + ); +} + +function zeta(s: number): number { + if (s === 1) return Infinity; + if (s === 0) return -0.5; + + // functional equation, for the half plane the series does not cover + if (s < 0.5) { + return ( + 2 ** s * + Math.PI ** (s - 1) * + Math.sin((Math.PI * s) / 2) * + gamma(1 - s) * + zeta(1 - s) + ); + } + + // alternating series, accelerated (Cohen-Rodriguez Villegas-Zagier) + const n = 30; + + let d = (3 + Math.sqrt(8)) ** n; + d = (d + 1 / d) / 2; + + let b = -1; + let c = -d; + let sum = 0; + + for (let k = 0; k < n; k++) { + c = b - c; + sum += c / (k + 1) ** s; + b = ((k + n) * (k - n) * b) / ((k + 0.5) * (k + 1)); + } + + return sum / (d * (1 - 2 ** (1 - s))); +} + +// principal branch, by Halley iteration +function lambertW(x: number): number { + const lower = -1 / Math.E; + + if (x < lower) return NaN; + if (x === lower) return -1; + if (x === 0) return 0; + + let w = x < 10 ? Math.log1p(x) : Math.log(x) - Math.log(Math.log(x)); + + for (let i = 0; i < 100; i++) { + const e = Math.exp(w); + const f = w * e - x; + const step = f / (e * (w + 1) - ((w + 2) * f) / (2 * w + 2)); + + w -= step; + + if (Math.abs(step) < 1e-15 * Math.max(1, Math.abs(w))) break; + } + + return w; +} + +export default function initSpecial() { + return { + gamma, + lngamma, + digamma, + zeta, + lambertW, + erf, + erfc: (x: number) => 1 - erf(x), + beta: (a: number, b: number) => + a > 0 && b > 0 + ? Math.exp(lngamma(a) + lngamma(b) - lngamma(a + b)) + : (gamma(a) * gamma(b)) / gamma(a + b), + // the lower incomplete gamma, unregularized + gammaIncomplete: (a: number, x: number) => + gammaRegularized(a, x) * gamma(a), + // unnormalized, in radians - an angle preference does not apply + sinc: (x: number) => (x === 0 ? 1 : Math.sin(x) / x), + heaviside: (x: number) => (x < 0 ? 0 : x > 0 ? 1 : 0.5) + }; +} diff --git a/tests/functions.test.ts b/tests/functions.test.ts index e59be6a..257de0f 100644 --- a/tests/functions.test.ts +++ b/tests/functions.test.ts @@ -188,6 +188,64 @@ describe('probability', () => { }); }); +describe('special functions', () => { + const EULER_MASCHERONI = 0.577215664901532; + + test('gamma and friends', () => { + check([ + ['gamma(0.5)', Math.sqrt(Math.PI)], + ['gamma(1)', 1], + ['gamma(5)', 24], + ['gamma(-0.5)', -2 * Math.sqrt(Math.PI)], + ['gamma(0)', NaN], + ['lngamma(10)', Math.log(362880)], + ['digamma(1)', -EULER_MASCHERONI], + ['digamma(2)', 1 - EULER_MASCHERONI], + ['beta(2, 3)', 1 / 12], + ['beta(1, 1)', 1], + // the lower incomplete gamma: g(1, x) is 1 - e^-x + ['gammaIncomplete(1, 1)', 1 - 1 / Math.E], + ['gammaIncomplete(1, 0)', 0] + ]); + }); + + test('error function', () => { + check([ + ['erf(0)', 0], + ['erf(1)', 0.842700792949715], + ['erf(-1)', -0.842700792949715], + ['erf(3)', 0.999977909503001], + ['erfc(0)', 1], + ['erfc(1)', 1 - 0.842700792949715] + ]); + }); + + test('zeta and lambert w', () => { + check([ + ['zeta(2)', Math.PI ** 2 / 6], + ['zeta(4)', Math.PI ** 4 / 90], + ['zeta(0)', -0.5], + ['zeta(-1)', -1 / 12], + ['zeta(-2)', 0], + ['lambertW(0)', 0], + ['lambertW(e)', 1], + ['lambertW(1)', 0.567143290409784], + // W(x)e^W(x) = x + ['lambertW(10) * exp(lambertW(10))', 10] + ]); + }); + + test('sinc and heaviside', () => { + check([ + ['sinc(0)', 1], + ['sinc(pi)', 0], + ['heaviside(-2)', 0], + ['heaviside(0)', 0.5], + ['heaviside(2)', 1] + ]); + }); +}); + describe('logarithms', () => { test('exponents and logs', () => { check([ From 4ace249ed112f62e9a23daf6763ef5fcbd9aa37c Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 11:44:47 +0300 Subject: [PATCH 13/25] feat(functions): add financial math and number theory futureValue presentValue compoundInterest annuityPayment totient mobius isPerfectSquare `compoundInterest` returns the accrued amount, the A of A = P(1 + r/n)^(nt). `annuityPayment` falls back to an even split when the rate is zero, where the usual formula divides by zero. Co-Authored-By: Claude Opus 5 (1M context) --- src/functions/finance.ts | 20 +++++++++++++++ src/functions/index.ts | 6 ++++- src/functions/numbertheory.ts | 48 +++++++++++++++++++++++++++++++++++ tests/functions.test.ts | 42 ++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/functions/finance.ts create mode 100644 src/functions/numbertheory.ts diff --git a/src/functions/finance.ts b/src/functions/finance.ts new file mode 100644 index 0000000..d7b2716 --- /dev/null +++ b/src/functions/finance.ts @@ -0,0 +1,20 @@ +export default function initFinance() { + return { + futureValue: (principal: number, rate: number, periods: number) => + principal * (1 + rate) ** periods, + presentValue: (future: number, rate: number, periods: number) => + future / (1 + rate) ** periods, + // the accrued amount, compounding `times` per period + compoundInterest: ( + principal: number, + rate: number, + times: number, + periods: number + ) => principal * (1 + rate / times) ** (times * periods), + // the level payment that pays off `present` over `periods` + annuityPayment: (rate: number, periods: number, present: number) => + rate === 0 + ? present / periods + : (present * rate) / (1 - (1 + rate) ** -periods) + }; +} diff --git a/src/functions/index.ts b/src/functions/index.ts index 7a1c866..5bbab1f 100644 --- a/src/functions/index.ts +++ b/src/functions/index.ts @@ -4,6 +4,8 @@ import initTrignometry from './trignometry'; import initStatistics from './statistics'; import initProbability from './probability'; import initSpecial from './special'; +import initFinance from './finance'; +import initNumberTheory from './numbertheory'; import { type IContext } from '../context'; export type IComputeFunction = (...args: number[]) => number; @@ -15,7 +17,9 @@ export function addBuiltinFunctions(ctx: IContext) { ...initTrignometry(ctx.preferences), ...initStatistics(), ...initProbability(), - ...initSpecial() + ...initSpecial(), + ...initFinance(), + ...initNumberTheory() }; for (const name in fns) { diff --git a/src/functions/numbertheory.ts b/src/functions/numbertheory.ts new file mode 100644 index 0000000..d11319e --- /dev/null +++ b/src/functions/numbertheory.ts @@ -0,0 +1,48 @@ +export default function initNumberTheory() { + return { + // euler's totient - how many of 1..n are coprime to n + totient: (n: number) => { + n = Math.trunc(n); + if (n < 1) return NaN; + + let result = n; + + for (let p = 2; p * p <= n; p++) { + if (n % p !== 0) continue; + while (n % p === 0) n /= p; + result -= result / p; + } + + if (n > 1) result -= result / n; + + return result; + }, + // 0 if n has a squared prime factor, otherwise +/-1 by parity + mobius: (n: number) => { + n = Math.trunc(n); + if (n < 1) return NaN; + + let primes = 0; + + for (let p = 2; p * p <= n; p++) { + if (n % p !== 0) continue; + + n /= p; + if (n % p === 0) return 0; + + primes++; + } + + if (n > 1) primes++; + + return primes % 2 === 0 ? 1 : -1; + }, + isPerfectSquare: (n: number) => { + if (!Number.isInteger(n) || n < 0) return 0; + + const root = Math.round(Math.sqrt(n)); + + return root * root === n ? 1 : 0; + } + }; +} diff --git a/tests/functions.test.ts b/tests/functions.test.ts index 257de0f..4203ac2 100644 --- a/tests/functions.test.ts +++ b/tests/functions.test.ts @@ -246,6 +246,48 @@ describe('special functions', () => { }); }); +describe('finance', () => { + test('time value of money', () => { + const fv = 1000 * 1.05 ** 10; + + check([ + ['futureValue(1000, 0.05, 10)', fv], + [`presentValue(${fv}, 0.05, 10)`, 1000], + ['futureValue(1000, 0, 10)', 1000], + [ + 'compoundInterest(1000, 0.05, 12, 10)', + 1000 * (1 + 0.05 / 12) ** 120 + ], + [ + 'annuityPayment(0.05, 10, 1000)', + (1000 * 0.05) / (1 - 1.05 ** -10) + ], + // a zero rate is just the principal split evenly + ['annuityPayment(0, 10, 1000)', 100] + ]); + }); +}); + +describe('number theory', () => { + test('totient, mobius and squares', () => { + check([ + ['totient(1)', 1], + ['totient(9)', 6], + ['totient(10)', 4], + ['totient(97)', 96], + ['mobius(1)', 1], + ['mobius(2)', -1], + ['mobius(4)', 0], + ['mobius(6)', 1], + ['mobius(30)', -1], + ['isPerfectSquare(0)', 1], + ['isPerfectSquare(16)', 1], + ['isPerfectSquare(17)', 0], + ['isPerfectSquare(-4)', 0] + ]); + }); +}); + describe('logarithms', () => { test('exponents and logs', () => { check([ From 49b8e23bed1f6d0bccfefb64163713bce0db9664 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 12:57:18 +0300 Subject: [PATCH 14/25] chore(deps): drop the unused jest toolchain The suite runs on vitest. `jest`, `ts-jest` and `@types/jest` appear in no source, test or config file - there is no jest.config, no ts-jest transform, and no script that invokes them. Removing them also empties `minimumReleaseAgeExclude`, which existed only to whitelist the 45 jest packages the bump pulled in. This commit also carries the dependency version bumps that were already sitting uncommitted in the tree. Co-Authored-By: Claude Opus 5 (1M context) --- package.json | 23 +- pnpm-lock.yaml | 4535 +++++++++---------------------------------- pnpm-workspace.yaml | 4 + 3 files changed, 895 insertions(+), 3667 deletions(-) diff --git a/package.json b/package.json index 062d6e7..8c75ffe 100644 --- a/package.json +++ b/package.json @@ -40,21 +40,18 @@ "license": "MIT", "devDependencies": { "@eslint/js": "^10.0.1", - "@release-it/conventional-changelog": "^10.0.6", - "@types/jest": "^30.0.0", - "eslint": "^10.2.0", - "globals": "^17.4.0", + "@release-it/conventional-changelog": "^12.0.0", + "eslint": "^10.9.1", + "globals": "^17.11.0", "husky": "^9.1.7", - "jest": "^30.3.0", - "lint-staged": "^16.4.0", - "prettier": "^3.8.1", - "release-it": "^19.2.4", - "ts-jest": "^29.4.9", - "typescript": "6.0.2", - "typescript-eslint": "^8.58.0", + "lint-staged": "^17.4.1", + "prettier": "^3.9.6", + "release-it": "^21.0.2", + "typescript": "^6.0.3", + "typescript-eslint": "^8.68.0", "unbuild": "^3.6.1", - "vite": "^8.0.3", - "vitest": "^4.1.2" + "vite": "^8.2.2", + "vitest": "^4.1.11" }, "lint-staged": { "*.ts": "pnpm lint" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2696cc..ceffa6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,52 +14,43 @@ importers: devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.0(jiti@2.6.1)) + version: 10.0.1(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1)) '@release-it/conventional-changelog': - specifier: ^10.0.6 - version: 10.0.6(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(release-it@19.2.4(@types/node@25.5.2)) - '@types/jest': - specifier: ^30.0.0 - version: 30.0.0 + specifier: ^12.0.0 + version: 12.0.0(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)(release-it@21.0.2(@types/node@25.5.2)(supports-color@8.1.1)) eslint: - specifier: ^10.2.0 - version: 10.2.0(jiti@2.6.1) + specifier: ^10.9.1 + version: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) globals: - specifier: ^17.4.0 - version: 17.4.0 + specifier: ^17.11.0 + version: 17.11.0 husky: specifier: ^9.1.7 version: 9.1.7 - jest: - specifier: ^30.3.0 - version: 30.3.0(@types/node@25.5.2) lint-staged: - specifier: ^16.4.0 - version: 16.4.0 + specifier: ^17.4.1 + version: 17.4.1 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.9.6 + version: 3.9.6 release-it: - specifier: ^19.2.4 - version: 19.2.4(@types/node@25.5.2) - ts-jest: - specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.2))(typescript@6.0.2) + specifier: ^21.0.2 + version: 21.0.2(@types/node@25.5.2)(supports-color@8.1.1) typescript: - specifier: 6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: ^8.68.0 + version: 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) unbuild: specifier: ^3.6.1 - version: 3.6.1(typescript@6.0.2) + version: 3.6.1(typescript@6.0.3) vite: - specifier: ^8.0.3 - version: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3) + specifier: ^8.2.2 + version: 8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0) vitest: - specifier: ^4.1.2 - version: 4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3)) + specifier: ^4.1.11 + version: 4.1.11(@types/node@25.5.2)(vite@8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0)) packages: @@ -67,190 +58,28 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@colordx/core@5.0.3': resolution: {integrity: sha512-xBQ0MYRTNNxW3mS2sJtlQTT7C3Sasqgh1/PsHva7fyDb5uqYY+gv9V0utDdX8X80mqzbGz3u/IDJdn2d/uW09g==} - '@conventional-changelog/git-client@2.6.0': - resolution: {integrity: sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==} - engines: {node: '>=18'} + '@conventional-changelog/git-client@3.1.2': + resolution: {integrity: sha512-jZqwnJwf7nboIlAcw/mkOjVa6DexCcUOgT2oOQgkoi3z9vR8tGFkcMy2BFcYwjhL9sYcDDXkRQDayiDieCoW7A==} + engines: {node: '>=22'} peerDependencies: - conventional-commits-filter: ^5.0.0 - conventional-commits-parser: ^6.3.0 + conventional-commits-filter: ^6.0.1 + conventional-commits-parser: ^7.1.2 peerDependenciesMeta: conventional-commits-filter: optional: true conventional-commits-parser: optional: true - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@conventional-changelog/template@1.4.0': + resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} + engines: {node: '>=22'} '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -418,16 +247,16 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.4': - resolution: {integrity: sha512-lf19F24LSMfF8weXvW5QEtnLqW70u7kgit5e9PSx0MsHAFclGd1T9ynvWEMDT1w5J4Qt54tomGeAhdoAku1Xow==} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.4': - resolution: {integrity: sha512-jJhqiY3wPMlWWO3370M86CPJ7pt8GmEwSLglMfQhjXal07RCvhmU0as4IuUEW5SJeunfItiEetHmSxCCe9lDBg==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@1.2.0': - resolution: {integrity: sha512-8FTGbNzTvmSlc4cZBaShkC6YvFMG0riksYWRFKXztqVdXaQbcZLXlFbSpC05s70sGEsXAw0qwhx69JiW7hQS7A==} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/js@10.0.1': @@ -439,12 +268,12 @@ packages: eslint: optional: true - '@eslint/object-schema@3.0.4': - resolution: {integrity: sha512-55lO/7+Yp0ISKRP0PsPtNTeNGapXaO085aELZmWCVc5SH3jfrqpuU6YgOdIxMS99ZHkQN1cXKE+cdIqwww9ptw==} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.0': - resolution: {integrity: sha512-ejvBr8MQCbVsWNZnCwDXjUKq40MDmHalq7cJ6e9s/qzTUFIIo/afzt1Vui9T97FM/V/pN4YsFVoed5NIa96RDg==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.1': @@ -463,234 +292,140 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} + '@inquirer/checkbox@5.2.3': + resolution: {integrity: sha512-XEYX2WA8SBkLPczL6/yXPHLPCvDoptmh9v56Cy05BSV1Smk1vWy19bTC4qJBuIffw7+6l4CcaYYzGqG60RfW1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} + '@inquirer/confirm@6.3.0': + resolution: {integrity: sha512-pZHXJImFtERmSNMBHcjwuz8Ck5vEFEYNUZnwbb8aJpjHv/TwGuFErNxF2Hp8+V+pNJs2EYPMlyWscvFEqO9jOQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} + '@inquirer/core@12.0.1': + resolution: {integrity: sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} + '@inquirer/editor@5.3.1': + resolution: {integrity: sha512-y43COoyVUjPWIobn2Qep/uI1drPS78aaZZZ9kVi94Tyu/GuW2N8d8Q4rifJXGAXCEAXCPTTMjD8gC1HyvM5ukA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} + '@inquirer/expand@5.1.3': + resolution: {integrity: sha512-3NQJiXNJ/aj9wiAsr7pECdp5Qe9J0X9YUJCKsaFXS+ddOxfL6J4AIl3w3T4Gq3kK0WsQY5GMoDokK5X94m6lHw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} + '@inquirer/external-editor@3.0.4': + resolution: {integrity: sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + '@inquirer/figures@2.0.8': + resolution: {integrity: sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} + '@inquirer/input@5.1.4': + resolution: {integrity: sha512-3xQkQrOvgOzpSN2ciTVdRDlg1FWMCA8l+0KfB6SNlILoTCGzJTzO/gc0Rwjcb3usuGyKdaGtI6OiyMdeMeLWkg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} + '@inquirer/number@4.2.1': + resolution: {integrity: sha512-5KaqwZNLRpUuWcoCrYghPP9TMaXL5v2Sk4xqePM7RCVegcJStoXdWibio60YIC1bec+z1fCyb67N6XPJIkZtGA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} + '@inquirer/password@5.2.0': + resolution: {integrity: sha512-CvVcW09emkBESEOW+4R8CjLNkP3fB3XrjeL8CDvfpjgrJN+V9oerXmJAXXM3l+4xqYPD5Yaujzy/Ph0PLOdDuA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/prompts@7.10.1': - resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} - engines: {node: '>=18'} + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} + '@inquirer/rawlist@5.3.3': + resolution: {integrity: sha512-Mu7WrtmDLaXBDEyrRLS70SZgX9ZSm4Up1w0ZxiH8C1OOp9oaVCn2k8q3QGgmlnhsKYUhuaU3zFWhAP6wxkVIMA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} + '@inquirer/search@4.3.1': + resolution: {integrity: sha512-0VWOvsHWI0rPj6CG70MoP4oXNCB6adcyN8bVFZXnh11eLDdPIK2f2XCmva78acPPDfJisfab7qNakwBh7hdBXw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} + '@inquirer/select@5.2.3': + resolution: {integrity: sha512-KuRTodDa6xBXX2noIpjuitpX/QT7Sfav7dIZ/OfUY54Hxg95nrGoshSzxx6Ey7qqLbImKdiGkSDt7KjPXjQgmA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + '@inquirer/type@4.1.0': + resolution: {integrity: sha512-FMiJpuHUG3Dk0ex+UIXkre7i+i4OcwHWk9YdcVtZHFwb/r2rnrU2ipTCNAB7A+QOP0ryzIcqOfy76fRyyvOEAw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@30.3.0': - resolution: {integrity: sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/core@30.3.0': - resolution: {integrity: sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/diff-sequences@30.3.0': - resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/environment@30.3.0': - resolution: {integrity: sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect-utils@30.3.0': - resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect@30.3.0': - resolution: {integrity: sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/fake-timers@30.3.0': - resolution: {integrity: sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/globals@30.3.0': - resolution: {integrity: sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/pattern@30.0.1': - resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/reporters@30.3.0': - resolution: {integrity: sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/snapshot-utils@30.3.0': - resolution: {integrity: sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/source-map@30.0.1': - resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/test-result@30.3.0': - resolution: {integrity: sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/test-sequencer@30.3.0': - resolution: {integrity: sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/transform@30.3.0': - resolution: {integrity: sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/types@30.3.0': - resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -707,18 +442,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - - '@napi-rs/wasm-runtime@1.1.2': - resolution: {integrity: sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@nodeutils/defaults-deep@1.1.0': - resolution: {integrity: sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==} - '@octokit/auth-token@6.0.0': resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} @@ -771,124 +494,117 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.147.0': + resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} '@phun-ky/typeof@2.0.3': resolution: {integrity: sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==} engines: {node: ^20.9.0 || >=22.0.0, npm: '>=10.8.2'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@release-it/conventional-changelog@10.0.6': - resolution: {integrity: sha512-aUb0IkcsBTMcOH5PPQ9Jv9lEOOVu2+rSgkE1ny+dzsTziQm2BhDRAtaFK/dw/HflthuXMWrqhhyfJhAV1AOEPQ==} - engines: {node: ^20.12.0 || >=22.0.0} + '@release-it/conventional-changelog@12.0.0': + resolution: {integrity: sha512-b9N8/tUjO9JNH1u2fVSmq8QmbqnE//Y5iCgvPcytsk0pj0GhgGCp+VmfzhEBIdd+lVGZJKs+ZSaGaOHjtmtv7g==} + engines: {node: ^22.21.0 || >=24.0.0} peerDependencies: - release-it: ^18.0.0 || ^19.0.0 + release-it: ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + + '@rolldown/binding-android-arm-eabi@1.2.6': + resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@rolldown/binding-android-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + '@rolldown/binding-android-arm64@1.2.6': + resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + '@rolldown/binding-darwin-arm64@1.2.6': + resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.12': - resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + '@rolldown/binding-darwin-x64@1.2.6': + resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': - resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + '@rolldown/binding-freebsd-x64@1.2.6': + resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': - resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + '@rolldown/binding-linux-arm64-gnu@1.2.6': + resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + '@rolldown/binding-linux-arm64-musl@1.2.6': + resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + '@rolldown/binding-linux-ppc64-gnu@1.2.6': + resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + '@rolldown/binding-linux-s390x-gnu@1.2.6': + resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-x64-gnu@1.2.6': + resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-musl@1.2.6': + resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + '@rolldown/binding-openharmony-arm64@1.2.6': + resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + '@rolldown/binding-win32-arm64-msvc@1.2.6': + resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + '@rolldown/binding-win32-x64-msvc@1.2.6': + resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.12': - resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -1082,48 +798,25 @@ packages: cpu: [x64] os: [win32] - '@simple-libs/child-process-utils@1.0.2': - resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} - engines: {node: '>=18'} - - '@simple-libs/hosted-git-info@1.0.2': - resolution: {integrity: sha512-aAmGQdMH+ZinytKuA2832u0ATeOFNYNk4meBEXtB5xaPotUgggYNhq5tYU/v17wEbmTW5P9iHNqNrFyrhnqBAg==} - engines: {node: '>=18'} - - '@simple-libs/stream-utils@1.2.0': - resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} - engines: {node: '>=18'} + '@simple-libs/child-process-utils@2.0.0': + resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==} + engines: {node: '>=22'} - '@sinclair/typebox@0.34.49': - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + '@simple-libs/hosted-git-info@2.0.0': + resolution: {integrity: sha512-55XwK/GYgV58PuN8lZFhI1qRxdKoMLJocXl/yM1EPqazFDmM4QWY7q6BxPCPDNKTNunj794DSD4h0H7SrqUdMg==} + engines: {node: '>=22'} - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@simple-libs/normalize-package-data@1.0.0': + resolution: {integrity: sha512-/EOmFBekV9tGee8gac/k+5Ox3twkypNqh5TfxA9vTkmcJkjm6f1xqrlstDNOrEhTvnYyVtU6Du2ZhY/IV1+9GA==} + engines: {node: '>=22'} - '@sinonjs/fake-timers@15.3.0': - resolution: {integrity: sha512-m2xozxSfCIxjDdvbhIWazlP2i2aha/iUmbl94alpsIbd3iLTfeXgfBVbwyWogB6l++istyGZqamgA/EcqYf+Bg==} + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1136,27 +829,12 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@30.0.0': - resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/node@25.5.2': resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/parse-path@7.1.0': resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. @@ -1164,185 +842,70 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - - '@typescript-eslint/eslint-plugin@8.58.0': - resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} + '@typescript-eslint/eslint-plugin@8.68.0': + resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.0 + '@typescript-eslint/parser': ^8.68.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.0': - resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} + '@typescript-eslint/parser@8.68.0': + resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.0': - resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} + '@typescript-eslint/project-service@8.68.0': + resolution: {integrity: sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.0': - resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} + '@typescript-eslint/scope-manager@8.68.0': + resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.0': - resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} + '@typescript-eslint/tsconfig-utils@8.68.0': + resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.0': - resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} + '@typescript-eslint/type-utils@8.68.0': + resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.0': - resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} + '@typescript-eslint/types@8.68.0': + resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.0': - resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} + '@typescript-eslint/typescript-estree@8.68.0': + resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.0': - resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} + '@typescript-eslint/utils@8.68.0': + resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.0': - resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} + '@typescript-eslint/visitor-keys@8.68.0': + resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} - cpu: [x64] - os: [win32] + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} - '@vitest/expect@4.1.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} - - '@vitest/mocker@4.1.2': - resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} + '@vitest/mocker@4.1.11': + resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1352,20 +915,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} - '@vitest/runner@4.1.2': - resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} - '@vitest/snapshot@4.1.2': - resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} - '@vitest/spy@4.1.2': - resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} - '@vitest/utils@4.1.2': - resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1377,50 +940,20 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + argue-cli@3.1.0: + resolution: {integrity: sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw==} + engines: {node: '>=22'} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} @@ -1440,34 +973,6 @@ packages: peerDependencies: postcss: ^8.1.0 - babel-jest@30.3.0: - resolution: {integrity: sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-0 - - babel-plugin-istanbul@7.0.1: - resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} - engines: {node: '>=12'} - - babel-plugin-jest-hoist@30.3.0: - resolution: {integrity: sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} - peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 - - babel-preset-jest@30.3.0: - resolution: {integrity: sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-beta.1 - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -1477,8 +982,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - basic-ftp@5.2.0: - resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + basic-ftp@5.3.1: + resolution: {integrity: sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==} engines: {node: '>=10.0.0'} before-after-hook@4.0.0: @@ -1487,12 +992,6 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.13: - resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} - - brace-expansion@2.0.3: - resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} @@ -1502,13 +1001,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1516,26 +1008,14 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - c12@3.3.3: - resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: magicast: '*' peerDependenciesMeta: magicast: optional: true - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} @@ -1546,18 +1026,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} @@ -1572,12 +1044,6 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - citty@0.2.2: - resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} - - cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -1586,52 +1052,17 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} - cli-truncate@5.2.0: - resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} - engines: {node: '>=20'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - collect-v8-coverage@1.0.3: - resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} @@ -1646,40 +1077,40 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - conventional-changelog-angular@8.3.1: - resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} - engines: {node: '>=18'} + conventional-changelog-angular@9.4.0: + resolution: {integrity: sha512-HdxRxuS8bBXVIuo4V82gvSwAXT0vYQUizrjs/izmPg5JdDstr8v8I5hduGL3iQbG+o310dUDxC4+LetuS5hu9w==} + engines: {node: '>=22'} - conventional-changelog-conventionalcommits@9.3.1: - resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} - engines: {node: '>=18'} + conventional-changelog-conventionalcommits@10.4.0: + resolution: {integrity: sha512-Rriac6ZrAlVm6cy9Bz4NSp+WMHpwNXoPIYex+HjCgduAVUSbnew29DQjQw0C4g9u3HtSYzGiGY+pdBXAZo+4aA==} + engines: {node: '>=22'} - conventional-changelog-preset-loader@5.0.0: - resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} - engines: {node: '>=18'} + conventional-changelog-preset-loader@6.0.1: + resolution: {integrity: sha512-GZ8E3RQzXQb3JFy0pKl8oeSf7ENIhvAMvJr+PlWkavZOesLHHdhkfNJ4SvW35eo1Fu2+EyVxWQ1tVvtzAG2iWg==} + engines: {node: '>=22'} - conventional-changelog-writer@8.4.0: - resolution: {integrity: sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==} - engines: {node: '>=18'} + conventional-changelog-writer@9.2.1: + resolution: {integrity: sha512-StlYSmW3wLedRaqohJMpP3YuWiAqtgD0/cpsai9frdDkXv7rxj0hRbpJrubPYvJxJsjplONsOobEQnPuS9UgCg==} + engines: {node: '>=22'} hasBin: true - conventional-changelog@7.2.0: - resolution: {integrity: sha512-BEdgG+vPl53EVlTTk9sZ96aagFp0AQ5pw/ggiQMy2SClLbTo1r0l+8dSg79gkLOO5DS1Lswuhp5fWn6RwE+ivg==} - engines: {node: '>=18'} + conventional-changelog@8.1.3: + resolution: {integrity: sha512-fOMwLCxm46znJKPB08jLxl1FD8SOZOQHktlzCVhvhhVUfq0KgQSryoYXsRRHs1aRlZPR1/QK5wztnY8sBNC2AA==} + engines: {node: '>=22'} hasBin: true - conventional-commits-filter@5.0.0: - resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} - engines: {node: '>=18'} + conventional-commits-filter@6.0.1: + resolution: {integrity: sha512-cs+LadpH7Kpw0M3k8wurk+sOVVDAENA0iK4OBOrkL94j5lEVYRJ4j3zd2bhY9qgzyrPqthdcYT3axzRN7AliMg==} + engines: {node: '>=22'} - conventional-commits-parser@6.4.0: - resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} - engines: {node: '>=18'} + conventional-commits-parser@7.1.2: + resolution: {integrity: sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==} + engines: {node: '>=22'} hasBin: true - conventional-recommended-bump@11.2.0: - resolution: {integrity: sha512-lqIdmw330QdMBgfL0e6+6q5OMKyIpy4OZNmepit6FS3GldhkG+70drZjuZ0A5NFpze5j85dlYs3GabQXl6sMHw==} - engines: {node: '>=18'} + conventional-recommended-bump@12.1.0: + resolution: {integrity: sha512-HTNG3kEZXOOfKwrEx54ljURU9bG4nVPQzXMyCSeUcA/PE8EpNpQNujSrbXNBI8QZyN35zM+pVw+FuQk4KqHSHg==} + engines: {node: '>=22'} hasBin: true convert-source-map@2.0.0: @@ -1737,9 +1168,9 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + data-uri-to-buffer@8.0.0: + resolution: {integrity: sha512-6UHfyCux51b8PTGDgveqtz1tvphBku5DrMKKJbFAZAJOI2zsjDpDoYE1+QGj7FOMS4BdTFNJsJiR3zEB0xH0yQ==} + engines: {node: '>= 20'} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -1750,14 +1181,6 @@ packages: supports-color: optional: true - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1780,9 +1203,14 @@ packages: defu@6.1.6: resolution: {integrity: sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + degenerator@7.0.1: + resolution: {integrity: sha512-ABErK0IefDSyHjlPH7WUEenIAX2rPPnrDcDM+TS3z3+zu9TfyKKi07BQM+8rmxpdE2y1v5fjjdoAS/x4D2U60w==} + engines: {node: '>= 20'} + peerDependencies: + quickjs-wasi: ^2.2.0 destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} @@ -1791,10 +1219,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1808,44 +1232,17 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dotenv@17.4.0: resolution: {integrity: sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ==} engines: {node: '>=12'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.331: resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-module-lexer@2.0.0: resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} @@ -1858,10 +1255,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1883,8 +1276,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.9.1: + resolution: {integrity: sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1924,33 +1317,14 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eta@4.5.0: - resolution: {integrity: sha512-qifAYjuW5AM1eEEIsFnOwB+TGqu6ynU3OKj9WbUTOtUBHFPZqL03XUW34kbp3zm19Ald+U8dEyRXaVsUck+Y1g==} + eta@4.6.0: + resolution: {integrity: sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==} engines: {node: '>=20'} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - exit-x@0.2.2: - resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} - engines: {node: '>= 0.8.0'} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - expect@30.3.0: - resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -1966,8 +1340,14 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} @@ -1985,10 +1365,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2003,16 +1379,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2021,36 +1390,16 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} + get-uri@8.0.1: + resolution: {integrity: sha512-/5N/P4Lrh0p/mDwlDRi7Y1+P2o/OyzZI3l6Iz1Ov6XXwwm1y3RlZLuo3gVgML99djrEDtV980bBxSuOeHLk8ww==} + engines: {node: '>= 20'} - giget@2.0.0: - resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} hasBin: true git-up@8.1.1: @@ -2063,27 +1412,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - globals@17.4.0: - resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} + globals@17.11.0: + resolution: {integrity: sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==} engines: {node: '>=18'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - handlebars@4.7.9: - resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} - engines: {node: '>=0.4.7'} - hasBin: true - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2095,28 +1427,13 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@8.1.0: - resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} - engines: {node: ^18.17.0 || >=20.5.0} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + http-proxy-agent@9.1.0: + resolution: {integrity: sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==} + engines: {node: '>= 20'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + https-proxy-agent@9.1.0: + resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} + engines: {node: '>= 20'} husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} @@ -2135,38 +1452,17 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inquirer@12.11.1: - resolution: {integrity: sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -2180,22 +1476,14 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} - - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2208,24 +1496,12 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} is-ssh@1.4.1: resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -2237,161 +1513,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - issue-parser@7.0.1: - resolution: {integrity: sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==} + issue-parser@7.0.2: + resolution: {integrity: sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==} engines: {node: ^18.17 || >=20.6.1} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jest-changed-files@30.3.0: - resolution: {integrity: sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-circus@30.3.0: - resolution: {integrity: sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-cli@30.3.0: - resolution: {integrity: sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@30.3.0: - resolution: {integrity: sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@types/node': '*' - esbuild-register: '>=3.4.0' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - esbuild-register: - optional: true - ts-node: - optional: true - - jest-diff@30.3.0: - resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-docblock@30.2.0: - resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-each@30.3.0: - resolution: {integrity: sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-environment-node@30.3.0: - resolution: {integrity: sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-haste-map@30.3.0: - resolution: {integrity: sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-leak-detector@30.3.0: - resolution: {integrity: sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-matcher-utils@30.3.0: - resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-message-util@30.3.0: - resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-mock@30.3.0: - resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@30.0.1: - resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-resolve-dependencies@30.3.0: - resolution: {integrity: sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-resolve@30.3.0: - resolution: {integrity: sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-runner@30.3.0: - resolution: {integrity: sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-runtime@30.3.0: - resolution: {integrity: sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-snapshot@30.3.0: - resolution: {integrity: sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-util@30.3.0: - resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-validate@30.3.0: - resolution: {integrity: sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-watcher@30.3.0: - resolution: {integrity: sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-worker@30.3.0: - resolution: {integrity: sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest@30.3.0: - resolution: {integrity: sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true @@ -2403,21 +1528,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2427,119 +1540,99 @@ packages: json-with-bigint@3.5.8: resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} knitwork@1.3.0: resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lint-staged@16.4.0: - resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} - engines: {node: '>=20.17'} + lint-staged@17.4.1: + resolution: {integrity: sha512-FmJeudcalbSfg1du+JCfvi5vS6Qt08KgbfLWiHinbef+2JJwUZwAWVoaO1AcJVUTWPfk0t30PMQNwPAeCzYQ+Q==} + engines: {node: '>=22.22.1'} hasBin: true - listr2@9.0.5: - resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} - engines: {node: '>=20.0.0'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2568,23 +1661,10 @@ packages: lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -2596,29 +1676,12 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} @@ -2627,14 +1690,6 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -2643,20 +1698,6 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - mkdist@2.4.1: resolution: {integrity: sha512-Ezk0gi04GJBkqMfsksICU5Rjoemc4biIekwgrONWVPor2EO/N9nBgN6MZXAf7Yw4mDDhrNyKbdETaHNevfumKg==} hasBin: true @@ -2684,26 +1725,23 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -2712,110 +1750,55 @@ packages: resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-fetch-native@1.6.7: - resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.37: resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} - normalize-package-data@7.0.1: - resolution: {integrity: sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==} - engines: {node: ^18.17.0 || >=20.5.0} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nypm@0.6.5: - resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} - engines: {node: '>=18'} - hasBin: true - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@9.0.0: - resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + ora@9.4.1: + resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} - os-name@6.1.0: - resolution: {integrity: sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg==} - engines: {node: '>=18'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + os-name@7.0.0: + resolution: {integrity: sha512-/HfRU/lPPr4T2VigM+cvM3cU77es+XF4OEAa4aE5zpdvrxHGD2NmH0AFIWpMNAb+CsZL45rlcIO49Re0ZcRseg==} + engines: {node: '>=20'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pac-proxy-agent@9.1.0: + resolution: {integrity: sha512-1aU+1mpj3DrQPfo3gh+3Gap3G5x+axnMx1P/y0ZF2ch7kb2meyOCAH8K2k9d27ROsTE7TnAerzxqF9aon2jqnA==} + engines: {node: '>= 20'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + pac-resolver@9.0.1: + resolution: {integrity: sha512-lJbS008tmkj08VhoM8Hzuv/VE5tK9MS0OIQ/7+s0lIF+BYhiQWFYzkSpML7lXs9iBu2jfmzBTLzhe9n6BX+dYw==} + engines: {node: '>= 20'} + peerDependencies: + quickjs-wasi: ^2.2.0 parse-path@7.1.0: resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} @@ -2828,25 +1811,13 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -2856,21 +1827,13 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -3053,16 +2016,28 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + powershell-utils@0.2.0: + resolution: {integrity: sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -3070,32 +2045,35 @@ packages: resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} engines: {node: '>=20'} - pretty-format@30.3.0: - resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - protocols@2.0.2: resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} + proxy-agent-negotiate@1.1.0: + resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} + engines: {node: '>= 20'} + peerDependencies: + kerberos: ^2.0.0 + peerDependenciesMeta: + kerberos: + optional: true - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-agent@8.0.2: + resolution: {integrity: sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==} + engines: {node: '>= 20'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@7.0.1: - resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} - - rc9@2.1.2: - resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + quickjs-wasi@2.2.0: + resolution: {integrity: sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -3105,23 +2083,11 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} - release-it@19.2.4: - resolution: {integrity: sha512-BwaJwQYUIIAKuDYvpqQTSoy0U7zIy6cHyEjih/aNaFICphGahia4cjDANuFXb7gVZ51hIK9W0io6fjNQWXqICg==} - engines: {node: ^20.12.0 || >=22.0.0} + release-it@21.0.2: + resolution: {integrity: sha512-QwyDnWiQNB4d8Hc2b5FLMHcsKz9S2O1dMNnPB7w+0knsL5r8+qbnznDA1X7Bw5D863+Ud7eRHc71Cfth5Tlrgg==} + engines: {node: ^22.21.0 || >=24.0.0} hasBin: true - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -3135,11 +2101,8 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rolldown@1.0.0-rc.12: - resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + rolldown@1.2.6: + resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3159,13 +2122,6 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} - run-async@4.0.6: - resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} - engines: {node: '>=0.12.0'} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3179,17 +2135,13 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -3204,32 +2156,17 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - - slice-ansi@8.0.0: - resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} - engines: {node: '>=20'} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} + socks-proxy-agent@10.1.0: + resolution: {integrity: sha512-WlMj/67cEJ6MDI1OcsnjuYKDNDoyPCCYZ249kuuXPiMDw9F8PXkVaQ7YWu3siTydfQ/4BEZcvGzu+aYvz7dDCQ==} + engines: {node: '>= 20'} socks@2.8.7: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} @@ -3239,62 +2176,24 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@4.0.0: resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - string-width@8.2.0: resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} engines: {node: '>=20'} @@ -3302,40 +2201,16 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - stylehacks@7.0.8: resolution: {integrity: sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -3349,14 +2224,6 @@ packages: engines: {node: '>=16'} hasBin: true - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} - engines: {node: ^14.18.0 || >=16.0.0} - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3364,50 +2231,28 @@ packages: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - ts-jest@29.4.9: - resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 || ^30.0.0 - '@jest/types': ^29.0.0 || ^30.0.0 - babel-jest: ^29.0.0 || ^30.0.0 - esbuild: '*' - jest: ^29.0.0 || ^30.0.0 - jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <7' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - jest-util: - optional: true - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3415,45 +2260,28 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.58.0: - resolution: {integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==} + typescript-eslint@8.68.0: + resolution: {integrity: sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - unbuild@3.6.1: resolution: {integrity: sha512-+U5CdtrdjfWkZhuO4N9l5UhyiccoeMEXIc2Lbs30Haxb+tRwB3VwB8AoZRxlAzORXunenSo+j6lh45jx+xkKgg==} hasBin: true @@ -3466,16 +2294,13 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@8.0.2: - resolution: {integrity: sha512-B9MeU5wuFhkFAuNeA19K2GDFcQXZxq33fL0nRy2Aq30wdufZbyyvxW3/ChaeipXVfy/wUweZyzovQGk39+9k2w==} - engines: {node: '>=22.19.0'} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - untyped@2.0.0: resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true @@ -3496,21 +2321,14 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - vite@8.0.3: - resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==} + vite@8.2.2: + resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.0 - esbuild: ^0.27.0 + '@vitejs/devtools': ^0.4.0 || ^0.5.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 sass: ^1.70.0 @@ -3546,18 +2364,20 @@ packages: yaml: optional: true - vitest@4.1.2: - resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} + vitest@4.1.11: + resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.2 - '@vitest/browser-preview': 4.1.2 - '@vitest/browser-webdriverio': 4.1.2 - '@vitest/ui': 4.1.2 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-preview': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 + '@vitest/coverage-istanbul': 4.1.11 + '@vitest/coverage-v8': 4.1.11 + '@vitest/ui': 4.1.11 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3574,6 +2394,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -3585,9 +2409,6 @@ packages: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3601,72 +2422,27 @@ packages: wildcard-match@5.1.4: resolution: {integrity: sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==} - windows-release@6.1.0: - resolution: {integrity: sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==} - engines: {node: '>=18'} + windows-release@7.1.1: + resolution: {integrity: sha512-0GBwC9WmR8Bm3WYiz3FC391054BsFHZ2gzBVdYj9uj5eIVYzbn/YPYCYW9SWdh9vwnLuzpn1UGwJKiMG4F236w==} + engines: {node: '>=20'} word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} @@ -3678,216 +2454,23 @@ snapshots: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 + optional: true - '@babel/compat-data@7.29.0': {} - - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.28.6': {} - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.29.2': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@bcoe/v8-coverage@0.2.3': {} + '@babel/helper-validator-identifier@7.28.5': + optional: true '@colordx/core@5.0.3': {} - '@conventional-changelog/git-client@2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': + '@conventional-changelog/git-client@3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)': dependencies: - '@simple-libs/child-process-utils': 1.0.2 - '@simple-libs/stream-utils': 1.2.0 + '@simple-libs/child-process-utils': 2.0.0 + '@simple-libs/stream-utils': 2.0.0 semver: 7.7.4 optionalDependencies: - conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.4.0 - - '@emnapi/core@1.9.2': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.9.2': - dependencies: - tslib: 2.8.1 - optional: true + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.1.2 - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true + '@conventional-changelog/template@1.4.0': {} '@esbuild/aix-ppc64@0.25.12': optional: true @@ -3967,38 +2550,38 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))': dependencies: - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.4': + '@eslint/config-array@0.23.5(supports-color@8.1.1)': dependencies: - '@eslint/object-schema': 3.0.4 - debug: 4.4.3 + '@eslint/object-schema': 3.0.5 + debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.4': + '@eslint/config-helpers@0.7.0': dependencies: - '@eslint/core': 1.2.0 + '@eslint/core': 1.2.1 - '@eslint/core@1.2.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.0(jiti@2.6.1))': + '@eslint/js@10.0.1(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))': optionalDependencies: - eslint: 10.2.0(jiti@2.6.1) + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) - '@eslint/object-schema@3.0.4': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.0': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 1.2.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -4012,399 +2595,179 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@1.0.2': {} + '@inquirer/ansi@2.0.7': {} - '@inquirer/checkbox@4.3.2(@types/node@25.5.2)': + '@inquirer/checkbox@5.2.3(@types/node@25.5.2)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.2) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/figures': 2.0.8 + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/confirm@5.1.21(@types/node@25.5.2)': + '@inquirer/confirm@6.3.0(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/core@10.3.2(@types/node@25.5.2)': + '@inquirer/core@12.0.1(@types/node@25.5.2)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.2) + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.8 + '@inquirer/type': 4.1.0(@types/node@25.5.2) cli-width: 4.1.0 - mute-stream: 2.0.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 25.5.2 - '@inquirer/editor@4.2.23(@types/node@25.5.2)': + '@inquirer/editor@5.3.1(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/external-editor': 1.0.3(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/external-editor': 3.0.4(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/expand@4.0.23(@types/node@25.5.2)': + '@inquirer/expand@5.1.3(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/external-editor@1.0.3(@types/node@25.5.2)': + '@inquirer/external-editor@3.0.4(@types/node@25.5.2)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: '@types/node': 25.5.2 - '@inquirer/figures@1.0.15': {} + '@inquirer/figures@2.0.8': {} - '@inquirer/input@4.3.1(@types/node@25.5.2)': + '@inquirer/input@5.1.4(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/number@3.0.23(@types/node@25.5.2)': + '@inquirer/number@4.2.1(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/password@4.0.23(@types/node@25.5.2)': + '@inquirer/password@5.2.0(@types/node@25.5.2)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/prompts@7.10.1(@types/node@25.5.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.5.2) - '@inquirer/confirm': 5.1.21(@types/node@25.5.2) - '@inquirer/editor': 4.2.23(@types/node@25.5.2) - '@inquirer/expand': 4.0.23(@types/node@25.5.2) - '@inquirer/input': 4.3.1(@types/node@25.5.2) - '@inquirer/number': 3.0.23(@types/node@25.5.2) - '@inquirer/password': 4.0.23(@types/node@25.5.2) - '@inquirer/rawlist': 4.1.11(@types/node@25.5.2) - '@inquirer/search': 3.2.2(@types/node@25.5.2) - '@inquirer/select': 4.4.2(@types/node@25.5.2) + '@inquirer/prompts@8.5.2(@types/node@25.5.2)': + dependencies: + '@inquirer/checkbox': 5.2.3(@types/node@25.5.2) + '@inquirer/confirm': 6.3.0(@types/node@25.5.2) + '@inquirer/editor': 5.3.1(@types/node@25.5.2) + '@inquirer/expand': 5.1.3(@types/node@25.5.2) + '@inquirer/input': 5.1.4(@types/node@25.5.2) + '@inquirer/number': 4.2.1(@types/node@25.5.2) + '@inquirer/password': 5.2.0(@types/node@25.5.2) + '@inquirer/rawlist': 5.3.3(@types/node@25.5.2) + '@inquirer/search': 4.3.1(@types/node@25.5.2) + '@inquirer/select': 5.2.3(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/rawlist@4.1.11(@types/node@25.5.2)': + '@inquirer/rawlist@5.3.3(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/search@3.2.2(@types/node@25.5.2)': + '@inquirer/search@4.3.1(@types/node@25.5.2)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.2) - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/figures': 2.0.8 + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/select@4.4.2(@types/node@25.5.2)': + '@inquirer/select@5.2.3(@types/node@25.5.2)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.2) - yoctocolors-cjs: 2.1.3 + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 12.0.1(@types/node@25.5.2) + '@inquirer/figures': 2.0.8 + '@inquirer/type': 4.1.0(@types/node@25.5.2) optionalDependencies: '@types/node': 25.5.2 - '@inquirer/type@3.0.10(@types/node@25.5.2)': + '@inquirer/type@4.1.0(@types/node@25.5.2)': optionalDependencies: '@types/node': 25.5.2 - '@isaacs/cliui@8.0.2': + '@jridgewell/gen-mapping@0.3.13': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@istanbuljs/load-nyc-config@1.1.0': + '@jridgewell/remapping@2.3.5': dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.2 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jest/console@30.3.0': - dependencies: - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - chalk: 4.1.2 - jest-message-util: 30.3.0 - jest-util: 30.3.0 - slash: 3.0.0 - - '@jest/core@30.3.0': - dependencies: - '@jest/console': 30.3.0 - '@jest/pattern': 30.0.1 - '@jest/reporters': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 4.4.0 - exit-x: 0.2.2 - graceful-fs: 4.2.11 - jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@25.5.2) - jest-haste-map: 30.3.0 - jest-message-util: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-resolve-dependencies: 30.3.0 - jest-runner: 30.3.0 - jest-runtime: 30.3.0 - jest-snapshot: 30.3.0 - jest-util: 30.3.0 - jest-validate: 30.3.0 - jest-watcher: 30.3.0 - pretty-format: 30.3.0 - slash: 3.0.0 - transitivePeerDependencies: - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node + '@jridgewell/resolve-uri@3.1.2': {} - '@jest/diff-sequences@30.3.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jest/environment@30.3.0': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@jest/fake-timers': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - jest-mock: 30.3.0 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@jest/expect-utils@30.3.0': + '@octokit/auth-token@6.0.0': {} + + '@octokit/core@7.0.6': dependencies: - '@jest/get-type': 30.1.0 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 - '@jest/expect@30.3.0': + '@octokit/endpoint@11.0.3': dependencies: - expect: 30.3.0 - jest-snapshot: 30.3.0 - transitivePeerDependencies: - - supports-color + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 - '@jest/fake-timers@30.3.0': + '@octokit/graphql@9.0.3': dependencies: - '@jest/types': 30.3.0 - '@sinonjs/fake-timers': 15.3.0 - '@types/node': 25.5.2 - jest-message-util: 30.3.0 - jest-mock: 30.3.0 - jest-util: 30.3.0 + '@octokit/request': 10.0.8 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 - '@jest/get-type@30.1.0': {} + '@octokit/openapi-types@27.0.0': {} - '@jest/globals@30.3.0': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@jest/environment': 30.3.0 - '@jest/expect': 30.3.0 - '@jest/types': 30.3.0 - jest-mock: 30.3.0 - transitivePeerDependencies: - - supports-color + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@jest/pattern@30.0.1': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: - '@types/node': 25.5.2 - jest-regex-util: 30.0.1 + '@octokit/core': 7.0.6 - '@jest/reporters@30.3.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.5.2 - chalk: 4.1.2 - collect-v8-coverage: 1.0.3 - exit-x: 0.2.2 - glob: 10.5.0 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.2.0 - jest-message-util: 30.3.0 - jest-util: 30.3.0 - jest-worker: 30.3.0 - slash: 3.0.0 - string-length: 4.0.2 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@30.0.5': - dependencies: - '@sinclair/typebox': 0.34.49 - - '@jest/snapshot-utils@30.3.0': - dependencies: - '@jest/types': 30.3.0 - chalk: 4.1.2 - graceful-fs: 4.2.11 - natural-compare: 1.4.0 - - '@jest/source-map@30.0.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@30.3.0': - dependencies: - '@jest/console': 30.3.0 - '@jest/types': 30.3.0 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.3 - - '@jest/test-sequencer@30.3.0': - dependencies: - '@jest/test-result': 30.3.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.3.0 - slash: 3.0.0 - - '@jest/transform@30.3.0': - dependencies: - '@babel/core': 7.29.0 - '@jest/types': 30.3.0 - '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 7.0.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.3.0 - jest-regex-util: 30.0.1 - jest-util: 30.3.0 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 5.0.1 - transitivePeerDependencies: - - supports-color - - '@jest/types@30.3.0': - dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 25.5.2 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': - dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@nodeutils/defaults-deep@1.1.0': - dependencies: - lodash: 4.18.1 - - '@octokit/auth-token@6.0.0': {} - - '@octokit/core@7.0.6': - dependencies: - '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - before-after-hook: 4.0.0 - universal-user-agent: 7.0.3 - - '@octokit/endpoint@11.0.3': - dependencies: - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/graphql@9.0.3': - dependencies: - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/openapi-types@27.0.0': {} - - '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 - - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - - '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: '@octokit/core': 7.0.6 '@octokit/types': 16.0.0 @@ -4433,80 +2796,70 @@ snapshots: dependencies: '@octokit/openapi-types': 27.0.0 - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.147.0': {} '@phun-ky/typeof@2.0.3': {} - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pkgr/core@0.2.9': {} - - '@release-it/conventional-changelog@10.0.6(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)(release-it@19.2.4(@types/node@25.5.2))': + '@release-it/conventional-changelog@12.0.0(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)(release-it@21.0.2(@types/node@25.5.2)(supports-color@8.1.1))': dependencies: - '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) concat-stream: 2.0.0 - conventional-changelog: 7.2.0(conventional-commits-filter@5.0.0) - conventional-changelog-angular: 8.3.1 - conventional-changelog-conventionalcommits: 9.3.1 - conventional-recommended-bump: 11.2.0 - release-it: 19.2.4(@types/node@25.5.2) - semver: 7.7.4 + conventional-changelog: 8.1.3 + conventional-changelog-angular: 9.4.0 + conventional-changelog-conventionalcommits: 10.4.0 + conventional-recommended-bump: 12.1.0 + release-it: 21.0.2(@types/node@25.5.2)(supports-color@8.1.1) + semver: 7.8.5 transitivePeerDependencies: - conventional-commits-filter - conventional-commits-parser - '@rolldown/binding-android-arm64@1.0.0-rc.12': + '@rolldown/binding-android-arm-eabi@1.2.6': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + '@rolldown/binding-android-arm64@1.2.6': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.12': + '@rolldown/binding-darwin-arm64@1.2.6': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + '@rolldown/binding-darwin-x64@1.2.6': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + '@rolldown/binding-freebsd-x64@1.2.6': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-gnu@1.2.6': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-musl@1.2.6': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-ppc64-gnu@1.2.6': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-s390x-gnu@1.2.6': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-x64-gnu@1.2.6': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + '@rolldown/binding-linux-x64-musl@1.2.6': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@rolldown/binding-openharmony-arm64@1.2.6': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-arm64-msvc@1.2.6': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-x64-msvc@1.2.6': optional: true - '@rolldown/pluginutils@1.0.0-rc.12': {} + '@rolldown/pluginutils@1.0.1': {} '@rollup/plugin-alias@5.1.1(rollup@4.60.1)': optionalDependencies: @@ -4630,54 +2983,21 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true - '@simple-libs/child-process-utils@1.0.2': + '@simple-libs/child-process-utils@2.0.0': dependencies: - '@simple-libs/stream-utils': 1.2.0 + '@simple-libs/stream-utils': 2.0.0 - '@simple-libs/hosted-git-info@1.0.2': {} + '@simple-libs/hosted-git-info@2.0.0': {} - '@simple-libs/stream-utils@1.2.0': {} - - '@sinclair/typebox@0.34.49': {} - - '@sinonjs/commons@3.0.1': + '@simple-libs/normalize-package-data@1.0.0': dependencies: - type-detect: 4.0.8 + '@simple-libs/hosted-git-info': 2.0.0 + semver: 7.8.5 - '@sinonjs/fake-timers@15.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 + '@simple-libs/stream-utils@2.0.0': {} '@standard-schema/spec@1.1.0': {} - '@tootallnate/quickjs-emscripten@0.23.0': {} - - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.29.0 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - - '@types/babel__traverse@7.28.0': - dependencies: - '@babel/types': 7.29.0 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -4689,28 +3009,12 @@ snapshots: '@types/estree@1.0.8': {} - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@30.0.0': - dependencies: - expect: 30.3.0 - pretty-format: 30.3.0 - '@types/json-schema@7.0.15': {} '@types/node@25.5.2': dependencies: undici-types: 7.18.2 - - '@types/normalize-package-data@2.4.4': {} + optional: true '@types/parse-path@7.1.0': dependencies: @@ -4718,204 +3022,135 @@ snapshots: '@types/resolve@1.20.2': {} - '@types/stack-utils@2.0.3': {} - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.35': - dependencies: - '@types/yargs-parser': 21.0.3 - - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/type-utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.0 - eslint: 10.2.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.68.0 + '@typescript-eslint/type-utils': 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.68.0 + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/parser@8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.0 - debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 + '@typescript-eslint/scope-manager': 8.68.0 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.68.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.0(typescript@6.0.2)': + '@typescript-eslint/project-service@8.68.0(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) - '@typescript-eslint/types': 8.58.0 - debug: 4.4.3 - typescript: 6.0.2 + '@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3) + '@typescript-eslint/types': 8.68.0 + debug: 4.4.3(supports-color@8.1.1) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.0': + '@typescript-eslint/scope-manager@8.68.0': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/visitor-keys': 8.68.0 - '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.68.0(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - debug: 4.4.3 - eslint: 10.2.0(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.0': {} + '@typescript-eslint/types@8.68.0': {} - '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.68.0(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.0(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/visitor-keys': 8.58.0 - debug: 4.4.3 + '@typescript-eslint/project-service': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.68.0(typescript@6.0.3) + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/visitor-keys': 8.68.0 + debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/utils@8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 8.68.0 + '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.0': + '@typescript-eslint/visitor-keys@8.68.0': dependencies: - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/types': 8.68.0 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.0': {} - - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true - - '@vitest/expect@4.1.2': + '@vitest/expect@4.1.11': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.2 + '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0) - '@vitest/pretty-format@4.1.2': + '@vitest/pretty-format@4.1.11': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.2': + '@vitest/runner@4.1.11': dependencies: - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.11 pathe: 2.0.3 - '@vitest/snapshot@4.1.2': + '@vitest/snapshot@4.1.11': dependencies: - '@vitest/pretty-format': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.2': {} + '@vitest/spy@4.1.11': {} - '@vitest/utils@4.1.2': + '@vitest/utils@4.1.11': dependencies: - '@vitest/pretty-format': 4.1.2 + '@vitest/pretty-format': 4.1.11 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -4925,7 +3160,7 @@ snapshots: acorn@8.16.0: {} - agent-base@7.1.4: {} + agent-base@9.0.0: {} ajv@6.14.0: dependencies: @@ -4934,36 +3169,9 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@7.3.0: - dependencies: - environment: 1.1.0 - - ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.3: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.2 - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - array-ify@1.0.0: {} + argue-cli@3.1.0: {} assertion-error@2.0.1: {} @@ -4984,79 +3192,16 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 - babel-jest@30.3.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@jest/transform': 30.3.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.3.0(@babel/core@7.29.0) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@7.0.1: - dependencies: - '@babel/helper-plugin-utils': 7.28.6 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 6.0.3 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@30.3.0: - dependencies: - '@types/babel__core': 7.20.5 - - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) - - babel-preset-jest@30.3.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - babel-plugin-jest-hoist: 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) - - balanced-match@1.0.2: {} - balanced-match@4.0.4: {} baseline-browser-mapping@2.10.14: {} - basic-ftp@5.2.0: {} + basic-ftp@5.3.1: {} before-after-hook@4.0.0: {} boolbase@1.0.0: {} - brace-expansion@1.1.13: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.3: - dependencies: - balanced-match: 1.0.2 - brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -5069,40 +3214,26 @@ snapshots: node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - buffer-from@1.1.2: {} bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 - c12@3.3.3: + c12@3.3.4: dependencies: chokidar: 5.0.0 confbox: 0.2.4 defu: 6.1.6 dotenv: 17.4.0 exsolve: 1.0.8 - giget: 2.0.0 + giget: 3.3.1 jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 2.1.0 pkg-types: 2.3.0 - rc9: 2.1.2 - - callsites@3.1.0: {} - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} + rc9: 3.0.1 caniuse-api@3.0.0: dependencies: @@ -5115,15 +3246,8 @@ snapshots: chai@6.2.2: {} - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.6.2: {} - char-regex@1.0.2: {} - chardet@2.1.1: {} chokidar@5.0.0: @@ -5136,54 +3260,18 @@ snapshots: dependencies: consola: 3.4.2 - citty@0.2.2: {} - - cjs-module-lexer@2.2.0: {} - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 cli-spinners@3.4.0: {} - cli-truncate@5.2.0: - dependencies: - slice-ansi: 8.0.0 - string-width: 8.2.0 - cli-width@4.1.0: {} - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - co@4.6.0: {} - - collect-v8-coverage@1.0.3: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - colorette@2.0.20: {} - commander@11.1.0: {} - commander@14.0.3: {} - commondir@1.0.1: {} - compare-func@2.0.0: - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - - concat-map@0.0.1: {} - concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 @@ -5197,52 +3285,50 @@ snapshots: consola@3.4.2: {} - conventional-changelog-angular@8.3.1: + conventional-changelog-angular@9.4.0: dependencies: - compare-func: 2.0.0 + '@conventional-changelog/template': 1.4.0 - conventional-changelog-conventionalcommits@9.3.1: + conventional-changelog-conventionalcommits@10.4.0: dependencies: - compare-func: 2.0.0 + '@conventional-changelog/template': 1.4.0 - conventional-changelog-preset-loader@5.0.0: {} + conventional-changelog-preset-loader@6.0.1: {} - conventional-changelog-writer@8.4.0: + conventional-changelog-writer@9.2.1: dependencies: - '@simple-libs/stream-utils': 1.2.0 - conventional-commits-filter: 5.0.0 - handlebars: 4.7.9 - meow: 13.2.0 + '@conventional-changelog/template': 1.4.0 + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.1.0 + conventional-commits-filter: 6.0.1 semver: 7.7.4 - conventional-changelog@7.2.0(conventional-commits-filter@5.0.0): + conventional-changelog@8.1.3: dependencies: - '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) - '@simple-libs/hosted-git-info': 1.0.2 - '@types/normalize-package-data': 2.4.4 - conventional-changelog-preset-loader: 5.0.0 - conventional-changelog-writer: 8.4.0 - conventional-commits-parser: 6.4.0 + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) + '@simple-libs/hosted-git-info': 2.0.0 + '@simple-libs/normalize-package-data': 1.0.0 + argue-cli: 3.1.0 + conventional-changelog-preset-loader: 6.0.1 + conventional-changelog-writer: 9.2.1 + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.1.2 fd-package-json: 2.0.0 - meow: 13.2.0 - normalize-package-data: 7.0.1 - transitivePeerDependencies: - - conventional-commits-filter - conventional-commits-filter@5.0.0: {} + conventional-commits-filter@6.0.1: {} - conventional-commits-parser@6.4.0: + conventional-commits-parser@7.1.2: dependencies: - '@simple-libs/stream-utils': 1.2.0 - meow: 13.2.0 + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.1.0 - conventional-recommended-bump@11.2.0: + conventional-recommended-bump@12.1.0: dependencies: - '@conventional-changelog/git-client': 2.6.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) - conventional-changelog-preset-loader: 5.0.0 - conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.4.0 - meow: 13.2.0 + '@conventional-changelog/git-client': 3.1.2(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2) + argue-cli: 3.1.0 + conventional-changelog-preset-loader: 6.0.1 + conventional-commits-filter: 6.0.1 + conventional-commits-parser: 7.1.2 convert-source-map@2.0.0: {} @@ -5326,13 +3412,13 @@ snapshots: dependencies: css-tree: 2.2.1 - data-uri-to-buffer@6.0.2: {} + data-uri-to-buffer@8.0.0: {} - debug@4.4.3: + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 - - dedent@1.7.2: {} + optionalDependencies: + supports-color: 8.1.1 deep-is@0.1.4: {} @@ -5349,18 +3435,19 @@ snapshots: defu@6.1.6: {} - degenerator@5.0.1: + defu@6.1.7: {} + + degenerator@7.0.1(quickjs-wasi@2.2.0): dependencies: ast-types: 0.13.4 escodegen: 2.1.0 esprima: 4.0.1 + quickjs-wasi: 2.2.0 destr@2.0.5: {} detect-libc@2.1.2: {} - detect-newline@3.1.0: {} - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -5379,32 +3466,12 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - dotenv@17.4.0: {} - eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.331: {} - emittery@0.13.1: {} - - emoji-regex@10.6.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - entities@4.5.0: {} - environment@1.1.0: {} - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - es-module-lexer@2.0.0: {} esbuild@0.25.12: @@ -5438,8 +3505,6 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} escodegen@2.1.0: @@ -5461,21 +3526,21 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0(jiti@2.6.1): + eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.4 - '@eslint/config-helpers': 0.5.4 - '@eslint/core': 1.2.0 - '@eslint/plugin-kit': 0.7.0 + '@eslint/config-array': 0.23.5(supports-color@8.1.1) + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 ajv: 6.14.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -5524,47 +3589,10 @@ snapshots: esutils@2.0.3: {} - eta@4.5.0: {} - - eventemitter3@5.0.4: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - - exit-x@0.2.2: {} + eta@4.6.0: {} expect-type@1.3.0: {} - expect@30.3.0: - dependencies: - '@jest/expect-utils': 30.3.0 - '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.3.0 - jest-message-util: 30.3.0 - jest-mock: 30.3.0 - jest-util: 30.3.0 - exsolve@1.0.8: {} fast-content-type-parse@3.0.0: {} @@ -5575,9 +3603,15 @@ snapshots: fast-levenshtein@2.0.6: {} - fb-watchman@2.0.2: + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: dependencies: - bser: 2.1.1 + fast-string-width: 3.0.2 fd-package-json@2.0.0: dependencies: @@ -5591,11 +3625,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -5614,48 +3643,24 @@ snapshots: flatted@3.4.2: {} - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fraction.js@5.3.4: {} - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} - get-package-type@0.1.0: {} - - get-stream@6.0.1: {} - - get-stream@8.0.1: {} - - get-uri@6.0.5: + get-uri@8.0.1(supports-color@8.1.1): dependencies: - basic-ftp: 5.2.0 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3 + basic-ftp: 5.3.1 + data-uri-to-buffer: 8.0.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - giget@2.0.0: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - defu: 6.1.6 - node-fetch-native: 1.6.7 - nypm: 0.6.5 - pathe: 2.0.3 + giget@3.3.1: {} git-up@8.1.1: dependencies: @@ -5670,38 +3675,10 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@17.4.0: {} - - graceful-fs@4.2.11: {} - - handlebars@4.7.9: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 + globals@17.11.0: {} - has-flag@4.0.0: {} + has-flag@4.0.0: + optional: true hasown@2.0.2: dependencies: @@ -5709,30 +3686,24 @@ snapshots: hookable@5.5.3: {} - hosted-git-info@8.1.0: + http-proxy-agent@9.1.0(supports-color@8.1.1): dependencies: - lru-cache: 10.4.3 - - html-escaper@2.0.2: {} - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 + agent-base: 9.0.0 + debug: 4.4.3(supports-color@8.1.1) + proxy-agent-negotiate: 1.1.0 transitivePeerDependencies: + - kerberos - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@9.1.0(supports-color@8.1.1): dependencies: - agent-base: 7.1.4 - debug: 4.4.3 + agent-base: 9.0.0 + debug: 4.4.3(supports-color@8.1.1) + proxy-agent-negotiate: 1.1.0 transitivePeerDependencies: + - kerberos - supports-color - human-signals@2.1.0: {} - - human-signals@5.0.0: {} - husky@9.1.7: {} iconv-lite@0.7.2: @@ -5743,553 +3714,142 @@ snapshots: ignore@7.0.5: {} - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} - inquirer@12.11.1(@types/node@25.5.2): - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.2) - '@inquirer/prompts': 7.10.1(@types/node@25.5.2) - '@inquirer/type': 3.0.10(@types/node@25.5.2) - mute-stream: 2.0.0 - run-async: 4.0.6 - rxjs: 7.8.2 - optionalDependencies: - '@types/node': 25.5.2 - ip-address@10.1.0: {} - is-arrayish@0.2.1: {} - is-core-module@2.16.1: dependencies: hasown: 2.0.2 is-docker@3.0.0: {} - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.5.0 - - is-generator-fn@2.1.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-interactive@2.0.0: {} - - is-module@1.0.0: {} - - is-obj@2.0.0: {} - - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.8 - - is-ssh@1.4.1: - dependencies: - protocols: 2.0.2 - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-unicode-supported@2.1.0: {} - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - - isexe@2.0.0: {} - - issue-parser@7.0.1: - dependencies: - lodash.capitalize: 4.2.1 - lodash.escaperegexp: 4.1.2 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.uniqby: 4.7.0 - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jest-changed-files@30.3.0: - dependencies: - execa: 5.1.1 - jest-util: 30.3.0 - p-limit: 3.1.0 - - jest-circus@30.3.0: - dependencies: - '@jest/environment': 30.3.0 - '@jest/expect': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.7.2 - is-generator-fn: 2.1.0 - jest-each: 30.3.0 - jest-matcher-utils: 30.3.0 - jest-message-util: 30.3.0 - jest-runtime: 30.3.0 - jest-snapshot: 30.3.0 - jest-util: 30.3.0 - p-limit: 3.1.0 - pretty-format: 30.3.0 - pure-rand: 7.0.1 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@30.3.0(@types/node@25.5.2): - dependencies: - '@jest/core': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/types': 30.3.0 - chalk: 4.1.2 - exit-x: 0.2.2 - import-local: 3.2.0 - jest-config: 30.3.0(@types/node@25.5.2) - jest-util: 30.3.0 - jest-validate: 30.3.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - - jest-config@30.3.0(@types/node@25.5.2): - dependencies: - '@babel/core': 7.29.0 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.3.0 - '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0) - chalk: 4.1.2 - ci-info: 4.4.0 - deepmerge: 4.3.1 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-circus: 30.3.0 - jest-docblock: 30.2.0 - jest-environment-node: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-runner: 30.3.0 - jest-util: 30.3.0 - jest-validate: 30.3.0 - parse-json: 5.2.0 - pretty-format: 30.3.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 25.5.2 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@30.3.0: - dependencies: - '@jest/diff-sequences': 30.3.0 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.3.0 - - jest-docblock@30.2.0: - dependencies: - detect-newline: 3.1.0 - - jest-each@30.3.0: - dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.3.0 - chalk: 4.1.2 - jest-util: 30.3.0 - pretty-format: 30.3.0 - - jest-environment-node@30.3.0: - dependencies: - '@jest/environment': 30.3.0 - '@jest/fake-timers': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - jest-mock: 30.3.0 - jest-util: 30.3.0 - jest-validate: 30.3.0 - - jest-haste-map@30.3.0: - dependencies: - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 30.0.1 - jest-util: 30.3.0 - jest-worker: 30.3.0 - picomatch: 4.0.4 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@30.3.0: - dependencies: - '@jest/get-type': 30.1.0 - pretty-format: 30.3.0 - - jest-matcher-utils@30.3.0: - dependencies: - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - jest-diff: 30.3.0 - pretty-format: 30.3.0 - - jest-message-util@30.3.0: - dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 30.3.0 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - picomatch: 4.0.4 - pretty-format: 30.3.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@30.3.0: - dependencies: - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - jest-util: 30.3.0 - - jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): - optionalDependencies: - jest-resolve: 30.3.0 - - jest-regex-util@30.0.1: {} + is-extglob@2.1.1: {} - jest-resolve-dependencies@30.3.0: + is-glob@4.0.3: dependencies: - jest-regex-util: 30.0.1 - jest-snapshot: 30.3.0 - transitivePeerDependencies: - - supports-color + is-extglob: 2.1.1 - jest-resolve@30.3.0: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 30.3.0 - jest-pnp-resolver: 1.2.3(jest-resolve@30.3.0) - jest-util: 30.3.0 - jest-validate: 30.3.0 - slash: 3.0.0 - unrs-resolver: 1.11.1 + is-in-ssh@1.0.0: {} - jest-runner@30.3.0: + is-inside-container@1.0.0: dependencies: - '@jest/console': 30.3.0 - '@jest/environment': 30.3.0 - '@jest/test-result': 30.3.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - chalk: 4.1.2 - emittery: 0.13.1 - exit-x: 0.2.2 - graceful-fs: 4.2.11 - jest-docblock: 30.2.0 - jest-environment-node: 30.3.0 - jest-haste-map: 30.3.0 - jest-leak-detector: 30.3.0 - jest-message-util: 30.3.0 - jest-resolve: 30.3.0 - jest-runtime: 30.3.0 - jest-util: 30.3.0 - jest-watcher: 30.3.0 - jest-worker: 30.3.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color + is-docker: 3.0.0 - jest-runtime@30.3.0: - dependencies: - '@jest/environment': 30.3.0 - '@jest/fake-timers': 30.3.0 - '@jest/globals': 30.3.0 - '@jest/source-map': 30.0.1 - '@jest/test-result': 30.3.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - chalk: 4.1.2 - cjs-module-lexer: 2.2.0 - collect-v8-coverage: 1.0.3 - glob: 10.5.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.3.0 - jest-message-util: 30.3.0 - jest-mock: 30.3.0 - jest-regex-util: 30.0.1 - jest-resolve: 30.3.0 - jest-snapshot: 30.3.0 - jest-util: 30.3.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color + is-interactive@2.0.0: {} - jest-snapshot@30.3.0: - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/types': 7.29.0 - '@jest/expect-utils': 30.3.0 - '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.3.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) - chalk: 4.1.2 - expect: 30.3.0 - graceful-fs: 4.2.11 - jest-diff: 30.3.0 - jest-matcher-utils: 30.3.0 - jest-message-util: 30.3.0 - jest-util: 30.3.0 - pretty-format: 30.3.0 - semver: 7.7.4 - synckit: 0.11.12 - transitivePeerDependencies: - - supports-color + is-module@1.0.0: {} - jest-util@30.3.0: + is-reference@1.2.1: dependencies: - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - chalk: 4.1.2 - ci-info: 4.4.0 - graceful-fs: 4.2.11 - picomatch: 4.0.4 + '@types/estree': 1.0.8 - jest-validate@30.3.0: + is-ssh@1.4.1: dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.3.0 - camelcase: 6.3.0 - chalk: 4.1.2 - leven: 3.1.0 - pretty-format: 30.3.0 + protocols: 2.0.2 - jest-watcher@30.3.0: - dependencies: - '@jest/test-result': 30.3.0 - '@jest/types': 30.3.0 - '@types/node': 25.5.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 30.3.0 - string-length: 4.0.2 + is-unicode-supported@2.1.0: {} - jest-worker@30.3.0: + is-wsl@3.1.1: dependencies: - '@types/node': 25.5.2 - '@ungap/structured-clone': 1.3.0 - jest-util: 30.3.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + is-inside-container: 1.0.0 + + isexe@2.0.0: {} - jest@30.3.0(@types/node@25.5.2): + issue-parser@7.0.2: dependencies: - '@jest/core': 30.3.0 - '@jest/types': 30.3.0 - import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@25.5.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 jiti@1.21.7: {} jiti@2.6.1: {} - js-tokens@4.0.0: {} - - js-yaml@3.14.2: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - jsesc@3.1.0: {} + js-tokens@4.0.0: + optional: true json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} json-with-bigint@3.5.8: {} - json5@2.2.3: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 knitwork@1.3.0: {} - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 lilconfig@3.1.3: {} - lines-and-columns@1.2.4: {} - - lint-staged@16.4.0: + lint-staged@17.4.1: dependencies: - commander: 14.0.3 - listr2: 9.0.5 - picomatch: 4.0.4 + picomatch: 4.0.7 string-argv: 0.3.2 - tinyexec: 1.0.4 - yaml: 2.8.3 - - listr2@9.0.5: - dependencies: - cli-truncate: 5.2.0 - colorette: 2.0.20 - eventemitter3: 5.0.4 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 + tinyexec: 1.3.0 + optionalDependencies: + yaml: 2.9.0 locate-path@6.0.0: dependencies: @@ -6311,27 +3871,11 @@ snapshots: lodash.uniqby@4.7.0: {} - lodash@4.18.1: {} - log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 yoctocolors: 2.1.2 - log-update@6.1.0: - dependencies: - ansi-escapes: 7.3.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - - lru-cache@10.4.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lru-cache@7.18.3: {} macos-release@3.4.0: {} @@ -6340,53 +3884,23 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-dir@4.0.0: - dependencies: - semver: 7.7.4 - - make-error@1.3.6: {} - - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - mdn-data@2.0.28: {} mdn-data@2.27.1: {} - meow@13.2.0: {} - - merge-stream@2.0.0: {} - mime-db@1.54.0: {} mime-types@3.0.2: dependencies: mime-db: 1.54.0 - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} - mimic-function@5.0.1: {} minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.13 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.0.3 - - minimist@1.2.8: {} - - minipass@7.1.3: {} - - mkdist@2.4.1(typescript@6.0.2): + mkdist@2.4.1(typescript@6.0.3): dependencies: autoprefixer: 10.4.27(postcss@8.5.8) citty: 0.1.6 @@ -6402,7 +3916,7 @@ snapshots: semver: 7.7.4 tinyglobby: 0.2.15 optionalDependencies: - typescript: 6.0.2 + typescript: 6.0.3 mlly@1.8.2: dependencies: @@ -6413,80 +3927,42 @@ snapshots: ms@2.1.3: {} - mute-stream@2.0.0: {} + mute-stream@3.0.0: {} nanoid@3.3.11: {} - napi-postinstall@0.3.4: {} + nanoid@3.3.18: {} natural-compare@1.4.0: {} - neo-async@2.6.2: {} - netmask@2.0.2: {} new-github-release-url@2.0.0: dependencies: type-fest: 2.19.0 - node-fetch-native@1.6.7: {} - - node-int64@0.4.0: {} - node-releases@2.0.37: {} - normalize-package-data@7.0.1: - dependencies: - hosted-git-info: 8.1.0 - semver: 7.7.4 - validate-npm-package-license: 3.0.4 - - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - nypm@0.6.5: - dependencies: - citty: 0.2.2 - pathe: 2.0.3 - tinyexec: 1.0.4 - obug@2.1.1: {} ohash@2.0.11: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - onetime@7.0.0: dependencies: mimic-function: 5.0.1 - open@10.2.0: + open@11.0.0: dependencies: default-browser: 5.5.0 define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 is-inside-container: 1.0.0 - wsl-utils: 0.1.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 optionator@0.9.4: dependencies: @@ -6497,7 +3973,7 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@9.0.0: + ora@9.4.1: dependencies: chalk: 5.6.2 cli-cursor: 5.0.0 @@ -6505,59 +3981,41 @@ snapshots: is-interactive: 2.0.0 is-unicode-supported: 2.1.0 log-symbols: 7.0.1 - stdin-discarder: 0.2.2 + stdin-discarder: 0.3.2 string-width: 8.2.0 - strip-ansi: 7.2.0 - os-name@6.1.0: + os-name@7.0.0: dependencies: macos-release: 3.4.0 - windows-release: 6.1.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 + windows-release: 7.1.1 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-try@2.2.0: {} - - pac-proxy-agent@7.2.0: + pac-proxy-agent@9.1.0(supports-color@8.1.1): dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 + agent-base: 9.0.0 + debug: 4.4.3(supports-color@8.1.1) + get-uri: 8.0.1(supports-color@8.1.1) + http-proxy-agent: 9.1.0(supports-color@8.1.1) + https-proxy-agent: 9.1.0(supports-color@8.1.1) + pac-resolver: 9.0.1(quickjs-wasi@2.2.0) + quickjs-wasi: 2.2.0 + socks-proxy-agent: 10.1.0(supports-color@8.1.1) transitivePeerDependencies: + - kerberos - supports-color - pac-resolver@7.0.1: + pac-resolver@9.0.1(quickjs-wasi@2.2.0): dependencies: - degenerator: 5.0.1 + degenerator: 7.0.1(quickjs-wasi@2.2.0) netmask: 2.0.2 - - package-json-from-dist@1.0.1: {} - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + quickjs-wasi: 2.2.0 parse-path@7.1.0: dependencies: @@ -6570,34 +4028,19 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - pathe@2.0.3: {} perfect-debounce@2.1.0: {} picocolors@1.1.1: {} - picomatch@2.3.2: {} - picomatch@4.0.4: {} - pirates@4.0.7: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 + picomatch@4.0.7: {} pkg-types@1.3.1: dependencies: @@ -6772,52 +4215,57 @@ snapshots: postcss-value-parser@4.2.0: {} + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.1.0: {} + + powershell-utils@0.2.0: {} + prelude-ls@1.2.1: {} - prettier@3.8.1: {} + prettier@3.9.6: {} pretty-bytes@7.1.0: {} - pretty-format@30.3.0: - dependencies: - '@jest/schemas': 30.0.5 - ansi-styles: 5.2.0 - react-is: 18.3.1 - protocols@2.0.2: {} - proxy-agent@6.5.0: + proxy-agent-negotiate@1.1.0: {} + + proxy-agent@8.0.2(supports-color@8.1.1): dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + agent-base: 9.0.0 + debug: 4.4.3(supports-color@8.1.1) + http-proxy-agent: 9.1.0(supports-color@8.1.1) + https-proxy-agent: 9.1.0(supports-color@8.1.1) lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 + pac-proxy-agent: 9.1.0(supports-color@8.1.1) + proxy-from-env: 2.1.0 + socks-proxy-agent: 10.1.0(supports-color@8.1.1) transitivePeerDependencies: + - kerberos - supports-color - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} punycode@2.3.1: {} - pure-rand@7.0.1: {} + quickjs-wasi@2.2.0: {} - rc9@2.1.2: + rc9@3.0.1: dependencies: defu: 6.1.6 destr: 2.0.5 - react-is@18.3.1: {} - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -6826,44 +4274,36 @@ snapshots: readdirp@5.0.0: {} - release-it@19.2.4(@types/node@25.5.2): + release-it@21.0.2(@types/node@25.5.2)(supports-color@8.1.1): dependencies: - '@nodeutils/defaults-deep': 1.1.0 + '@inquirer/prompts': 8.5.2(@types/node@25.5.2) '@octokit/rest': 22.0.1 '@phun-ky/typeof': 2.0.3 async-retry: 1.3.3 - c12: 3.3.3 + c12: 3.3.4 ci-info: 4.4.0 - eta: 4.5.0 + defu: 6.1.7 + eta: 4.6.0 git-url-parse: 16.1.0 - inquirer: 12.11.1(@types/node@25.5.2) - issue-parser: 7.0.1 + issue-parser: 7.0.2 lodash.merge: 4.6.2 mime-types: 3.0.2 new-github-release-url: 2.0.0 - open: 10.2.0 - ora: 9.0.0 - os-name: 6.1.0 - proxy-agent: 6.5.0 - semver: 7.7.3 - tinyglobby: 0.2.15 - undici: 8.0.2 + open: 11.0.0 + ora: 9.4.1 + os-name: 7.0.0 + proxy-agent: 8.0.2(supports-color@8.1.1) + semver: 7.8.5 + tinyglobby: 0.2.17 + undici: 7.29.0 url-join: 5.0.0 wildcard-match: 5.1.4 - yargs-parser: 21.1.1 transitivePeerDependencies: - '@types/node' + - kerberos - magicast - supports-color - require-directory@2.1.1: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-from@5.0.0: {} - resolve@1.22.11: dependencies: is-core-module: 2.16.1 @@ -6877,40 +4317,35 @@ snapshots: retry@0.13.1: {} - rfdc@1.4.1: {} - - rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + rolldown@1.2.6: dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.12 + '@oxc-project/types': 0.147.0 + '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-x64': 1.0.0-rc.12 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - rollup-plugin-dts@6.4.1(rollup@4.60.1)(typescript@6.0.2): + '@rolldown/binding-android-arm-eabi': 1.2.6 + '@rolldown/binding-android-arm64': 1.2.6 + '@rolldown/binding-darwin-arm64': 1.2.6 + '@rolldown/binding-darwin-x64': 1.2.6 + '@rolldown/binding-freebsd-x64': 1.2.6 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.6 + '@rolldown/binding-linux-arm64-gnu': 1.2.6 + '@rolldown/binding-linux-arm64-musl': 1.2.6 + '@rolldown/binding-linux-ppc64-gnu': 1.2.6 + '@rolldown/binding-linux-s390x-gnu': 1.2.6 + '@rolldown/binding-linux-x64-gnu': 1.2.6 + '@rolldown/binding-linux-x64-musl': 1.2.6 + '@rolldown/binding-openharmony-arm64': 1.2.6 + '@rolldown/binding-win32-arm64-msvc': 1.2.6 + '@rolldown/binding-win32-x64-msvc': 1.2.6 + + rollup-plugin-dts@6.4.1(rollup@4.60.1)(typescript@6.0.3): dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 convert-source-map: 2.0.0 magic-string: 0.30.21 rollup: 4.60.1 - typescript: 6.0.2 + typescript: 6.0.3 optionalDependencies: '@babel/code-frame': 7.29.0 @@ -6947,12 +4382,6 @@ snapshots: run-applescript@7.1.0: {} - run-async@4.0.6: {} - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} @@ -6961,12 +4390,10 @@ snapshots: scule@1.3.0: {} - semver@6.3.1: {} - - semver@7.7.3: {} - semver@7.7.4: {} + semver@7.8.5: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -6975,28 +4402,14 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - slash@3.0.0: {} - - slice-ansi@7.1.2: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - slice-ansi@8.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - smart-buffer@4.2.0: {} - socks-proxy-agent@8.0.5: + socks-proxy-agent@10.1.0(supports-color@8.1.1): dependencies: - agent-base: 7.1.4 - debug: 4.4.3 + agent-base: 9.0.0 + debug: 4.4.3(supports-color@8.1.1) socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -7008,64 +4421,17 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 - - spdx-license-ids@3.0.23: {} - - sprintf-js@1.0.3: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 + source-map@0.6.1: + optional: true stackback@0.0.2: {} std-env@4.0.0: {} - stdin-discarder@0.2.2: {} + stdin-discarder@0.3.2: {} string-argv@0.3.2: {} - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 - string-width@8.2.0: dependencies: get-east-asian-width: 1.5.0 @@ -7075,35 +4441,20 @@ snapshots: dependencies: safe-buffer: 5.2.1 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-json-comments@3.1.1: {} - stylehacks@7.0.8(postcss@8.5.8): dependencies: browserslist: 4.28.2 postcss: 8.5.8 postcss-selector-parser: 7.1.1 - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - supports-color@8.1.1: dependencies: has-flag: 4.0.0 + optional: true supports-preserve-symlinks-flag@1.0.0: {} @@ -7117,52 +4468,27 @@ snapshots: picocolors: 1.1.1 sax: 1.6.0 - synckit@0.11.12: - dependencies: - '@pkgr/core': 0.2.9 - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.5 - tinybench@2.9.0: {} tinyexec@1.0.4: {} + tinyexec@1.3.0: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinyrainbow@3.1.0: {} - - tmpl@1.0.5: {} - - ts-api-utils@2.5.0(typescript@6.0.2): + tinyglobby@0.2.17: dependencies: - typescript: 6.0.2 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyrainbow@3.1.0: {} - ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.2))(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.9 - jest: 30.3.0(@types/node@25.5.2) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.4 - type-fest: 4.41.0 - typescript: 6.0.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.29.0 - '@jest/transform': 30.3.0 - '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.29.0) - jest-util: 30.3.0 + typescript: 6.0.3 tslib@2.8.1: {} @@ -7170,35 +4496,26 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - - type-fest@0.21.3: {} - type-fest@2.19.0: {} - type-fest@4.41.0: {} - typedarray@0.0.6: {} - typescript-eslint@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): + typescript-eslint@8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 + '@typescript-eslint/eslint-plugin': 8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3))(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.68.0(supports-color@8.1.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@6.0.3) + eslint: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@6.0.2: {} + typescript@6.0.3: {} ufo@1.6.3: {} - uglify-js@3.19.3: - optional: true - - unbuild@3.6.1(typescript@6.0.2): + unbuild@3.6.1(typescript@6.0.3): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.60.1) '@rollup/plugin-commonjs': 28.0.9(rollup@4.60.1) @@ -7214,54 +4531,31 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.4.1(typescript@6.0.2) + mkdist: 2.4.1(typescript@6.0.3) mlly: 1.8.2 pathe: 2.0.3 pkg-types: 2.3.0 pretty-bytes: 7.1.0 rollup: 4.60.1 - rollup-plugin-dts: 6.4.1(rollup@4.60.1)(typescript@6.0.2) + rollup-plugin-dts: 6.4.1(rollup@4.60.1)(typescript@6.0.3) scule: 1.3.0 tinyglobby: 0.2.15 untyped: 2.0.0 optionalDependencies: - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - sass - vue - vue-sfc-transformer - vue-tsc - undici-types@7.18.2: {} + undici-types@7.18.2: + optional: true - undici@8.0.2: {} + undici@7.29.0: {} universal-user-agent@7.0.3: {} - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.4 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - untyped@2.0.0: dependencies: citty: 0.1.6 @@ -7284,42 +4578,28 @@ snapshots: util-deprecate@1.0.2: {} - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3): + vite@8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0): dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.8 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - tinyglobby: 0.2.15 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.26 + rolldown: 1.2.6 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.5.2 fsevents: 2.3.3 jiti: 2.6.1 - yaml: 2.8.3 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - vitest@4.1.2(@types/node@25.5.2)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + yaml: 2.9.0 + + vitest@4.1.11(@types/node@25.5.2)(vite@8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -7331,7 +4611,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.2.2(@types/node@25.5.2)(jiti@2.6.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.5.2 @@ -7340,10 +4620,6 @@ snapshots: walk-up-path@4.0.0: {} - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -7355,69 +4631,20 @@ snapshots: wildcard-match@5.1.4: {} - windows-release@6.1.0: + windows-release@7.1.1: dependencies: - execa: 8.0.1 + powershell-utils: 0.2.0 word-wrap@1.2.5: {} - wordwrap@1.0.0: {} - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.2.0 - - wrappy@1.0.2: {} - - write-file-atomic@5.0.1: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - - wsl-utils@0.1.0: + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 + powershell-utils: 0.1.0 - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yaml@2.8.3: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + yaml@2.9.0: + optional: true yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.3: {} - yoctocolors@2.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1976f3b..1b4f88b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,7 @@ +allowBuilds: + '@parcel/watcher': false + esbuild: false + unrs-resolver: false overrides: undici@<6.24.0: '>=6.24.0' undici@>=6.0.0 <6.24.0: '>=6.24.0' From ecb85893f81a2adf52a20db3733546c79ca03a8a Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 12:58:04 +0300 Subject: [PATCH 15/25] refactor(render)!: hoist a static stylesheet and drop classPrefix The stylesheet was a 115-line template literal rebuilt on every call, with `${prefix}` interpolated ~60 times for a `classPrefix` option no caller ever set. It is now a module constant with the prefix written out. The light, dark and prefers-color-scheme blocks declared the same eight custom properties three times over; CSS `light-dark()` states each once. Also drops a `.mf-position` rule that nothing ever emitted, and a `...options` spread that could overwrite a default with undefined. BREAKING CHANGE: `IHTMLRenderOptions.classPrefix` is gone; the class prefix is always `mf`. Co-Authored-By: Claude Opus 5 (1M context) --- src/render/html.ts | 136 +++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 84 deletions(-) diff --git a/src/render/html.ts b/src/render/html.ts index 35afc0f..c67fa6d 100644 --- a/src/render/html.ts +++ b/src/render/html.ts @@ -1,7 +1,6 @@ import { isBinaryOperator, SYMBOL, type IToken, TOKEN } from '../lexer/tokens'; export type IHTMLRenderOptions = { - classPrefix: string; colorScheme: 'none' | 'auto' | 'light' | 'dark'; includeDebugInfo: boolean; }; @@ -55,15 +54,12 @@ export function renderTokensAsHTML( options: Partial = {} ): IHTMLRenderResult { const config: IHTMLRenderOptions = { - classPrefix: options.classPrefix || 'mf', colorScheme: options.colorScheme || 'none', - includeDebugInfo: options.includeDebugInfo || false, - ...options + includeDebugInfo: options.includeDebugInfo || false }; const getTokenClass = (token: IToken) => { - const tokenClass = typeClasses[token.type] || 'unknown'; - return `${config.classPrefix}-token ${config.classPrefix}-${tokenClass}`; + return `mf-token mf-${typeClasses[token.type] || 'unknown'}`; }; const renderToken = (token: IToken, index: number) => { @@ -117,118 +113,90 @@ export function renderTokensAsHTML( const htmlTokens = tokens.map(renderToken).filter((token) => token !== ''); return { - css: generateHTMLStyles(config.classPrefix), - html: `
${htmlTokens.join('').replace(/
$/, '')}
` + css: STYLES, + html: `
${htmlTokens.join('').replace(/
$/, '')}
` }; } -const generateHTMLStyles = (prefix: string) => { - return ` -.${prefix}-expression.${prefix}-auto, -.${prefix}-expression.${prefix}-light { - --${prefix}-fg: #111827; - --${prefix}-bg: #f9fafb; - --${prefix}-border: #e5e7eb; - - --${prefix}-number: #000000; - --${prefix}-identifier: #333333; - --${prefix}-operator: #666666; - --${prefix}-assignment: #000000; - --${prefix}-paren: #888888; - --${prefix}-function: #222222; - --${prefix}-comma: #aaaaaa; -} - -.${prefix}-expression.${prefix}-dark { - --${prefix}-fg: #f3f4f6; - --${prefix}-bg: #1f2937; - --${prefix}-border: #374151; - - --${prefix}-number: #ffffff; - --${prefix}-identifier: #cccccc; - --${prefix}-operator: #999999; - --${prefix}-assignment: #ffffff; - --${prefix}-paren: #777777; - --${prefix}-function: #dddddd; - --${prefix}-comma: #555555; -} - -@media (prefers-color-scheme: dark) { - .${prefix}-expression.${prefix}-auto { - --${prefix}-fg: #f3f4f6; - --${prefix}-bg: #1f2937; - --${prefix}-border: #374151; - - --${prefix}-number: #ffffff; - --${prefix}-identifier: #cccccc; - --${prefix}-operator: #999999; - --${prefix}-assignment: #ffffff; - --${prefix}-paren: #777777; - --${prefix}-function: #dddddd; - --${prefix}-comma: #555555; - } +const STYLES = ` +/* colors only apply to an explicit scheme - \`none\` inherits the page */ +.mf-expression.mf-auto { + color-scheme: light dark; +} +.mf-expression.mf-light { + color-scheme: light; +} +.mf-expression.mf-dark { + color-scheme: dark; +} +.mf-expression.mf-auto, +.mf-expression.mf-light, +.mf-expression.mf-dark { + --mf-fg: light-dark(#111827, #f3f4f6); + --mf-bg: light-dark(#f9fafb, #1f2937); + --mf-border: light-dark(#e5e7eb, #374151); + + --mf-number: light-dark(#000000, #ffffff); + --mf-identifier: light-dark(#333333, #cccccc); + --mf-operator: light-dark(#666666, #999999); + --mf-assignment: light-dark(#000000, #ffffff); + --mf-paren: light-dark(#888888, #777777); + --mf-function: light-dark(#222222, #dddddd); + --mf-comma: light-dark(#aaaaaa, #555555); } -.${prefix}-expression { +.mf-expression { font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Courier New', monospace; font-size: 16px; line-height: 1.6; padding: 12px 16px; border-radius: 6px; - background: var(--${prefix}-bg, transparent); - border: 1px solid var(--${prefix}-border); - color: var(--${prefix}-fg, currentColor); + background: var(--mf-bg, transparent); + border: 1px solid var(--mf-border, transparent); + color: var(--mf-fg, currentColor); overflow: auto; } -.${prefix}-token { +.mf-token { margin: 0; transition: background-color 0.2s ease; } -.${prefix}-token:hover { - background-color: var(--${prefix}-border, transparent); +.mf-token:hover { + background-color: var(--mf-border, transparent); border-radius: 2px; cursor: default; } -.${prefix}-number { - color: var(--${prefix}-number, currentColor); +.mf-number { + color: var(--mf-number, currentColor); } -.${prefix}-identifier { - color: var(--${prefix}-identifier, currentColor); +.mf-identifier { + color: var(--mf-identifier, currentColor); font-style: italic; } -.${prefix}-operator { - color: var(--${prefix}-operator, currentColor); +.mf-operator { + color: var(--mf-operator, currentColor); font-weight: semibold; } -.${prefix}-assignment { - color: var(--${prefix}-assignment, currentColor); +.mf-assignment { + color: var(--mf-assignment, currentColor); font-weight: semibold; } -.${prefix}-paren { - color: var(--${prefix}-paren, currentColor); +.mf-paren { + color: var(--mf-paren, currentColor); font-weight: semibold; } -.${prefix}-function { - color: var(--${prefix}-function, currentColor); +.mf-function { + color: var(--mf-function, currentColor); font-weight: medium; } -.${prefix}-comma { - color: var(--${prefix}-comma, currentColor); +.mf-comma { + color: var(--mf-comma, currentColor); } -.${prefix}-position { - font-size: 0.7em; - color: var(--${prefix}-fg, currentColor); - margin-left: 4px; - vertical-align: super; -} - -sup.${prefix}-token { +sup.mf-token { font-size: 0.8em; vertical-align: super; } - `; -}; +`; From 40e63e0920d58970f39b9fa9cfabf5a77f66de2d Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 12:58:25 +0300 Subject: [PATCH 16/25] refactor(render): share group collection between sqrt and abs Both branches ran the same 18-line paren-matching loop, differing only in the delimiters they wrapped the result in. Extract `collectGroup` and drive the two cases from a table. Adds the regression test that path never had - output is byte-identical before and after, including its existing quirks on nested calls. Co-Authored-By: Claude Opus 5 (1M context) --- src/render/latex.ts | 80 ++++++++++++++++++++------------------------ tests/render.test.ts | 8 +++++ 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/render/latex.ts b/src/render/latex.ts index f441b7b..57e7fe1 100644 --- a/src/render/latex.ts +++ b/src/render/latex.ts @@ -41,6 +41,33 @@ function formatTokenValue( return token.value; } +// functions written as a delimiter pair rather than a name and parentheses +const delimiters: Record = { + sqrt: ['\\sqrt{', '}'], + abs: ['\\left|', '\\right|'] +}; + +// read up to the paren that closes the one already consumed +function collectGroup( + tokens: IToken[], + start: number, + mode: ILaTeXRenderOptions['mode'] +): { content: string; end: number } { + const content = []; + let depth = 1; + let i = start; + + while (i < tokens.length && depth > 0) { + if (tokens[i].type === TOKEN.LPAREN) depth++; + if (tokens[i].type === TOKEN.RPAREN) depth--; + + if (depth > 0) content.push(formatTokenValue(tokens[i], mode)); + i++; + } + + return { content: content.join(''), end: i }; +} + function handleSpecialCases( tokens: IToken[], mode: ILaTeXRenderOptions['mode'] @@ -58,57 +85,24 @@ function handleSpecialCases( break; } - // Handle function calls with parentheses + // Handle function calls that are written as a delimiter pair if ( token.type === TOKEN.FUNCTION && nextToken && - nextToken.type === TOKEN.LPAREN + nextToken.type === TOKEN.LPAREN && + token.value in delimiters ) { - if (token.value === 'sqrt') { - // Handle square root specially - result.push('\\sqrt{'); - i += 2; // Skip function and opening paren - - // Find matching closing paren and collect arguments - let parenCount = 1; - const sqrtContent = []; - - while (i < tokens.length && parenCount > 0) { - if (tokens[i].type === TOKEN.LPAREN) parenCount++; - if (tokens[i].type === TOKEN.RPAREN) parenCount--; - - if (parenCount > 0) { - sqrtContent.push(formatTokenValue(tokens[i], mode)); - } - i++; - } - - result.push(sqrtContent.join('') + '}'); - continue; - } - - if (token.value === 'abs') { - // Handle absolute value specially - result.push('\\left|'); - i += 2; // Skip function and opening paren + const [open, close] = delimiters[token.value]; - // Find matching closing paren - let parenCount = 1; - const absContent = []; + // skip the function and its opening paren + i += 2; - while (i < tokens.length && parenCount > 0) { - if (tokens[i].type === TOKEN.LPAREN) parenCount++; - if (tokens[i].type === TOKEN.RPAREN) parenCount--; + const group = collectGroup(tokens, i, mode); - if (parenCount > 0) { - absContent.push(formatTokenValue(tokens[i], mode)); - } - i++; - } + result.push(open + group.content + close); + i = group.end; - result.push(absContent.join('') + '\\right|'); - continue; - } + continue; } // Handle fractions (division) diff --git a/tests/render.test.ts b/tests/render.test.ts index d417604..aa92710 100644 --- a/tests/render.test.ts +++ b/tests/render.test.ts @@ -10,6 +10,14 @@ beforeEach(() => { }); describe('latex output', () => { + test('delimiter-pair functions', () => { + expect(ctx.renderAsLaTeX('sqrt(25)')).toContain('\\sqrt{25}'); + expect(ctx.renderAsLaTeX('abs(-10)')).toContain('\\left|-10\\right|'); + expect(ctx.renderAsLaTeX('sqrt(x^2 + y^2)')).toContain( + '\\sqrt{x^2+y^2}' + ); + }); + test('mode of output', () => { expect(ctx.renderAsLaTeX(expr, { mode: 'inline' })).toEqual( '$1+3 \\cdot \\text{sin}\\left(30\\right) \\\\ $' From 3c3e3ffc4c69eb24c6b41d9daf13a7d6b3e345e6 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 12:59:09 +0300 Subject: [PATCH 17/25] refactor(lexer): track paren depth with a counter `createParenStack` was a factory over a `boolean[]` whose every element was literally `true` - only the depth was ever read, through `!!values.at(-1)`. A single counter says the same thing. Also inlines `matchType`, a generic wrapper around `Array.includes` with two callers. Co-Authored-By: Claude Opus 5 (1M context) --- src/lexer/index.ts | 45 +++++++++++---------------------------------- 1 file changed, 11 insertions(+), 34 deletions(-) diff --git a/src/lexer/index.ts b/src/lexer/index.ts index d805ec2..b101c45 100644 --- a/src/lexer/index.ts +++ b/src/lexer/index.ts @@ -11,21 +11,6 @@ import { SYMBOL } from './tokens'; -function createParenStack() { - const values: boolean[] = []; - return { - get active() { - return !!values.at(-1); - }, - push() { - values.push(true); - }, - pop() { - return values.pop(); - } - }; -} - /** * Break down an expression into a list of identified tokens */ @@ -34,7 +19,7 @@ export function tokenize(ctx: IContext, code: string): IToken[] { let line = 1; let column = 1; let char: string; - const parenStack = createParenStack(); + let depth = 0; const tokens: IToken[] = []; // remove all comments @@ -137,10 +122,6 @@ export function tokenize(ctx: IContext, code: string): IToken[] { return str; } - function matchType(type: T, ...others: T[]) { - return others.includes(type); - } - function expandImplicitMultiplication() { if (position >= code.length) return; @@ -154,23 +135,19 @@ export function tokenize(ctx: IContext, code: string): IToken[] { // )sin // )( prev.type === TOKEN.RPAREN && - matchType( - curr.type, + [ TOKEN.IDENTIFIER, TOKEN.FUNCTION, TOKEN.NUMBER, TOKEN.LPAREN - ), + ].includes(curr.type), // 2sin // 2x // 2( prev.type === TOKEN.NUMBER && - matchType( - curr.type, - TOKEN.LPAREN, - TOKEN.IDENTIFIER, - TOKEN.FUNCTION + [TOKEN.LPAREN, TOKEN.IDENTIFIER, TOKEN.FUNCTION].includes( + curr.type ), // x( @@ -198,19 +175,19 @@ export function tokenize(ctx: IContext, code: string): IToken[] { } advance(); } else if (char === SYMBOL.LPAREN) { - parenStack.push(); + depth++; addToken(TOKEN.LPAREN, char); advance(); - } else if (char === SYMBOL.RPAREN && parenStack.active) { - parenStack.pop(); + } else if (char === SYMBOL.RPAREN && depth > 0) { + depth--; addToken(TOKEN.RPAREN, char); advance(); - } else if (char === SYMBOL.COMMA && parenStack.active) { + } else if (char === SYMBOL.COMMA && depth > 0) { addToken(TOKEN.COMMA, char); advance(); } else if ( char === SYMBOL.EQUAL && - !parenStack.active && + depth === 0 && !!tokens.length && tokens.at(-1)?.type === TOKEN.IDENTIFIER ) { @@ -240,7 +217,7 @@ export function tokenize(ctx: IContext, code: string): IToken[] { } // in case of missing right parenthesis - if (parenStack.active) { + if (depth > 0) { throw createError( ERRORS.LEXICAL, `unexpected token at ${line}:${column}`, From 5d0be0a7ee266cfd9d532a0bd1da1bf480dc14de Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 12:59:21 +0300 Subject: [PATCH 18/25] refactor(context): merge preferences with Object.assign Eight lines and two `as Record` casts to copy fields onto an object. `Object.assign` is the same thing, typed. Co-Authored-By: Claude Opus 5 (1M context) --- src/context.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/context.ts b/src/context.ts index e5d81a1..d8fea75 100644 --- a/src/context.ts +++ b/src/context.ts @@ -65,14 +65,7 @@ export function createContext( ]) }; - if (options?.preferences) { - for (const k in ctx.preferences) { - const v = (options.preferences as Record)[ - k - ]; - if (v) (ctx.preferences as Record)[k] = v; - } - } + Object.assign(ctx.preferences, options.preferences); if (options?.constants) { merge(ctx.constants, options.constants); From 1675ed90607e75b04cda2545e63ba0b49041a49e Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:00:00 +0300 Subject: [PATCH 19/25] refactor(evaluator): drop redundant reducible guards `isReducible(x) ? reduceOnce(ctx, x) : x` - `reduceOnce` already returns a value node untouched through its default case, so the guard only restates what the call does. Co-Authored-By: Claude Opus 5 (1M context) --- src/evaluator/index.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/evaluator/index.ts b/src/evaluator/index.ts index 7d74c4c..d1b7ce7 100644 --- a/src/evaluator/index.ts +++ b/src/evaluator/index.ts @@ -176,8 +176,8 @@ function reduceOnce(ctx: IContext, node: INode): INode { return { ...node, - left: isReducible(left) ? reduceOnce(ctx, left) : left, - right: isReducible(right) ? reduceOnce(ctx, right) : right + left: reduceOnce(ctx, left), + right: reduceOnce(ctx, right) }; } @@ -191,9 +191,7 @@ function reduceOnce(ctx: IContext, node: INode): INode { return { ...node, - arguments: args.map((arg) => - isReducible(arg) ? reduceOnce(ctx, arg) : arg - ) + arguments: args.map((arg) => reduceOnce(ctx, arg)) }; } From e79c6286aca919ee22ca463825d59cad0d588331 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:00:57 +0300 Subject: [PATCH 20/25] refactor(safe)!: replace six wrappers with one `safe` `src/safe.ts` held six exported functions that each did nothing but `safeExecutor(() => fn(...args))`. Every new throwing API had to grow a seventh, an eighth, and so on, for no behaviour. Export the executor itself as `safe`. One name covers every current and future API: safe(() => ctx.solve('2+')) // { data: undefined, error } BREAKING CHANGE: `safeTokenize`, `safeParse`, `safeEvaluate`, `safeExplain`, `safeSolve` and `safeSolveBatch` are removed. Wrap the call in `safe(...)` instead. `ISafeResult` is unchanged and now comes from the root export. Co-Authored-By: Claude Opus 5 (1M context) --- src/error/index.ts | 5 ++- src/index.ts | 10 +----- src/safe.ts | 51 ----------------------------- tests/safe.test.ts | 81 ++++++++++++++-------------------------------- 4 files changed, 29 insertions(+), 118 deletions(-) delete mode 100644 src/safe.ts diff --git a/src/error/index.ts b/src/error/index.ts index 24e860c..a9d3569 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -42,7 +42,10 @@ export type ISafeResult = error: IError; }; -export function safeExecutor(fn: () => T): ISafeResult { +/** + * Run any throwing mathflow API and get `{ data, error }` back instead + */ +export function safe(fn: () => T): ISafeResult { try { const data = fn(); return { data, error: undefined }; diff --git a/src/index.ts b/src/index.ts index 58c41f5..aa7411e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,12 +15,4 @@ export { type IHTMLRenderResult } from './render/html'; export { renderTokensAsLaTeX, type ILaTeXRenderOptions } from './render/latex'; -export { - safeEvaluate, - safeExplain, - safeParse, - safeSolve, - safeSolveBatch, - safeTokenize, - type ISafeResult -} from './safe'; +export { safe, type ISafeResult } from './error'; diff --git a/src/safe.ts b/src/safe.ts deleted file mode 100644 index dbda4f4..0000000 --- a/src/safe.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { type IContext } from './context'; -import { safeExecutor } from './error'; -import { evaluate, explain } from './evaluator'; -import { tokenize } from './lexer'; -import { type IToken } from './lexer/tokens'; -import { type INode, parse } from './parser'; -import { solve, solveBatch } from './solve'; - -export { type ISafeResult } from './error'; - -/** - * Safely tokenize without throwing an error - */ -export function safeTokenize(ctx: IContext, code: string) { - return safeExecutor(() => tokenize(ctx, code)); -} - -/** - * Safely parse without throwing an error - */ -export function safeParse(tokens: IToken[]) { - return safeExecutor(() => parse(tokens)); -} - -/** - * Safely evaluate without throwing an error - */ -export function safeEvaluate(ctx: IContext, node: INode) { - return safeExecutor(() => evaluate(ctx, node)); -} - -/** - * Safely evaluate with a step-by-step solution, without throwing an error - */ -export function safeExplain(ctx: IContext, node: INode) { - return safeExecutor(() => explain(ctx, node)); -} - -/** - * Safely solve without throwing an error - */ -export function safeSolve(ctx: IContext, code: string) { - return safeExecutor(() => solve(ctx, code)); -} - -/** - * Safely solve a batch without throwing an error - */ -export function safeSolveBatch(ctx: IContext, code: string) { - return safeExecutor(() => solveBatch(ctx, code)); -} diff --git a/tests/safe.test.ts b/tests/safe.test.ts index ef7acf7..fec81ec 100644 --- a/tests/safe.test.ts +++ b/tests/safe.test.ts @@ -1,6 +1,10 @@ import { describe, test, beforeEach, expect } from 'vitest'; import { createContext, IContext } from '../src/context'; -import { safeEvaluate, safeParse, safeTokenize, safeSolve } from '../src/safe'; +import { safe } from '../src/error'; +import { evaluate } from '../src/evaluator'; +import { tokenize } from '../src/lexer'; +import { parse } from '../src/parser'; +import { solve } from '../src/solve'; let ctx: IContext; @@ -14,78 +18,41 @@ beforeEach(() => { }); }); -describe('safe tokenization', () => { - test('invoking safeTokenize does not throw errors', () => { - safeTokenize(ctx, '2+x*'); +describe('safe', () => { + test('does not throw on invalid input', () => { + expect(() => safe(() => tokenize(ctx, 'sin(45'))).not.toThrow(); + expect(() => safe(() => solve(ctx, '2+'))).not.toThrow(); }); - test('tokenizing an invalid expression', () => { - const res = safeTokenize(ctx, 'sin(45'); + test('reports a lexical error', () => { + const res = safe(() => tokenize(ctx, 'sin(45')); expect(res).toHaveProperty('data', undefined); + expect(res.error?.type).toBe('LexicalError'); }); - test('tokenizing a valid expression', () => { - const res = safeTokenize(ctx, '2+x'); - expect(res).toHaveProperty('error', undefined); - }); -}); - -describe('safe parsing', () => { - test('invoking safeParse does not throw errors', () => { - const tokens = safeTokenize(ctx, '2+sin(45)*5x').data!; - safeParse(tokens); - }); - - test('parsing corrupted token stream', () => { - const tokens = safeTokenize(ctx, '2+sin(45)*5x').data!; + test('reports a syntax error', () => { + const tokens = safe(() => tokenize(ctx, '2+sin(45)*5x')).data!; tokens.pop(); tokens.pop(); tokens.pop(); - const res = safeParse(tokens); - expect(res).toHaveProperty('data', undefined); - }); - - test('parsing a valid token stream', () => { - const tokens = safeTokenize(ctx, '2+sin(45)*5x').data!; - const res = safeParse(tokens); - expect(res).toHaveProperty('error', undefined); - }); -}); -describe('safe evaluation', () => { - test('invoking safeEvaluate does not throw errors', () => { - const tokens = safeTokenize(ctx, '2+sin(45)*5x+y+z').data!; - const tree = safeParse(tokens).data!; - safeEvaluate(ctx, tree.body[0]); - }); - - test('evaluation with errors', () => { - const tokens = safeTokenize(ctx, 'y = 2').data!; - const tree = safeParse(tokens).data!; - const res = safeEvaluate(ctx, tree.body[0]); + const res = safe(() => parse(tokens)); expect(res).toHaveProperty('data', undefined); + expect(res.error?.type).toBe('SyntaxError'); }); - test('evaluation without errors', () => { - const tokens = safeTokenize(ctx, '2+sin(45)*5x').data!; - const tree = safeParse(tokens).data!; - const res = safeEvaluate(ctx, tree.body[0]); - expect(res).toHaveProperty('error', undefined); - }); -}); - -describe('safe solve', () => { - test('invoking safeSolve does not throw errors', () => { - safeSolve(ctx, '2+'); - }); + test('reports a runtime error', () => { + const tree = safe(() => parse(tokenize(ctx, 'y = 2'))).data!; + const res = safe(() => evaluate(ctx, tree.body[0])); - test('evaluation with errors', () => { - const res = safeSolve(ctx, '2+'); expect(res).toHaveProperty('data', undefined); + expect(res.error?.type).toBe('RuntimeError'); }); - test('evaluation without errors', () => { - const res = safeSolve(ctx, '2+3'); + test('passes the value through when nothing throws', () => { + const res = safe(() => solve(ctx, '2+3')); + expect(res).toHaveProperty('error', undefined); + expect(res.data).toMatchObject({ value: 5 }); }); }); From c253d16f6df6843d8fbedbd119b8dec42da06d68 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:01:06 +0300 Subject: [PATCH 21/25] refactor(functions)!: drop the alias duplicates `fix` was `Math.trunc` a second time and `sigFigs` was `precision` a second time. TODO.md already stated the rule for `rand`/`randi` and `binomialCoefficient` - one name per behaviour - so apply it here too rather than carry two entries that do the same thing. BREAKING CHANGE: `fix(x)` and `sigFigs(x, n)` are removed. Use `trunc(x)` and `precision(x, n)`. Co-Authored-By: Claude Opus 5 (1M context) --- TODO.md | 334 ++++++++++++++++----------------------- src/functions/numbers.ts | 11 +- tests/functions.test.ts | 2 - 3 files changed, 136 insertions(+), 211 deletions(-) diff --git a/TODO.md b/TODO.md index 3b2614f..f5b3d38 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,19 @@ # MathFlow | TODO -A list of features to add to mathflow - based on numpy, mathjs and more. +A list of features for mathflow - based on numpy, mathjs and more. -### **1. Numbers and Big Numbers** +## Scope + +Every mathflow value is a plain number. A function is in scope when it takes +numbers and returns a single number; anything list-shaped is exposed as a +**variadic** builtin, so a data set is written `mean(1, 2, 3)` rather than +`mean([1, 2, 3])`. + +Predicates return `1` or `0`, since there is no boolean type. + +See [Not planned](#not-planned) for what this rules out, and why. + +### **1. Numbers** - [x] `add(a, b, ...)`: Adds all numbers. - [x] `sub(a, b)`: Subtracts the second number from the first. @@ -17,207 +28,128 @@ A list of features to add to mathflow - based on numpy, mathjs and more. - [x] `pow(x, y)`: Raises `x` to the power of `y`. - [x] `cbrt(x)`: Computes the cube root of a number. - [x] `root(x, n)`: Computes the n-th root of a number. -- [x] `trunc(x)`: Removes the fractional part of a number, leaving the integer part. -- [ ] `round(x, n?)`: Rounds a number to the nearest integer or to `n` decimal places. -- [ ] `gcd(a, b, ...)`: Calculates the greatest common divisor of all numbers. -- [ ] `lcm(a, b, ...)`: Computes the least common multiple of all numbers. -- [ ] `rand(min?, max?)`: Generates a random number within a specified range. -- [ ] `randi(min, max)`: Generates a random integer between the specified min and max values. -- [ ] `complex(re, im)`: Creates a complex number with real and imaginary parts. -- [ ] `bignumber(x)`: Creates a big number with arbitrary precision. -- [ ] `fraction(x)`: Creates a fraction from a number or a string. -- [ ] `clamp(x, min, max)`: Clamps a value between a minimum and maximum value. -- [ ] `modExp(base, exponent, modulus)`: Computes the modular exponentiation of a number. -- [ ] `fix(x)`: Rounds towards zero, removing the fractional part. -- [ ] `precision(x, n)`: Adjusts a number to `n` significant digits. -- [ ] `sigFigs(x, n)`: Rounds a number to `n` significant figures. -- [ ] `roundToNearest(x, step)`: Rounds `x` to the nearest multiple of `step`. - -### **2. Matrices and Arrays** - -- [ ] `matrix(data)`: Creates a matrix from an array or other data format. -- [ ] `identity(n)`: Creates an identity matrix of size `n`. -- [ ] `transpose(matrix)`: Returns the transpose of a matrix. -- [ ] `det(matrix)`: Calculates the determinant of a matrix. -- [ ] `inv(matrix)`: Computes the inverse of a matrix. -- [ ] `concat(a, b, dim?)`: Concatenates two arrays or matrices along the specified dimension. -- [ ] `size(matrix)`: Returns the size (dimensions) of a matrix. -- [ ] `reshape(matrix, sizes)`: Reshapes a matrix to the specified sizes. -- [ ] `flatten(matrix)`: Flattens a multi-dimensional matrix into a single dimension. -- [ ] `dot(a, b)`: Computes the dot product of two vectors or matrices. -- [ ] `cross(a, b)`: Calculates the cross product of two 3D vectors. -- [ ] `subset(matrix, index, replacement?)`: Retrieves or sets a subset of a matrix. -- [ ] `diag(matrix, k?)`: Extracts or creates a diagonal matrix. -- [ ] `norm(matrix, p?)`: Computes the norm of a matrix or vector. -- [ ] `trace(matrix)`: Computes the trace (sum of diagonal elements) of a matrix. -- [ ] `zeros(m, n)`: Creates a matrix filled with zeros of specified dimensions. -- [ ] `ones(m, n)`: Creates a matrix filled with ones of specified dimensions. -- [ ] `range(start, end, step?)`: Generates an array of numbers from `start` to `end` with a specified step. -- [ ] `sort(matrix, compare?)`: Sorts the elements of a matrix according to a compare function. -- [ ] `magnitude(vector)`: Computes the magnitude (length) of a vector. -- [ ] `normalize(vector)`: Normalizes a vector to a unit length. - -### **3. Algebra** - -- [ ] `simplify(expr, rules?)`: Simplifies an algebraic expression using optional rules. -- [ ] `solve(equation, variable?)`: Solves an equation for a specified variable. -- [ ] `expand(expr)`: Expands an algebraic expression. -- [ ] `evaluate(expr, scope?)`: Evaluates an expression given optional variable values. -- [ ] `derivative(expr, variable)`: Computes the derivative of an expression with respect to a variable. -- [ ] `parse(expr)`: Parses a string into an expression tree. -- [ ] `rationalize(expr, scope?)`: Converts an expression into a rational fraction form. -- [ ] `binomialCoefficient(n, k)`: Computes the binomial coefficient, representing combinations of `n` items taken `k` at a time. - -### **4. Statistics** - -- [ ] `mean(arr)`: Computes the mean (average) of an array of numbers. -- [ ] `median(arr)`: Finds the median value in an array of numbers. -- [ ] `mode(arr)`: Identifies the mode (most frequent value) in an array. -- [ ] `variance(arr, normalization?)`: Calculates the variance of a data set. -- [ ] `std(arr, normalization?)`: Computes the standard deviation of a data set. -- [ ] `sum(arr)`: Computes the sum of all elements in an array. -- [ ] `prod(arr)`: Calculates the product of all elements in an array. -- [ ] `min(arr)`: Finds the minimum value in an array. -- [ ] `max(arr)`: Finds the maximum value in an array. -- [ ] `quantileSeq(arr, prob, sorted?)`: Computes the specified quantile of a sorted array. -- [ ] `mad(arr)`: Computes the mean absolute deviation of an array. -- [ ] `entropy(arr)`: Calculates the entropy of a data set. -- [ ] `covariance(arr1, arr2)`: Computes the covariance between two data sets. -- [ ] `corr(arr1, arr2)`: Calculates the correlation coefficient between two data sets. -- [ ] `weightedMean(values, weights)`: Computes the weighted mean of values given their weights. -- [ ] `geometricMean(values)`: Calculates the geometric mean of a set of values. -- [ ] `harmonicMean(values)`: Computes the harmonic mean of a set of values. -- [ ] `skewness(arr)`: Measures the skewness of a data set, indicating asymmetry. -- [ ] `kurtosis(arr)`: Measures the kurtosis of a data set, indicating the tails' heaviness. - -### **5. Probability and Combinatorics** - -- [ ] `combinations(n, k)`: Calculates the number of ways to choose `k` items from `n`. -- [ ] `permutations(n, k)`: Computes the number of ways to arrange `k` items out of `n`. -- [ ] `random(min?, max?)`: Generates a random number within a range. -- [ ] `randomInt(min, max)`: Generates a random integer between specified bounds. -- [ ] `pickRandom(arr)`: Randomly selects an element from an array. -- [ ] `shuffle(arr)`: Randomly shuffles the elements of an array. -- [ ] `factorial(n)`: Computes the factorial of a number. -- [ ] `stirlingApproximation(n)`: Approximates the factorial of `n` using Stirling's formula. -- [ ] `isPrime(n)`: Checks if a number is a prime number. -- [ ] `primeFactors(n)`: Returns the prime factors of a number. -- [ ] `fibonacci(n)`: Calculates the n-th Fibonacci number. -- [ ] `birthdayProblem(p, n)`: Computes the probability of a shared birthday in a group of `n`. - -### **6. Trigonometry** +- [x] `trunc(x)`: Removes the fractional part of a number. +- [x] `round(x, n?)`: Rounds to the nearest integer or to `n` decimal places. +- [x] `roundToNearest(x, step)`: Rounds `x` to the nearest multiple of `step`. +- [x] `precision(x, n)`: Adjusts a number to `n` significant digits. +- [x] `clamp(x, min, max)`: Clamps a value between a minimum and maximum. +- [x] `gcd(a, b, ...)`: Greatest common divisor of all numbers. +- [x] `lcm(a, b, ...)`: Least common multiple of all numbers. +- [x] `modExp(base, exponent, modulus)`: Modular exponentiation. +- [x] `lerp(a, b, t)`: Linear interpolation between `a` and `b`. +- [x] `hermite(p0, m0, p1, m1, t)`: Cubic Hermite interpolation. + +### **2. Statistics** + +All variadic - `mean(1, 2, 3)`, not `mean([1, 2, 3])`. + +- [x] `sum(...x)`: Sum of all values. +- [x] `prod(...x)`: Product of all values. +- [x] `min(...x)`: Smallest value. +- [x] `max(...x)`: Largest value. +- [x] `mean(...x)`: Arithmetic mean. +- [x] `median(...x)`: Median value. +- [x] `mode(...x)`: Most frequent value, the smallest of them on a tie. +- [x] `quantile(p, ...x)`: Quantile at probability `p`, interpolated. +- [x] `variance(...x)`: Sample variance, the `n - 1` normalization. +- [x] `std(...x)`: Sample standard deviation. +- [x] `mad(...x)`: Mean absolute deviation. +- [x] `entropy(...x)`: Shannon entropy in nats, over the given distribution. +- [x] `geometricMean(...x)`: Geometric mean. +- [x] `harmonicMean(...x)`: Harmonic mean. +- [x] `skewness(...x)`: Skewness, indicating asymmetry. +- [x] `kurtosis(...x)`: Excess kurtosis - `0` for a normal distribution. + +### **3. Probability and Combinatorics** + +- [x] `factorial(n)`: Factorial of `n`. +- [x] `combinations(n, k)`: Ways to choose `k` items from `n`. +- [x] `permutations(n, k)`: Ways to arrange `k` items out of `n`. +- [x] `stirlingApproximation(n)`: Approximates `n!` by Stirling's formula. +- [x] `isPrime(n)`: `1` if `n` is prime, else `0`. +- [x] `fibonacci(n)`: The n-th Fibonacci number. +- [x] `birthdayProblem(n, days?)`: Chance two of `n` share one of `days` days. +- [x] `random(min?, max?)`: Random number - unit, `[0, min)`, or `[min, max)`. +- [x] `randomInt(min?, max?)`: As `random`, truncated to an integer. +- [x] `pickRandom(...x)`: Randomly selects one of the given values. + +### **4. Trigonometry** - [x] `deg(x)`: Converts the angle from radians to degrees. - [x] `rad(x)`: Converts the angle from degrees to radians. -- [x] `sin(x)`: Computes the sine of an angle (in radians). -- [x] `cos(x)`: Computes the cosine of an angle (in radians). -- [x] `tan(x)`: Computes the tangent of an angle (in radians). -- [x] `sind(x)`: Computes the sine of an angle (in degrees). -- [x] `cosd(x)`: Computes the cosine of an angle (in degrees). -- [x] `tand(x)`: Computes the tangent of an angle (in degrees). -- [x] `sec(x)`: Computes the secant of an angle. -- [x] `csc(x)`: Computes the cosecant of an angle. -- [x] `cot(x)`: Computes the cotangent of an angle. -- [x] `asin(x)`: Computes the inverse sine of a value. -- [x] `acos(x)`: Computes the inverse cosine of a value. -- [x] `atan(x)`: Computes the inverse tangent of a value. -- [ ] `atan2(y, x)`: Computes the angle from the x-axis to a point (`x`, `y`). -- [x] `sinh(x)`: Computes the hyperbolic sine of a value. -- [x] `cosh(x)`: Computes the hyperbolic cosine of a value. -- [x] `tanh(x)`: Computes the hyperbolic tangent of a value. -- [x] `asinh(x)`: Computes the inverse hyperbolic sine of a value. -- [x] `acosh(x)`: Computes the inverse hyperbolic cosine of a value. -- [x] `atanh(x)`: Computes the inverse hyperbolic tangent of a value. -- [x] `hypot(a, b, ...)`: Computes the square root of the sum of squares (Euclidean norm). -- [x] `versin(x)`: Computes the versine of an angle (in radians). -- [x] `versind(x)`: Computes the versine of an angle (in degrees). -- [x] `coversin(x)`: Computes the coversine of an angle (in radians). -- [x] `coversin(x)`: Computes the coversine of an angle (in degrees). - -### **7. Calculus** - -- [ ] `derivative(expr, variable)`: Calculates the derivative of an expression. -- [ ] `integrate(expr, variable)`: Computes the integral of an expression. -- [ ] `numericDerivative(func, x)`: Numerically computes the derivative at a point. - -### **8. Complex Numbers** - -- [ ] `complex(re, im)`: Creates a complex number from real and imaginary parts. -- [ ] `re(complex)`: Extracts the real part of a complex number. -- [ ] `im(complex)`: Extracts the imaginary part of a complex number. -- [ ] `arg(complex)`: Computes the argument (phase angle) of a complex number. -- [ ] `conj(complex)`: Returns the complex conjugate of a complex number. -- [ ] `iabs(complex)`: Computes the magnitude (absolute value) of a complex number. -- [ ] `iadd(complex1, complex2)`: Adds two complex numbers. -- [ ] `isub(complex1, complex2)`: Subtracts the second complex number from the first. -- [ ] `imul(complex1, complex2)`: Multiplies two complex numbers. -- [ ] `idiv(complex1, complex2)`: Divides the first complex number by the second. -- [ ] `isqrt(complex)`: Computes the square root of a complex number. -- [ ] `iexp(complex)`: Calculates the exponential of a complex number. -- [ ] `ilog(complex)`: Computes the natural logarithm of a complex number. -- [ ] `ipow(complex, exponent)`: Raises a complex number to a specified power. -- [ ] `phase(complex)`: Returns the phase angle (argument) of a complex number. - -### **9. Special Functions** - -- [ ] `gamma(x)`: Computes the gamma function of `x`, an extension of the factorial. -- [ ] `sinc(x)`: Computes the sinc function, defined as `sin(x)/x`. -- [ ] `heaviside(x)`: Computes the Heaviside step function. -- [ ] `erf(x)`: Computes the error function of `x`. -- [ ] `beta(a, b)`: Calculates the beta function. -- [ ] `lambertW(x)`: Computes the Lambert W function. -- [ ] `digamma(x)`: Calculates the digamma function, the logarithmic derivative of the gamma function. -- [ ] `zeta(s)`: Computes the Riemann zeta function of `s`. -- [ ] `gammaIncomplete(a, x)`: Computes the incomplete gamma function. - -### **11. Exponential and Logarithmic Functions** +- [x] `sin(x)`, `cos(x)`, `tan(x)`: In the context's angle unit. +- [x] `sind(x)`, `cosd(x)`, `tand(x)`: Always in degrees. +- [x] `sec(x)`, `csc(x)`, `cot(x)`: Reciprocal functions. +- [x] `asin(x)`, `acos(x)`, `atan(x)`: Take a ratio, return an angle. +- [x] `atan2(y, x)`: Angle from the x-axis to the point (`x`, `y`). +- [x] `sinh(x)`, `cosh(x)`, `tanh(x)`: Hyperbolic, on plain reals. +- [x] `asinh(x)`, `acosh(x)`, `atanh(x)`: Inverse hyperbolic, on plain reals. +- [x] `hypot(a, b, ...)`: Euclidean norm. +- [x] `versin(x)`, `coversin(x)`: Versine and coversine. +- [x] `versind(x)`, `coversind(x)`: The same, always in degrees. + +### **5. Exponential and Logarithmic** - [x] `exp(x)`: Computes `e` raised to the power of `x`. -- [x] `ln(x)`: Computes the natural logarithm of `x`. -- [x] `log(x, base)`: Computes the logarithm of `x` with a specified `base`. -- [x] `log10(x)`: Computes the base-10 logarithm of `x`. -- [x] `log2(x)`: Computes the base-2 logarithm of `x`. -- [ ] `pow10(exp)`: Computes `10` raised to the power of `exp`. -- [ ] `pow2(exp)`: Computes `2` raised to the power of `exp`. -- [ ] `expm1(x)`: Computes `e^x - [ ] 1`, useful for small values of `x` to reduce numerical error. -- [ ] `log1p(x)`: Computes `log(1 + x)`, improving accuracy for small `x`. - -### **12. Linear Algebra and Geometry** - -- [ ] `dotProduct(a, b)`: Computes the dot product of two vectors. -- [ ] `crossProduct(a, b)`: Computes the cross product of two 3D vectors. -- [ ] `projection(u, v)`: Projects vector `u` onto vector `v`. -- [ ] `angleBetween(u, v)`: Calculates the angle between two vectors. -- [ ] `distance(p1, p2)`: Computes the Euclidean distance between two points. -- [ ] `reflect(point, line)`: Reflects a point over a line. -- [ ] `intersect(line1, line2)`: Finds the intersection point of two lines. - -### **13. Signal Processing** - -- [ ] `fft(arr)`: Computes the Fast Fourier Transform of an array. -- [ ] `ifft(arr)`: Computes the inverse Fast Fourier Transform. -- [ ] `dft(arr)`: Calculates the Discrete Fourier Transform of an array. -- [ ] `idft(arr)`: Calculates the inverse Discrete Fourier Transform. -- [ ] `convolve(arr1, arr2)`: Computes the convolution of two sequences. -- [ ] `correlate(arr1, arr2)`: Computes the cross-correlation of two sequences. - -### **14. Financial Math** - -- [ ] `futureValue(principal, rate, periods)`: Computes the future value of an investment. -- [ ] `presentValue(futureValue, rate, periods)`: Computes the present value given the future value. -- [ ] `compoundInterest(principal, rate, timesCompounded, periods)`: Calculates compound interest over time. -- [ ] `annuityPayment(rate, periods, presentValue)`: Computes the payment amount of an annuity. - -### **15. Interpolation and Approximation** - -- [ ] `lerp(a, b, t)`: Performs linear interpolation between two values `a` and `b` based on `t`. -- [ ] `hermite(p0, p1, t)`: Performs Hermite interpolation. -- [ ] `lagrange(points, x)`: Uses Lagrange polynomials to interpolate the value at `x`. -- [ ] `spline(points, x)`: Computes spline interpolation at `x`. - -### **16. Number Theory** - -- [ ] `totient(n)`: Computes Euler’s totient function of `n`. -- [ ] `mobius(n)`: Computes the Möbius function of `n`. -- [ ] `isPerfectSquare(n)`: Checks whether a number is a perfect square. -- [ ] `divisors(n)`: Lists all divisors of a number `n`. +- [x] `expm1(x)`: `e^x - 1`, accurate for small `x`. +- [x] `ln(x)`: Natural logarithm. +- [x] `log(x, base?)`: Logarithm of `x`, base 10 by default. +- [x] `log10(x)`, `log2(x)`: Base-10 and base-2 logarithms. +- [x] `log1p(x)`: `log(1 + x)`, accurate for small `x`. +- [x] `pow10(x)`, `pow2(x)`: Powers of 10 and 2. + +### **6. Special Functions** + +- [x] `gamma(x)`: Gamma function, an extension of the factorial. +- [x] `lngamma(x)`: Natural log of the gamma function. +- [x] `digamma(x)`: Logarithmic derivative of the gamma function. +- [x] `beta(a, b)`: Beta function. +- [x] `gammaIncomplete(a, x)`: Lower incomplete gamma, unregularized. +- [x] `erf(x)`, `erfc(x)`: Error function and its complement. +- [x] `zeta(s)`: Riemann zeta function. +- [x] `lambertW(x)`: Lambert W function, principal branch. +- [x] `sinc(x)`: Unnormalized `sin(x)/x`, always in radians. +- [x] `heaviside(x)`: Step function, `0.5` at the origin. + +### **7. Number Theory** + +- [x] `totient(n)`: Euler's totient function. +- [x] `mobius(n)`: Mobius function. +- [x] `isPerfectSquare(n)`: `1` if `n` is a perfect square, else `0`. + +### **8. Financial Math** + +- [x] `futureValue(principal, rate, periods)`: Future value of an investment. +- [x] `presentValue(future, rate, periods)`: Present value of a future sum. +- [x] `compoundInterest(principal, rate, times, periods)`: Accrued amount. +- [x] `annuityPayment(rate, periods, present)`: Level payment of an annuity. + +## Not planned + +Ruled out to keep every value a plain number and the library small. + +**Needs an array value type** - matrices and vectors (`matrix`, `det`, `inv`, +`transpose`, `dot`, `cross`, `reshape`, `norm`, ...), signal processing +(`fft`, `dft`, `convolve`, `correlate`), and vector geometry (`projection`, +`angleBetween`, `reflect`, `intersect`). + +**Returns a list rather than a number** - `shuffle`, `primeFactors`, +`divisors`, `range`, `lagrange`, `spline`. + +**Needs two independent lists** - `covariance`, `corr`, `weightedMean`. These +cannot be written variadically. + +**Needs a different numeric type** - `complex` and everything on it (`re`, +`im`, `arg`, `conj`, ...), plus `bignumber` and `fraction`. + +**Symbolic, not numeric** - `simplify`, `expand`, `derivative`, `integrate`, +`rationalize`, and solving an equation for a variable. These need a computer +algebra system, which is a different project from an evaluator. + +**Takes a function as a value** - `numericDerivative`. There is no function +type. + +**Already covered** - one name per behaviour, so nothing is implemented twice: +`fix` is `trunc`, `sigFigs` is `precision`, `rand`/`randi` are +`random`/`randomInt`, and `binomialCoefficient` is `combinations`. `parse` and +`evaluate(expr, scope?)` are the public `parse` and `solve` APIs. diff --git a/src/functions/numbers.ts b/src/functions/numbers.ts index 164ac6a..3f36b3d 100644 --- a/src/functions/numbers.ts +++ b/src/functions/numbers.ts @@ -2,11 +2,6 @@ function gcd2(a: number, b: number): number { return b ? gcd2(b, a % b) : Math.abs(a); } -// `toPrecision` only accepts 1..100 significant digits -function significant(x: number, n: number): number { - return Number(x.toPrecision(Math.min(Math.max(Math.trunc(n), 1), 100))); -} - // modular exponentiation, in BigInt so that a large modulus cannot overflow function modExp(base: number, exponent: number, modulus: number): number { if (modulus <= 0 || exponent < 0) return NaN; @@ -47,15 +42,15 @@ export default function initNumbers() { ? -Math.pow(-x, 1 / y) : Math.pow(x, 1 / y), trunc: (x: number) => Math.trunc(x), - fix: (x: number) => Math.trunc(x), round: (x: number, n = 0) => { const scale = 10 ** n; return Math.round(x * scale) / scale; }, roundToNearest: (x: number, step: number) => Math.round(x / step) * step, - precision: (x: number, n: number) => significant(x, n), - sigFigs: (x: number, n: number) => significant(x, n), + // `toPrecision` only accepts 1..100 significant digits + precision: (x: number, n: number) => + Number(x.toPrecision(Math.min(Math.max(Math.trunc(n), 1), 100))), clamp: (x: number, min: number, max: number) => Math.min(Math.max(x, min), max), gcd: (...x: number[]) => x.map(Math.trunc).reduce(gcd2, 0), diff --git a/tests/functions.test.ts b/tests/functions.test.ts index 4203ac2..ea9f786 100644 --- a/tests/functions.test.ts +++ b/tests/functions.test.ts @@ -36,12 +36,10 @@ describe('numbers', () => { ['round(2.567, 2)', 2.57], ['round(2.5)', 3], ['round(-1.4)', -1], - ['fix(-2.7)', -2], ['trunc(2.7)', 2], ['roundToNearest(7, 5)', 5], ['roundToNearest(8, 5)', 10], ['precision(3.14159, 3)', 3.14], - ['sigFigs(123456, 2)', 120000], ['clamp(5, 1, 3)', 3], ['clamp(0, 1, 3)', 1], ['clamp(2, 1, 3)', 2] From a355434422e60cedb84df85d61df0db3e8e32bab Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:01:14 +0300 Subject: [PATCH 22/25] chore: remove commented-out code Two dead render calls and an unused import in the demo, a fully commented-out `batch script` test, and an empty `esbuild: {}` block in the build config that only held a `// minify: true` line - `package.json` already passes `--minify`. Co-Authored-By: Claude Opus 5 (1M context) --- build.config.ts | 5 +---- demo/main.ts | 7 ------- tests/index.test.ts | 10 ---------- 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/build.config.ts b/build.config.ts index ae30e6b..a8f622d 100644 --- a/build.config.ts +++ b/build.config.ts @@ -5,9 +5,6 @@ export default defineBuildConfig({ outDir: 'dist', declaration: true, rollup: { - emitCJS: true, - esbuild: { - // minify: true - } + emitCJS: true } }); diff --git a/demo/main.ts b/demo/main.ts index 33bd213..93c870f 100644 --- a/demo/main.ts +++ b/demo/main.ts @@ -2,7 +2,6 @@ import { tokenize } from '../src/lexer'; import { parse } from '../src/parser'; import { explain } from '../src/evaluator'; import { renderTokensAsHTML } from '../src/render/html'; -// import { renderTokensAsLaTeX } from '../src/render/latex'; import { createContext } from '../src/context'; const input = document.querySelector('textarea')!; @@ -39,12 +38,6 @@ function solve(code = '') { tokens.map((t) => `${t.type}[${t.value}] ${t.line}:${t.column}`) ); - // const htmlStr = renderTokensAsHTML(tokens, { colorScheme: 'auto' }) - // console.log('render: html', htmlStr) - - // const latexStr = renderTokensAsLaTeX(tokens, { mode: 'align' }) - // console.log('render: latex\n', latexStr) - const ast = parse(tokens); console.log('ast:', ast); diff --git a/tests/index.test.ts b/tests/index.test.ts index 9938be0..f3676a8 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -109,14 +109,4 @@ describe('mathflow - evaluate', () => { expect(ctx.solve(`(3)(2)`).value).toBe(3 * 2); expect(ctx.solve(`(5-2)(1+3)`).value).toBe((5 - 2) * (1 + 3)); }); - - // test('batch script', () => { - // const expr = ` - // # this is a comment - // a = 1, b = 2, c = a + b - // # return value - // a + b + c - // ` - // expect(() => solveBatch(ctx, expr)).not.toThrow() - // }); }); From 971ae705ef5df38e9f30aaf7a94c45998aa68df5 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:02:51 +0300 Subject: [PATCH 23/25] docs: describe v3 in the README and CLAUDE.md README gains the step-by-step solution as a headline feature with a worked example, and states the one-value-type rule that decides what mathflow will and will not grow. CLAUDE.md is rewritten around the reduction model that replaced the solution stack, and adds the scope rule and the lexer's registration trap. Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 25 ++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..fe97304 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,47 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +Mathflow is a dependency-free TypeScript library that evaluates math expressions written in natural notation (`2x + 3(y - 1)`), and renders them as HTML or LaTeX. Published as `@mathflowjs/mathflow`. + +## Commands + +```sh +pnpm dev # Vite demo (index.html + demo/main.ts) +pnpm test # vitest run +pnpm exec vitest run tests/lexer.test.ts # single file +pnpm exec vitest run -t 'implicit' # single test by name +pnpm lint # eslint src tests + prettier --check +pnpm lint:fix # eslint --fix + prettier --write +pnpm build # unbuild -> dist/ (ESM + CJS + .d.ts) +``` + +`tsc --noEmit` currently fails on vitest's own type declarations (`moduleResolution: "node"` vs `vite/module-runner`) — pre-existing, not caused by your changes. Type errors in `src/` surface through `pnpm build` and the editor instead. + +Contribution conventions (style, commit format, PR expectations) live in `AGENTS.md`. + +## Architecture + +Pipeline, orchestrated by `src/solve.ts`: + +``` +code ──tokenize(ctx, code)──> IToken[] ──parse(tokens)──> AST ──explain(ctx, node)──> { value, solution } + └── renderTokensAsHTML / renderTokensAsLaTeX +``` + +`createContext()` (`src/context.ts`) is the single entry point for consumers: it holds `variables`, `constants`, `functions`, and `preferences` (`precision`, `fractionDigits`, `angles`), and exposes `solve` / `solveBatch` / `renderAsHTML` / `renderAsLaTeX` bound to that context. Every stage takes `ctx` explicitly — there is no global state. + +Things that are non-obvious from any single file: + +- **The lexer is context-dependent.** `tokenize` classifies an identifier as `TOKEN.FUNCTION` only if `ctx.functions.has(name)`. Custom functions must be registered on the context *before* the expression is tokenized, otherwise they lex as plain identifiers — and since `name(` then becomes implicit multiplication, a missing registration surfaces as a *syntax* error, not a missing-function one. This is why `tests/functions.test.ts` exercises every builtin through `ctx.solve()`. +- **Implicit multiplication is a lexer concern, not a parser one.** `expandImplicitMultiplication` splices a synthetic `*` token (marked `implicit: true`) between e.g. `)(`, `2x`, `2sin`. The parser sees fully explicit token streams. Add new implicit-product cases there, not in `parseFactor`. +- **Renderers consume tokens, not the AST.** `src/render/html.ts` and `src/render/latex.ts` walk `IToken[]`, so they preserve source order and must decide themselves what to do with `implicit` tokens. Rendering never evaluates. +- **Solutions come from reducing the tree, not from logging strings.** `run` in `src/evaluator/index.ts` first calls `resolve` (names → values, and where an unknown variable throws), then loops `reduceOnce` to a fixpoint. Each `reduceOnce` collapses *every* sub-expression whose operands are already literals, so one call is one step. `evaluate` runs the loop for the value; `explain` runs the same loop and renders each intermediate tree with `stringify` (`src/evaluator/solution.ts`). Anything that produces a step must go through a node type the reducer handles — that uniformity is the point, an earlier design instrumented node types individually and silently dropped multi-argument calls and unary expressions. +- **A unary over a literal is folded, not reduced.** `-3` is notation for a negative number, so `signed()` collapses it during `resolve` rather than spending a step on it. Without that, `-(3+4)` emits `-7` twice. +- **`stringify` derives parentheses from precedence**, including that `^` is right-associative and that a negative literal needs wrapping as a right operand (`2 - (-3)`). Steps are valid mathflow source and round-trip through `tokenize` — the demo and `renderAsHTML` rely on that. +- **Precision is applied per node, not once at the end.** `toNumber` runs `toPrecision`/`toFixed` on every literal and intermediate result, so each printed step's arithmetic checks out on its own. That is also why `1/3*3` is `0.9999` at `fractionDigits: 4`. Changing where it's called changes rounding across the whole suite. +- **Errors are plain objects, not `Error` instances.** `createError` (`src/error/index.ts`) returns `{ name, type, message, suggestion }` with `type` from the `ERRORS` enum. Never use `instanceof Error` on them. `safe(() => ...)` (also `src/error/index.ts`) turns any throwing API into `ISafeResult` (`{ data, error }`) — there is one wrapper for everything, so a new throwing API needs no counterpart. +- **`src/index.ts` is the public surface.** Anything not re-exported there is internal, regardless of visibility. Built-ins are registered in `src/functions/index.ts`, one `initX()` per domain module; trig functions close over `ctx.preferences` to honour `angles: 'rad' | 'deg'` (only true angles are converted — an inverse function takes a ratio, a hyperbolic one a plain real). +- **Every value is a `number`, deliberately.** No arrays, matrices, complex numbers or fractions; list-shaped functions are variadic (`mean(1, 2, 3)`), and predicates return `1`/`0`. `TODO.md` records what this rules out and why — check it before adding a function that wants a new value type. + +`dist/` is build output — never edit it. Releases go through `release-it` (conventional-changelog, `master` only, manual `workflow_dispatch` in CI). diff --git a/README.md b/README.md index e5fb2df..a79ffee 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,35 @@ Mathflow is a lightweight JavaScript library for evaluating mathematical express ## Features - **Natural syntax:** Write `2x + 3(y - 1)` instead of `2*x + 3*(y - 1)`. Both are supported anyway. -- **Mathematical functions:** Built-in support for `sin`, `cos`, `tan`, `log`, `sqrt`, `abs`, and more. +- **Step-by-step solutions:** Every result comes with the working out, one line per step. +- **Mathematical functions:** Over a hundred built-ins - trigonometry, logarithms, statistics, combinatorics, special functions and more. - **Variables:** Assign and use variables like `x = 5`, `y = 5x - 1` - **Clean & modern syntax:** Readable and easy-to-write syntax for mathematical expressions. - **AST-based parsing:** Proper order of operations and expression evaluation. - **Lightweight:** Focused purely on mathematical computation without bloat. +```js +import { createContext } from '@mathflowjs/mathflow'; + +const ctx = createContext({ preferences: { angles: 'deg' } }); + +ctx.solve('x = 5'); +ctx.solve('2x^3 + sqrt(25)'); +// { +// value: 255, +// solution: [ +// '2 * 5 ^ 3 + sqrt(25)', +// '2 * 125 + 5', +// '250 + 5', +// '255' +// ] +// } +``` + +Every value is a plain number, so a data set is written variadically: +`mean(1, 2, 3)`, not `mean([1, 2, 3])`. See [TODO.md](./TODO.md) for the full +function list and for what is deliberately out of scope. + ## Use Cases - Formula calculators and mathematical tools. From ad8173dbab45e89d41f2a3f30f8bcfba64fde066 Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sat, 29 Aug 2026 13:19:55 +0300 Subject: [PATCH 24/25] feat(demo): typeset the solution with katex The demo showed the token-rendered HTML but nothing for `renderAsLaTeX`, so the LaTeX renderer could only be checked by reading its output string. Add a LaTeX pane that typesets the same solution, with the raw source in a collapsible block beside it. KaTeX is all-or-nothing per call: a single construct it rejects renders the whole input as red error text. Each step is therefore typeset on its own, so a bad line shows up as one red row and the other 38 still render - which is the point, since it makes the renderer's gaps visible during development. Dev-only. `files` is `dist`, the library still has no runtime dependencies, and the demo is not part of the build. Co-Authored-By: Claude Opus 5 (1M context) --- demo/main.ts | 57 ++++++++++++++++++++++++++++++++++++++++++-------- index.html | 28 +++++++++++++++++++++++++ package.json | 2 ++ pnpm-lock.yaml | 25 ++++++++++++++++++++++ 4 files changed, 103 insertions(+), 9 deletions(-) diff --git a/demo/main.ts b/demo/main.ts index 93c870f..168dbfb 100644 --- a/demo/main.ts +++ b/demo/main.ts @@ -1,7 +1,11 @@ +import katex from 'katex'; +import 'katex/dist/katex.min.css'; + import { tokenize } from '../src/lexer'; import { parse } from '../src/parser'; import { explain } from '../src/evaluator'; import { renderTokensAsHTML } from '../src/render/html'; +import { renderTokensAsLaTeX } from '../src/render/latex'; import { createContext } from '../src/context'; const input = document.querySelector('textarea')!; @@ -12,6 +16,10 @@ const solveBtn = document.querySelector('#solve')!; const solutionBox = document.querySelector('#solution')!; +const latexBox = document.querySelector('#latex')!; + +const latexSource = document.querySelector('#latex-source')!; + // create evaluation context const ctx = createContext({ preferences: { @@ -26,7 +34,7 @@ const ctx = createContext({ // - tokenize input string // - parse tokens into AST tree // - evaluate and solve each node in AST body -// - render solution as HTML +// - render solution as HTML and as typeset LaTeX function solve(code = '') { console.clear(); @@ -51,17 +59,46 @@ function solve(code = '') { result.map((r) => r.solution) ); - let solution = ''; - for (const r of result) { - if (r.solution.length < 2) continue; - solution += r.solution.join('\n') + '\n\n'; - } + // a statement with a single step had nothing to work through + const groups = result + .map((r) => r.solution) + .filter((steps) => steps.length > 1); - const content = renderTokensAsHTML(tokenize(ctx, solution), { - colorScheme: 'auto' - }); + const content = renderTokensAsHTML( + tokenize(ctx, groups.map((steps) => steps.join('\n')).join('\n\n')), + { colorScheme: 'auto' } + ); solutionBox.innerHTML = content.html + ``; + + renderLaTeX(groups.flat()); +} + +// Typeset each step on its own. KaTeX is all-or-nothing per call, so one +// construct it rejects would otherwise blank the whole solution instead of +// showing which line is at fault. +function renderLaTeX(steps: string[]) { + const source: string[] = []; + const typeset: string[] = []; + + for (const step of steps) { + const latex = renderTokensAsLaTeX(tokenize(ctx, step), { + mode: 'align' + }); + + source.push(latex); + typeset.push( + katex.renderToString(latex, { + displayMode: true, + throwOnError: false + }) + ); + } + + console.log('latex:', source); + + latexSource.textContent = source.join('\n'); + latexBox.innerHTML = typeset.join(''); } // initial test program @@ -92,6 +129,8 @@ function safeSolve(input: string) { errorBox.classList.add('active'); errorBox.textContent = `${err}`; solutionBox.innerHTML = ''; + latexBox.innerHTML = ''; + latexSource.textContent = ''; } } diff --git a/index.html b/index.html index 30bd55c..6f0c840 100644 --- a/index.html +++ b/index.html @@ -75,6 +75,25 @@ margin: 1rem auto; } + #latex { + padding: 0.5rem 0; + overflow-x: auto; + } + + #latex .katex-display { + margin: 0.35rem 0; + text-align: left; + } + + #latex-source { + font-size: 0.8rem; + white-space: pre-wrap; + word-break: break-all; + opacity: 0.7; + max-height: 30dvh; + overflow: auto; + } + #error { display: none; } @@ -109,6 +128,15 @@

Solution:

+
+

LaTeX:

+
+
+ LaTeX source +

+                
+
+

diff --git a/package.json b/package.json index 8c75ffe..a2512d2 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,11 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@release-it/conventional-changelog": "^12.0.0", + "@types/katex": "^0.16.8", "eslint": "^10.9.1", "globals": "^17.11.0", "husky": "^9.1.7", + "katex": "^0.18.4", "lint-staged": "^17.4.1", "prettier": "^3.9.6", "release-it": "^21.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ceffa6b..83ec39e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: '@release-it/conventional-changelog': specifier: ^12.0.0 version: 12.0.0(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)(release-it@21.0.2(@types/node@25.5.2)(supports-color@8.1.1)) + '@types/katex': + specifier: ^0.16.8 + version: 0.16.8 eslint: specifier: ^10.9.1 version: 10.9.1(jiti@2.6.1)(supports-color@8.1.1) @@ -27,6 +30,9 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 + katex: + specifier: ^0.18.4 + version: 0.18.4 lint-staged: specifier: ^17.4.1 version: 17.4.1 @@ -832,6 +838,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@types/node@25.5.2': resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} @@ -1060,6 +1069,10 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -1540,6 +1553,10 @@ packages: json-with-bigint@3.5.8: resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + katex@0.18.4: + resolution: {integrity: sha512-IMPntbRLOU+eu88XDiFKqQ8Akhr9Tv7jDMXqPhjG9SI1JMA4DIgXk4x9k4skJz2NZJXBRbC+2pYBLj9olqcZow==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3011,6 +3028,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/katex@0.16.8': {} + '@types/node@25.5.2': dependencies: undici-types: 7.18.2 @@ -3270,6 +3289,8 @@ snapshots: commander@11.1.0: {} + commander@8.3.0: {} + commondir@1.0.1: {} concat-stream@2.0.0: @@ -3781,6 +3802,10 @@ snapshots: json-with-bigint@3.5.8: {} + katex@0.18.4: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 From 964ae04a96474b8b3484342e4ef0c36f403fe69c Mon Sep 17 00:00:00 2001 From: Henry Hale <92443116+henryhale@users.noreply.github.com> Date: Sun, 30 Aug 2026 06:09:08 +0300 Subject: [PATCH 25/25] fix(render): emit LaTeX that parses Three faults in the token walker, all of which produced LaTeX that a renderer rejects rather than merely typeset oddly: - `^` emitted its operand as-is, so `2^(5-1)` became `2^\left(5-1\right)`. A superscript takes a single token or a braced group, so the exponent now has to be read as a unit: `2^{5-1}`. That includes its sign, a function call, and a nested `^`, which is right-associative - `2^3^2` is `2^{3^{2}}`, not `2^{3}^{2}`, which is a double superscript. - `ceil` and `floor` mapped to `\lceil` and `\lfloor`, opening a delimiter that nothing closed. They join `sqrt` and `abs` in the table that has to name both halves of the pair. - A group's contents were copied out token by token instead of going through these rules, so anything structural inside a call broke: `sqrt(abs(-16))` gave `\sqrt{\left|\left(-16\right)}`. A group is an expression like any other, so it renders through the same path. The fraction rule also had to be tightened. It tests token types but pops a rendered string, which was only ever safe because every value happened to be one entry. With an exponent now rendering as a unit, `y^2 / 6` would have popped `^{2}` as the numerator; it now fires only when the previous token was emitted as a lone value. The demo's sample program went from one red line to none, all 39 steps. Co-Authored-By: Claude Opus 5 (1M context) --- src/render/latex.ts | 107 +++++++++++++++++++++++++++++++++++++++---- tests/render.test.ts | 38 ++++++++++++++- 2 files changed, 134 insertions(+), 11 deletions(-) diff --git a/src/render/latex.ts b/src/render/latex.ts index 57e7fe1..0b654a9 100644 --- a/src/render/latex.ts +++ b/src/render/latex.ts @@ -1,4 +1,4 @@ -import { TOKEN, type IToken } from '../lexer/tokens'; +import { isUnaryOperator, SYMBOL, TOKEN, type IToken } from '../lexer/tokens'; export type ILaTeXRenderOptions = { mode: 'inline' | 'display' | 'align'; @@ -14,9 +14,6 @@ const characterMap: Record = { asin: '\\arcsin', acos: '\\arccos', atan: '\\arctan', - abs: '\\left|', - floor: '\\lfloor', - ceil: '\\lceil', exp: '\\exp', sqrt: '\\sqrt', min: '\\min', @@ -41,31 +38,102 @@ function formatTokenValue( return token.value; } -// functions written as a delimiter pair rather than a name and parentheses +// functions written as a delimiter pair rather than a name and parentheses - +// each entry has to close what it opens, or the output will not parse const delimiters: Record = { sqrt: ['\\sqrt{', '}'], - abs: ['\\left|', '\\right|'] + abs: ['\\left|', '\\right|'], + ceil: ['\\left\\lceil ', '\\right\\rceil'], + floor: ['\\left\\lfloor ', '\\right\\rfloor'] }; -// read up to the paren that closes the one already consumed +// read up to the paren that closes the one already consumed, rendering what is +// inside through the same rules - a group is an expression like any other, so +// a superscript or a nested call within it has to be handled, not copied out function collectGroup( tokens: IToken[], start: number, mode: ILaTeXRenderOptions['mode'] ): { content: string; end: number } { - const content = []; let depth = 1; let i = start; while (i < tokens.length && depth > 0) { if (tokens[i].type === TOKEN.LPAREN) depth++; if (tokens[i].type === TOKEN.RPAREN) depth--; + i++; + } + + // exclude the closing paren, unless the group was never closed + const end = depth === 0 ? i - 1 : i; + + return { + content: handleSpecialCases(tokens.slice(start, end), mode), + end: i + }; +} + +/** + * Read one operand of `^`. + * + * A superscript takes a single token or a braced group, so `2^(5-1)` has to + * come out as `2^{5-1}` - emitting `^` and walking on gives `2^\left(5-1\right)`, + * which is a parse error rather than a wrong-looking result. + */ +function readExponent( + tokens: IToken[], + start: number, + mode: ILaTeXRenderOptions['mode'] +): { content: string; end: number } { + let content = ''; + let i = start; + + // a sign belongs to the exponent, as in `2^-1` + while ( + tokens[i] && + tokens[i].type === TOKEN.OPERATOR && + isUnaryOperator(tokens[i].value) + ) { + content += tokens[i].value; + i++; + } + + const token = tokens[i]; + + if (!token) return { content, end: i }; + + if (token.type === TOKEN.FUNCTION && tokens[i + 1]?.type === TOKEN.LPAREN) { + const pair = delimiters[token.value]; + const group = collectGroup(tokens, i + 2, mode); - if (depth > 0) content.push(formatTokenValue(tokens[i], mode)); + content += pair + ? pair[0] + group.content + pair[1] + : `${formatTokenValue(token, mode)}\\left(${group.content}\\right)`; + i = group.end; + } else if (token.type === TOKEN.LPAREN) { + // the braces already group it, so the parentheses are redundant + const group = collectGroup(tokens, i + 1, mode); + + content += group.content; + i = group.end; + } else { + content += formatTokenValue(token, mode); i++; } - return { content: content.join(''), end: i }; + // `^` is right-associative: 2^3^2 is 2^{3^{2}} + if ( + tokens[i] && + tokens[i].type === TOKEN.OPERATOR && + tokens[i].value === SYMBOL.POW + ) { + const nested = readExponent(tokens, i + 1, mode); + + content += `^{${nested.content}}`; + i = nested.end; + } + + return { content, end: i }; } function handleSpecialCases( @@ -75,6 +143,10 @@ function handleSpecialCases( const result = []; let i = 0; + // index of the token whose rendering is the last entry in `result`, when + // that entry is a lone value - only then is it safe to pop as a numerator + let atom = -1; + while (i < tokens.length) { const token = tokens[i]; const nextToken = tokens[i + 1]; @@ -105,12 +177,23 @@ function handleSpecialCases( continue; } + // Handle superscripts, which have to be braced as a single group + if (token.type === TOKEN.OPERATOR && token.value === SYMBOL.POW) { + const exponent = readExponent(tokens, i + 1, mode); + + result.push(`^{${exponent.content}}`); + i = exponent.end; + + continue; + } + // Handle fractions (division) if (token.type === TOKEN.OPERATOR && token.value === '/') { // Look for simple fraction pattern: number/number or identifier/identifier if ( prevToken && nextToken && + atom === i - 1 && (prevToken.type === TOKEN.NUMBER || prevToken.type === TOKEN.IDENTIFIER) && (nextToken.type === TOKEN.NUMBER || @@ -126,6 +209,10 @@ function handleSpecialCases( } } + if (token.type === TOKEN.NUMBER || token.type === TOKEN.IDENTIFIER) { + atom = i; + } + result.push(formatTokenValue(token, mode)); i++; diff --git a/tests/render.test.ts b/tests/render.test.ts index aa92710..b90de11 100644 --- a/tests/render.test.ts +++ b/tests/render.test.ts @@ -10,12 +10,48 @@ beforeEach(() => { }); describe('latex output', () => { + test('superscripts are braced as one group', () => { + // `2^\\left(5-1\\right)` is a parse error, not just ugly output + expect(ctx.renderAsLaTeX('2^(5-1)')).toContain('2^{5-1}'); + expect(ctx.renderAsLaTeX('2^3')).toContain('2^{3}'); + expect(ctx.renderAsLaTeX('2^-1')).toContain('2^{-1}'); + expect(ctx.renderAsLaTeX('2^sin(30)')).toContain( + '2^{\\text{sin}\\left(30\\right)}' + ); + // right-associative, so the nesting has to follow + expect(ctx.renderAsLaTeX('2^3^2')).toContain('2^{3^{2}}'); + }); + + test('a fraction only forms from a lone value', () => { + expect(ctx.renderAsLaTeX('3/4')).toContain('\\frac{3}{4}'); + expect(ctx.renderAsLaTeX('2 * 3 / 4')).toContain('\\frac{3}{4}'); + // the numerator here is an exponent, not the bare `2` + expect(ctx.renderAsLaTeX('y^2 / 6')).toContain('y^{2} \\div 6'); + }); + test('delimiter-pair functions', () => { expect(ctx.renderAsLaTeX('sqrt(25)')).toContain('\\sqrt{25}'); expect(ctx.renderAsLaTeX('abs(-10)')).toContain('\\left|-10\\right|'); expect(ctx.renderAsLaTeX('sqrt(x^2 + y^2)')).toContain( - '\\sqrt{x^2+y^2}' + '\\sqrt{x^{2}+y^{2}}' + ); + expect(ctx.renderAsLaTeX('ceil(-3.1)')).toContain( + '\\left\\lceil -3.1\\right\\rceil' + ); + expect(ctx.renderAsLaTeX('floor(2.7)')).toContain( + '\\left\\lfloor 2.7\\right\\rfloor' + ); + }); + + test('groups render through the same rules as the top level', () => { + // a nested call used to leak its opening delimiter and never close it + expect(ctx.renderAsLaTeX('sqrt(abs(-16))')).toContain( + '\\sqrt{\\left|-16\\right|}' + ); + expect(ctx.renderAsLaTeX('abs(sqrt(9) + 1)')).toContain( + '\\left|\\sqrt{9}+1\\right|' ); + expect(ctx.renderAsLaTeX('sqrt(2^(5-1))')).toContain('\\sqrt{2^{5-1}}'); }); test('mode of output', () => {