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 });
+ });
+});