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. 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/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 7bc0811..168dbfb 100644 --- a/demo/main.ts +++ b/demo/main.ts @@ -1,10 +1,12 @@ +import katex from 'katex'; +import 'katex/dist/katex.min.css'; + 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 { renderTokensAsLaTeX } from '../src/render/latex'; import { createContext } from '../src/context'; -import { createSolutionStack } from '../src/evaluator/solution'; const input = document.querySelector('textarea')!; @@ -14,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: { @@ -28,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(); @@ -40,42 +46,59 @@ 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); - 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'; - } + // 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 @@ -106,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 062d6e7..a2512d2 100644 --- a/package.json +++ b/package.json @@ -40,21 +40,20 @@ "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", + "@types/katex": "^0.16.8", + "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", + "katex": "^0.18.4", + "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..83ec39e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,52 +14,49 @@ 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)) + '@types/katex': + specifier: ^0.16.8 + version: 0.16.8 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) + katex: + specifier: ^0.18.4 + version: 0.18.4 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 +64,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 +253,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 +274,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 +298,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 +448,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 +500,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 +804,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 +835,15 @@ 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/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@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 +851,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.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} - '@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 +924,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 +949,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 +982,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 +991,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 +1001,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 +1010,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,28 +1017,16 @@ 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==} + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} caniuse-lite@1.0.30001785: resolution: {integrity: sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==} @@ -1546,18 +1035,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 +1053,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 +1061,21 @@ 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'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} 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 +1090,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 +1181,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 +1194,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 +1216,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 +1232,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 +1245,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 +1268,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 +1289,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 +1330,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 +1353,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 +1378,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 +1392,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 +1403,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 +1425,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 +1440,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 +1465,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 +1489,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 +1509,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 +1526,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 +1541,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,9 +1553,8 @@ 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'} + katex@0.18.4: + resolution: {integrity: sha512-IMPntbRLOU+eu88XDiFKqQ8Akhr9Tv7jDMXqPhjG9SI1JMA4DIgXk4x9k4skJz2NZJXBRbC+2pYBLj9olqcZow==} hasBin: true keyv@4.5.4: @@ -2438,108 +1563,93 @@ packages: 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 +1678,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 +1693,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 +1707,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 +1715,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 +1742,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 +1767,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 +1828,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 +1844,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 +2033,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 +2062,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-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + 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-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==} + quickjs-wasi@2.2.0: + resolution: {integrity: sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==} - rc9@2.1.2: - resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - - 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 +2100,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 +2118,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 +2139,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 +2152,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 +2173,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 +2193,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 +2218,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 +2241,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 +2248,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 +2277,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 +2311,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 +2338,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 +2381,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 +2411,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 +2426,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 +2439,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 +2471,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 +2567,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,395 +2612,175 @@ 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 + + '@octokit/auth-token@6.0.0': {} - '@jest/expect-utils@30.3.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': - dependencies: - '@types/node': 25.5.2 - jest-regex-util: 30.0.1 - - '@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)': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: '@octokit/core': 7.0.6 @@ -4433,80 +2813,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 +3000,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 +3026,14 @@ 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/katex@0.16.8': {} + '@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 +3041,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 +3179,7 @@ snapshots: acorn@8.16.0: {} - agent-base@7.1.4: {} + agent-base@9.0.0: {} ajv@6.14.0: dependencies: @@ -4934,36 +3188,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 +3211,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 +3233,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 +3265,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 +3279,20 @@ 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: {} + commander@8.3.0: {} 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 +3306,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 +3433,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 +3456,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 +3487,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 +3526,6 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} escodegen@2.1.0: @@ -5461,21 +3547,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 +3610,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 +3624,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 +3646,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 +3664,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 +3696,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 +3707,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,465 +3735,76 @@ 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: {} + katex@0.18.4: + dependencies: + commander: 8.3.0 keyv@4.5.4: dependencies: @@ -6209,87 +3812,69 @@ snapshots: 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 +3896,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 +3909,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 +3941,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 +3952,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 +3998,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 +4006,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 +4053,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 +4240,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 +4299,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 +4342,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 +4407,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 +4415,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 +4427,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 +4446,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 +4466,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 +4493,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 +4521,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 +4556,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 +4603,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 +4636,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 +4645,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 +4656,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' 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); 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/evaluator/index.ts b/src/evaluator/index.ts index 2b66f65..d1b7ce7 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,231 @@ 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: reduceOnce(ctx, left), + right: reduceOnce(ctx, 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) => reduceOnce(ctx, 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 72c03ad..7547413 100644 --- a/src/evaluator/solution.ts +++ b/src/evaluator/solution.ts @@ -1,118 +1,83 @@ -import { isBinaryOperator, isAlpha } from '../lexer/tokens'; - -type ISolutionConfig = { - id: number; - parts: string[]; -}; - -export type ISolution = { - readonly steps: string[]; - readonly id: number; +import { NODE, type INode } from '../parser'; +import { SYMBOL } from '../lexer/tokens'; + +/** + * 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 store = new WeakMap(); +const UNARY = 3; +const ATOM = 5; -export function advance(solution: ISolution) { - if (!store.has(solution)) return; - const c = store.get(solution)!; - c.parts.push(`#${++c.id}`); +function precedence(node: INode): number { + if (node.type === NODE.BINARY) return PRECEDENCE[node.value] ?? ATOM; + if (node.type === NODE.UNARY) return UNARY; + return ATOM; } -export function pushValue(solution: ISolution, value: string | number) { - if (!store.has(solution)) return; - const c = store.get(solution)!; - c.parts.push(value.toString()); +/** + * 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('-'); } -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; +/** + * 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; } -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 : '' - }; +/** + * 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(' '); } - } - // console.log(map); + case NODE.CALL: + return `${node.value}(${node.arguments!.map(stringify).join(', ')})`; - const solution: string[] = []; + case NODE.ASSIGNMENT: + return `${node.left!.value} = ${stringify(node.right!)}`; - 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); - } + default: + return node.value; } - - 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; } 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 e1f773b..5bbab1f 100644 --- a/src/functions/index.ts +++ b/src/functions/index.ts @@ -1,6 +1,11 @@ import initNumbers from './numbers'; import initLogarithms from './logarithms'; 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; @@ -9,7 +14,12 @@ export function addBuiltinFunctions(ctx: IContext) { const fns: Record = { ...initNumbers(), ...initLogarithms(), - ...initTrignometry(ctx.preferences) + ...initTrignometry(ctx.preferences), + ...initStatistics(), + ...initProbability(), + ...initSpecial(), + ...initFinance(), + ...initNumberTheory() }; for (const name in fns) { diff --git a/src/functions/logarithms.ts b/src/functions/logarithms.ts index 281f1f9..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: 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) + 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 e09452a..3f36b3d 100644 --- a/src/functions/numbers.ts +++ b/src/functions/numbers.ts @@ -1,3 +1,27 @@ +function gcd2(a: number, b: number): number { + return b ? gcd2(b, a % b) : Math.abs(a); +} + +// 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,12 +30,55 @@ 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), 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), - trunc: (x: number) => Math.trunc(x) + 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), + 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, + // `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), + 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/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/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/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/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/src/functions/trignometry.ts b/src/functions/trignometry.ts index 2586da8..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))), - hypot: (x: number, y: number) => Math.sqrt(x * x + y * y), + // 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.cos(val(x))) / 2 + 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/src/index.ts b/src/index.ts index 3f8291b..aa7411e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,20 +7,12 @@ 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, type IHTMLRenderResult } from './render/html'; export { renderTokensAsLaTeX, type ILaTeXRenderOptions } from './render/latex'; -export { - safeEvaluate, - safeParse, - safeSolve, - safeSolveBatch, - safeTokenize, - type ISafeResult -} from './safe'; +export { safe, type ISafeResult } from './error'; diff --git a/src/lexer/index.ts b/src/lexer/index.ts index 1a2d03e..b101c45 100644 --- a/src/lexer/index.ts +++ b/src/lexer/index.ts @@ -4,27 +4,13 @@ import { isDigit, isAlpha, isBinaryOperator, + isUnaryOperator, isWhitespace, TOKEN, type IToken, 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 */ @@ -33,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 @@ -90,15 +76,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}` @@ -126,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; @@ -143,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( @@ -187,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 ) { @@ -229,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}`, diff --git a/src/parser/index.ts b/src/parser/index.ts index b646881..153f20b 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(); @@ -158,7 +173,7 @@ export function parse(tokens: IToken[]): IParseTree { // multiplication and division function parseTerm() { - let node = parsePower(); + let node = parseUnary(); while ( !stream.isEOF && @@ -166,7 +181,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 +194,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, @@ -213,25 +250,10 @@ export function parse(tokens: IToken[]): IParseTree { // brackets if (matchType(TOKEN.LPAREN)) { const node = parseExpression(); - stream.advance(); + expect(TOKEN.RPAREN, SYMBOL.RPAREN); 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; @@ -242,13 +264,15 @@ 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)); + } - // skip ) - stream.advance(); + expect(TOKEN.RPAREN, SYMBOL.RPAREN); return { ...node, type: NODE.CALL, arguments: args }; } 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; } - `; -}; +`; diff --git a/src/render/latex.ts b/src/render/latex.ts index f441b7b..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,6 +38,104 @@ function formatTokenValue( return token.value; } +// 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|'], + ceil: ['\\left\\lceil ', '\\right\\rceil'], + floor: ['\\left\\lfloor ', '\\right\\rfloor'] +}; + +// 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 } { + 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); + + 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++; + } + + // `^` 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( tokens: IToken[], mode: ILaTeXRenderOptions['mode'] @@ -48,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]; @@ -58,57 +157,34 @@ 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; - } + const [open, close] = delimiters[token.value]; - if (token.value === 'abs') { - // Handle absolute value specially - result.push('\\left|'); - i += 2; // Skip function and opening paren + // skip the function and its opening paren + i += 2; - // Find matching closing paren - let parenCount = 1; - const absContent = []; + const group = collectGroup(tokens, i, mode); - while (i < tokens.length && parenCount > 0) { - if (tokens[i].type === TOKEN.LPAREN) parenCount++; - if (tokens[i].type === TOKEN.RPAREN) parenCount--; + result.push(open + group.content + close); + i = group.end; - if (parenCount > 0) { - absContent.push(formatTokenValue(tokens[i], mode)); - } - i++; - } + continue; + } - result.push(absContent.join('') + '\\right|'); - 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) @@ -117,6 +193,7 @@ function handleSpecialCases( if ( prevToken && nextToken && + atom === i - 1 && (prevToken.type === TOKEN.NUMBER || prevToken.type === TOKEN.IDENTIFIER) && (nextToken.type === TOKEN.NUMBER || @@ -132,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/src/safe.ts b/src/safe.ts deleted file mode 100644 index 2bc8cfd..0000000 --- a/src/safe.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { type IContext } from './context'; -import { safeExecutor } from './error'; -import { evaluate } from './evaluator'; -import { type ISolution } from './evaluator/solution'; -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, solution: ISolution) { - return safeExecutor(() => evaluate(ctx, node, solution)); -} - -/** - * 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/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/functions.test.ts b/tests/functions.test.ts new file mode 100644 index 0000000..ea9f786 --- /dev/null +++ b/tests/functions.test.ts @@ -0,0 +1,302 @@ +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) { + 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); + } +} + +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], + ['trunc(2.7)', 2], + ['roundToNearest(7, 5)', 5], + ['roundToNearest(8, 5)', 10], + ['precision(3.14159, 3)', 3.14], + ['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('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('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('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('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('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([ + ['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] + ]); + }); +}); diff --git a/tests/index.test.ts b/tests/index.test.ts index f545458..f3676a8 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); }); @@ -81,20 +92,21 @@ 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); 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() - // }); }); 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(); 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( diff --git a/tests/render.test.ts b/tests/render.test.ts index d417604..b90de11 100644 --- a/tests/render.test.ts +++ b/tests/render.test.ts @@ -10,6 +10,50 @@ 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}}' + ); + 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', () => { expect(ctx.renderAsLaTeX(expr, { mode: 'inline' })).toEqual( '$1+3 \\cdot \\text{sin}\\left(30\\right) \\\\ $' diff --git a/tests/safe.test.ts b/tests/safe.test.ts index ee3d3c6..fec81ec 100644 --- a/tests/safe.test.ts +++ b/tests/safe.test.ts @@ -1,10 +1,12 @@ 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'; +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; -let solution: ISolution; beforeEach(() => { ctx = createContext({ @@ -14,81 +16,43 @@ beforeEach(() => { angles: 'deg' } }); - solution = createSolutionStack(); }); -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], solution); - }); - - 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 = 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], solution); - 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 }); }); }); diff --git a/tests/solution.test.ts b/tests/solution.test.ts new file mode 100644 index 0000000..bc7e924 --- /dev/null +++ b/tests/solution.test.ts @@ -0,0 +1,95 @@ +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'); + }); +}); + +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 }); + }); +});