From bbf3c19406c922b71ea5f321dcdada1f542778a6 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 3 Sep 2026 01:10:52 +0800 Subject: [PATCH 1/4] Fix animation state bugs and restructure the engine Three code paths each worked out "what should this element look like now" in their own way and disagreed with each other. Consolidate them into a single layer stack, then fix the issues the restructure did not cover. Bug fixes: - An element that entered while another was exiting under Presence got permanently stuck on its exit target, and every later animate update was ignored. mount() now clears the exit and gesture flags, since a MotionState can outlive its element and be mounted again. - An exit that resolved to no values (exit={{}}, or a variant key with no matching entry) left the element in the DOM forever. Both Presence and the mount effect wait on motioncomplete, which was never dispatched for an empty target. An exiting element now reports itself finished either way. - Hovering or pressing an element wiped out its inView styles, because inView had no entry in the active state. - onViewEnter handlers received the element instead of the IntersectionObserverEntry. Motion's inView callback is (element, entry) and the old code read the first argument as the entry; an `as any` cast had hidden the mismatch. - Changing variants while animate stayed on the same string key was stored but never applied. - Gestures were torn down and rebound on every unrelated update. The check compared prop objects by reference, and Solid re-evaluates inline JSX prop objects on every read, so it always reported a change. - Target comparison was key-order sensitive, so initial={{opacity, scale}} against animate={{scale, opacity}} triggered a redundant animation. - Two motioncomplete listeners were never removed; both now use {once: true}. - Every property access on the Motion proxy returned a component, including Motion.then, which made Motion look like a thenable and would hang anything awaiting it or resolving it as a lazily imported component. Refactor: - Add a LAYERS list ranking animate, inView, hover and press, and resolveActiveTarget() as the single place that merges the active layers. mount(), update(), setActive() and every gesture now go through it. - Move exit into its own flag, since it replaces the layer stack rather than merging on top of it. - Replace three near identical gesture blocks with one GESTURES table and a short loop. - update() now diffs against the target it last animated to, rather than against the previous animate prop. - Split engine.ts into three labelled sections. - Replace a stray queueMicrotask in Presence with onSettled, Solid 2.0's replacement for 1.x onMount. The flag it flips controls whether initial={false} still applies, and the microtask queue knows nothing about Solid's scheduler. The public API is unchanged. Tooling: - lint:code used a shell-expanded glob that matched no .js files in src, so it exited with an error every time it ran. - lint used & instead of &&, so lint failures were silently dropped. pnpm run lint now passes and reports zero problems. Tests: Four regression tests added, each confirmed to fail against the unfixed code: an element that entered during an exit still animates on later updates; an element is removed even when exit resolves to no values; initial: false only suppresses children present on the first render; and the Motion proxy is not a thenable. 25 client tests and 13 SSR tests pass. Prettier reports no issues. Co-Authored-By: Claude Opus 5 (1M context) --- package.json | 4 +- src/engine.ts | 277 +++++++++++++++++++++++++++-------------- src/motion.tsx | 14 ++- src/presence.tsx | 52 ++++++-- src/primitives.ts | 2 +- test/motion.test.tsx | 10 ++ test/presence.test.tsx | 94 ++++++++++++++ 7 files changed, 344 insertions(+), 109 deletions(-) diff --git a/package.json b/package.json index d2d94cb..bbcaf37 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "test:client": "jest --config jest/jest.config.cjs", "test:ssr": "SSR=true jest --config jest/jest.config.cjs", "format": "prettier --cache -w .", - "lint": "pnpm run lint:code & pnpm run lint:types", - "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 src/**/*.{js,ts,tsx,jsx}", + "lint": "pnpm run lint:code && pnpm run lint:types", + "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 --ext .js,.jsx,.ts,.tsx src", "lint:types": "tsc --noEmit", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" diff --git a/src/engine.ts b/src/engine.ts index 568e11f..fe99d7f 100644 --- a/src/engine.ts +++ b/src/engine.ts @@ -1,5 +1,4 @@ -import {animate} from "framer-motion/dom" -import {inView as motionInView} from "framer-motion/dom" +import {animate, inView} from "framer-motion/dom" import {hover, press, buildHTMLStyles} from "motion-dom" import type {AnimationOptions} from "motion-dom" @@ -19,6 +18,10 @@ export interface MotionState { getInitialVariantKey(): string | undefined } +/* -------------------------------------------------------------------------- */ +/* Targets and styles */ +/* -------------------------------------------------------------------------- */ + function resolveTarget( def: VariantDefinition | undefined, variants: Record | undefined, @@ -27,6 +30,28 @@ function resolveTarget( return typeof def === "string" ? variants?.[def] : def } +function targetValues(target: Target | undefined): Record { + if (!target) return {} + const {transition: _transition, ...values} = target + return values +} + +/* +Order-independent structural compare of two targets' animatable values. +`initial={{opacity: 0, x: 0}}` and `animate={{x: 0, opacity: 0}}` describe the +same thing, but a plain JSON.stringify of each would not agree — and this +comparison is what decides whether an animation runs at all. +*/ +function sameValues(a: Target | undefined, b: Target | undefined): boolean { + const a_values = targetValues(a) + const b_values = targetValues(b) + const keys = Object.keys(a_values) + if (keys.length !== Object.keys(b_values).length) return false + return keys.every( + key => key in b_values && JSON.stringify(a_values[key]) === JSON.stringify(b_values[key]), + ) +} + /* Two compatibility shims for the documented `transition={{duration, key: {...}}}` per-value override syntax: @@ -62,12 +87,6 @@ function normalizeTransition(transition: unknown): AnimationOptions | undefined return result as AnimationOptions } -function targetValues(target: Target | undefined): Record { - if (!target) return {} - const {transition: _transition, ...values} = target - return values -} - /** @internal */ export function createStyles(target: Target): Record { const renderState = {transform: {}, transformOrigin: {}, vars: {}, style: {}} @@ -97,6 +116,86 @@ function dispatch(el: Element, type: string, detail: Record): v el.dispatchEvent(new CustomEvent(type, {detail})) } +/* -------------------------------------------------------------------------- */ +/* Layers and gestures */ +/* -------------------------------------------------------------------------- */ + +/* +The animated target is the merge of every currently-active layer, lowest +priority first — `press` wins over `hover`, which wins over `inView`, which +wins over the always-active `animate`. Resolving through one ordered list +means mount, update and every gesture all compute the target the same way, +instead of each assembling its own idea of what the element should look like. +*/ +const LAYERS = ["animate", "inView", "hover", "press"] as const +type Layer = (typeof LAYERS)[number] +type GestureLayer = Exclude + +/* +`hover`, `press` and `inView` all share the same shape: bind to an element with +an `(element, event) => cleanup | void` handler, get an unbind back. That lets +all three be driven by one table instead of three near-identical blocks. +*/ +type GestureBinder = ( + el: Element, + onStart: (el: Element, event: any) => ((event: any) => void) | void, + options?: any, +) => () => void + +interface Gesture { + layer: GestureLayer + bind: GestureBinder + /** event dispatched when the layer switches on / off */ + enter: string + leave: string + detail: (event: any) => Record + /** per-gesture binding options pulled off the component's props, if any */ + bindOptions?: (options: Options) => unknown +} + +const GESTURES: Gesture[] = [ + { + layer: "inView", + bind: inView as GestureBinder, + enter: "viewenter", + leave: "viewleave", + detail: entry => ({originalEntry: entry}), + bindOptions: options => options.inViewOptions, + }, + { + layer: "hover", + bind: hover as GestureBinder, + enter: "hoverstart", + leave: "hoverend", + detail: event => ({originalEvent: event}), + }, + { + layer: "press", + bind: press as GestureBinder, + enter: "pressstart", + leave: "pressend", + detail: event => ({originalEvent: event}), + }, +] + +/* +Only rebind when a gesture is added or removed, not whenever its target object +changes identity — the bound handlers read the latest `options` at fire time, so +a new `hover={{...}}` object needs no rebind. Solid re-evaluates inline JSX prop +objects on every read, so comparing those by reference would rebind constantly +and cut off in-progress interactions. +*/ +function gesturesChanged(prev: Options, next: Options): boolean { + return ( + GESTURES.some(gesture => !!prev[gesture.layer] !== !!next[gesture.layer]) || + prev.inViewOptions !== next.inViewOptions + ) +} + +/* -------------------------------------------------------------------------- */ +/* State */ +/* -------------------------------------------------------------------------- */ + interface MountContext { element: Element cancelAnimation?: () => void @@ -106,7 +205,19 @@ interface MountContext { /** @internal */ export function createMotionState(initialOptions: Options, parent?: MotionState): MotionState { let options = initialOptions - const active = {hover: false, press: false, exit: false} + + /** which layers currently contribute to the target; `animate` is always on */ + const active: Record = { + animate: true, + inView: false, + hover: false, + press: false, + } + /** `exit` replaces the layer stack outright rather than merging on top of it */ + let exiting = false + + /** the target most recently animated to — the baseline `update()` diffs against */ + let lastTarget: Target | undefined /* Scoped to whichever mount() call is currently active. A sibling Motion @@ -126,6 +237,7 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) return undefined } + /** The style to render *before* anything animates — also what SSR paints. */ function getStartTarget(): Target { if (options.initial === false) { return resolveTarget(options.animate, options.variants) ?? {} @@ -146,20 +258,39 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) return resolveTarget(options.initial, options.variants) ?? {} } - function computeEffectiveTarget(): Target { - if (active.exit) return resolveTarget(options.exit, options.variants) ?? {} - const target: Target = {...(resolveTarget(options.animate, options.variants) ?? {})} - if (active.hover) Object.assign(target, resolveTarget(options.hover, options.variants)) - if (active.press) Object.assign(target, resolveTarget(options.press, options.variants)) + /** The single source of truth for what this element should look like right now. */ + function resolveActiveTarget(): Target { + if (exiting) return resolveTarget(options.exit, options.variants) ?? {} + const target: Target = {} + for (const layer of LAYERS) { + if (active[layer]) + Object.assign(target, resolveTarget(options[layer], options.variants)) + } return target } - function animateToTarget(target: Target): Promise { + function applyTarget(target: Target): Promise { + lastTarget = target + const ctx = current ctx?.cancelAnimation?.() if (!ctx) return Promise.resolve() const values = targetValues(target) - if (Object.keys(values).length === 0) return Promise.resolve() + if (Object.keys(values).length === 0) { + /* + Nothing to animate. An exit still has to report itself finished: both + presence.tsx and primitives.ts wait on the motionstart/motioncomplete + pair before removing the element, so an `exit` that resolves to no + values (`exit={{}}`, or a variant key with no matching entry) would + otherwise leave the element in the DOM forever. Deferred by a + microtask so listeners attached right after this call still catch it. + */ + if (!exiting) return Promise.resolve() + dispatch(ctx.element, "motionstart", {target}) + return Promise.resolve().then(() => { + if (current === ctx) dispatch(ctx.element, "motioncomplete", {target}) + }) + } // merge, then normalize once — normalizing an already-normalized base // transition again would re-merge its own per-value overrides against a @@ -178,55 +309,23 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) ) } + function setLayer(el: Element, gesture: Gesture, isActive: boolean, event: unknown): void { + active[gesture.layer] = isActive + dispatch(el, isActive ? gesture.enter : gesture.leave, gesture.detail(event)) + void applyTarget(resolveActiveTarget()) + } + function bindGestures(el: Element): () => void { - const unbinds: Array<() => void> = [] - if (options.hover) { - unbinds.push( - hover(el, (_el, startEvent) => { - active.hover = true - dispatch(el, "hoverstart", {originalEvent: startEvent}) - void animateToTarget(computeEffectiveTarget()) - return endEvent => { - active.hover = false - dispatch(el, "hoverend", {originalEvent: endEvent}) - void animateToTarget(computeEffectiveTarget()) - } - }), - ) - } - if (options.press) { - unbinds.push( - press(el, (_el, startEvent) => { - active.press = true - dispatch(el, "pressstart", {originalEvent: startEvent}) - void animateToTarget(computeEffectiveTarget()) - return endEvent => { - active.press = false - dispatch(el, "pressend", {originalEvent: endEvent}) - void animateToTarget(computeEffectiveTarget()) - } - }), - ) - } - if (options.inView) { - unbinds.push( - motionInView( - el, - (entry: any) => { - dispatch(el, "viewenter", {originalEntry: entry}) - void animateToTarget({ - ...(resolveTarget(options.animate, options.variants) ?? {}), - ...resolveTarget(options.inView, options.variants), - }) - return leaveEntry => { - dispatch(el, "viewleave", {originalEntry: leaveEntry}) - void animateToTarget(computeEffectiveTarget()) - } - }, - options.inViewOptions as any, - ), - ) - } + const unbinds = GESTURES.filter(gesture => options[gesture.layer]).map(gesture => + gesture.bind( + el, + (_el, startEvent) => { + setLayer(el, gesture, true, startEvent) + return endEvent => setLayer(el, gesture, false, endEvent) + }, + gesture.bindOptions?.(options), + ), + ) return () => unbinds.forEach(unbind => unbind()) } @@ -235,16 +334,23 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) const ctx: MountContext = {element: el} current = ctx + /* + A state object outlives its element: under a , a Motion can + be exit-animated and torn down, then mounted again by the very next + enter (see primitives.ts's mount-gating effect). Flags left over from + that previous life would otherwise keep resolving to a stale target — + a still-set `exiting` in particular pins the element to its exit + target and blocks every later `animate` update. + */ + exiting = false + active.inView = active.hover = active.press = false + const startTarget = getStartTarget() applyStylesDirect(el, startTarget) - const animateTarget = resolveTarget(options.animate, options.variants) ?? {} - if ( - JSON.stringify(targetValues(startTarget)) !== - JSON.stringify(targetValues(animateTarget)) - ) { - void animateToTarget(animateTarget) - } + const target = resolveActiveTarget() + lastTarget = target + if (!sameValues(startTarget, target)) void applyTarget(target) ctx.unbindGestures = bindGestures(el) mountedStates.set(el, state) @@ -258,33 +364,22 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) }, update(newOptions: Options) { const prevOptions = options - const prevAnimate = JSON.stringify( - resolveTarget(prevOptions.animate, prevOptions.variants) ?? {}, - ) options = newOptions - // only tear down and recreate gesture listeners when a gesture-related - // prop actually changed — not on every unrelated reactive update (e.g. - // a reactive `animate` value), which would cut off an in-progress - // hover/press/inView interaction for no reason - const gesturesChanged = - prevOptions.hover !== options.hover || - prevOptions.press !== options.press || - prevOptions.inView !== options.inView || - prevOptions.inViewOptions !== options.inViewOptions - if (gesturesChanged && current) { + if (current && gesturesChanged(prevOptions, options)) { current.unbindGestures?.() current.unbindGestures = bindGestures(current.element) } - const nextAnimate = resolveTarget(options.animate, options.variants) ?? {} - if (!active.exit && prevAnimate !== JSON.stringify(nextAnimate)) { - void animateToTarget(computeEffectiveTarget()) - } + // an exiting element is on its way out — leave it on its exit target + if (exiting) return + + const target = resolveActiveTarget() + if (!sameValues(target, lastTarget)) void applyTarget(target) }, - setActive(type: "exit", isActive: boolean) { - active[type] = isActive - return animateToTarget(computeEffectiveTarget()) + setActive(_type: "exit", isActive: boolean) { + exiting = isActive + return applyTarget(resolveActiveTarget()) }, getTarget: getStartTarget, getOptions: () => options, diff --git a/src/motion.tsx b/src/motion.tsx index ff5787b..debbfa7 100644 --- a/src/motion.tsx +++ b/src/motion.tsx @@ -94,7 +94,15 @@ export const MotionComponent = ( * ``` */ export const Motion = new Proxy(MotionComponent, { - get: - (_, tag: string): MotionProxyComponent => - props => , + /* + Only keys the component function doesn't already answer to are treated as tag + names. Without that fallback every access returns a component — including + `Motion.then`, which makes `Motion` look like a thenable and hangs anything + that awaits it or resolves it as a lazily-imported component. `then` is + excluded explicitly because it isn't a property of `Function.prototype`. + */ + get: (target, key, receiver) => + typeof key === "string" && key !== "then" && !Reflect.has(target, key) + ? ((props => ) as MotionProxyComponent) + : Reflect.get(target, key, receiver), }) as MotionProxy diff --git a/src/presence.tsx b/src/presence.tsx index 7ab6f51..0d58856 100644 --- a/src/presence.tsx +++ b/src/presence.tsx @@ -1,7 +1,14 @@ import {mountedStates} from "./engine.js" import {resolveFirst} from "@solid-primitives/refs" import {createSwitchTransition} from "@solid-primitives/transition-group" -import {createContext, createSignal, flush, type FlowComponent, type Accessor} from "solid-js" +import { + createContext, + createSignal, + flush, + onSettled, + type FlowComponent, + type Accessor, +} from "solid-js" import type {JSX} from "@solidjs/web" export type PresenceContextState = { @@ -60,16 +67,20 @@ export const Presence: FlowComponent<{ setMount(false) flush() mountedStates.get(el)?.getOptions().exit - ? el.addEventListener("motioncomplete", () => { - /* - `done` (transition-group's own callback) writes the - signal that actually removes this element from the - rendered list — also outside Solid's scheduler, so it - needs its own flush to take effect before callers see it. - */ - done() - flush() - }) + ? el.addEventListener( + "motioncomplete", + () => { + /* + `done` (transition-group's own callback) writes the + signal that actually removes this element from the + rendered list — also outside Solid's scheduler, so it + needs its own flush to take effect before callers see it. + */ + done() + flush() + }, + {once: true}, + ) : done() }, onEnter(_, done) { @@ -83,6 +94,23 @@ export const Presence: FlowComponent<{ ) - queueMicrotask(() => (state.initial = true)) + /* + `initial={false}` only suppresses the enter animation of the children present + on the *first* render; anything added later animates in normally. That means + flipping the flag once the first render is done, which is exactly what + `onSettled` (Solid 2.0's replacement for 1.x `onMount`) schedules: the next + point at which the current reactive activity has settled. A bare + `queueMicrotask` only approximates that by piggybacking on the JS microtask + queue, which knows nothing about Solid's scheduler and fires whether or not + the render it is waiting on has actually finished. + + `state.initial` is deliberately a plain field rather than a signal — children + read it once, untracked, while constructing their own MotionState, and it + must never re-run anything when it flips. + */ + onSettled(() => { + state.initial = true + }) + return render } diff --git a/src/primitives.ts b/src/primitives.ts index 61b4a4a..ae90c87 100644 --- a/src/primitives.ts +++ b/src/primitives.ts @@ -67,7 +67,7 @@ export function createAndBindMotionState( return () => { if (presence_state && options().exit) { state.setActive("exit", true) - el_ref.addEventListener("motioncomplete", unmount) + el_ref.addEventListener("motioncomplete", unmount, {once: true}) } else unmount() } }, diff --git a/test/motion.test.tsx b/test/motion.test.tsx index 8bfc553..c20ffe9 100644 --- a/test/motion.test.tsx +++ b/test/motion.test.tsx @@ -144,4 +144,14 @@ describe("Motion", () => { fireEvent.pointerEnter(element) expect(captured).toEqual([0]) }) + + test("Proxy does not turn Motion into a thenable", () => { + /* + Every unknown key resolves to a component; `then` must not, or awaiting + Motion (or lazily importing it) hangs on a fake thenable. + */ + expect((Motion as any).then).toBeUndefined() + expect(typeof Motion.name).toBe("string") + expect(typeof (Motion as any).div).toBe("function") + }) }) diff --git a/test/presence.test.tsx b/test/presence.test.tsx index b9d434f..00f3848 100644 --- a/test/presence.test.tsx +++ b/test/presence.test.tsx @@ -176,4 +176,98 @@ describe("Presence", () => { expect(ref_1.style.opacity).toBe("0") expect(ref_2.style.opacity).toBe("1") }) + + test("Removes the element even when exit resolves to no values", async () => { + const [show, setShow] = createSignal(true) + + const {container} = render(() => ( + + + {/* a variant key with no matching entry — resolves to an empty target */} + + + + )) + flush() + + const component = await screen.findByTestId("child") + expect(component.isConnected).toBeTruthy() + + setShow(false) + flush() + + await new Promise(resolve => setTimeout(resolve, 50)) + + expect(component.isConnected).toBeFalsy() + expect(container.innerHTML).toBe("") + expect(mountedStates.has(component)).toBeFalsy() + }) + + test("An element that entered during an exit still animates on later updates", async () => { + const [condition, setCondition] = createSignal(1) + const [opacity, setOpacity] = createSignal(0.5) + + const {container} = render(() => ( + + + {key => ( + + )} + + + )) + flush() + await new Promise(resolve => setTimeout(resolve, 50)) + + /* + In the default "parallel" mode the incoming element is briefly torn down + and remounted as the outgoing one exits. Its exit flag has to be cleared + by that remount, or every later `animate` update resolves to the exit + target instead. + */ + setCondition(2) + flush() + await new Promise(resolve => setTimeout(resolve, 50)) + + const component = container.querySelector('[data-testid="child-2"]')! + expect(component.style.opacity).toBe("0.5") + + setOpacity(0.9) + flush() + await new Promise(resolve => setTimeout(resolve, 50)) + + expect(component.style.opacity).toBe("0.9") + }) + + test("initial: false only suppresses children present on the first render", async () => { + const [show, setShow] = createSignal(false) + + const {container} = render(() => ( + + + + + + )) + flush() + await new Promise(resolve => setTimeout(resolve, 20)) + + setShow(true) + flush() + + // a child added after the first render animates in normally, so it starts + // at its `initial` rather than jumping straight to `animate` + const component = container.querySelector('[data-testid="late"]')! + expect(component.style.opacity).toBe("0") + }) }) From 8647c24af074d42ea2a6a96c4d17e0044d8f3c59 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 3 Sep 2026 01:45:31 +0800 Subject: [PATCH 2/4] Migrate tests to Vitest and Playwright, drop Jest and Storybook Jest needed two babel transformers, a custom resolver to get past @solid-primitives' ESM-only exports, and an SSR=true environment variable to pick between two config objects. Vitest runs the client and server projects together off one config with no custom resolver, and Playwright replaces Storybook as the browser-driven layer. Vitest: - vitest.config.ts defines a jsdom "client" project and a node "ssr" project, so pnpm test covers both compilation targets in one pass. - Coverage via @vitest/coverage-v8, with thresholds set just under the current numbers: 96% statements, 94% branches, 94% functions, 96% lines. - Adds test/engine.test.tsx, covering createStyles, normalizeTransition and createMotionState directly. normalizeTransition is now exported as @internal so the Motion One compatibility shim can be checked on its own. - Adds createMotion and useScroll cases to the primitives tests. Vitest resolves Solid's development build, which Jest did not, so its strict-mode checks now apply. Two existing tests wrote to signals from inside an owned scope and are restructured to write from outside it, and one built its element in a bare createRoot; jsdom 30 throws when Motion reads computed style off a node with no owner document, so it now renders into the document like the others. Playwright: - playground/ replaces stories/: a small Vite app serving one demo per ?demo= route, with an index page. It is what pnpm dev now runs. - e2e/ drives it across Chromium, Firefox and WebKit, covering what jsdom cannot reach: real Web Animations interpolation, real IntersectionObserver for inView, real pointer input for hover and press, and real scrolling for useScroll. - Assertions wait for an animation to settle rather than sleeping for a fixed duration, which was flaky across the three engines. - CI gains an end-to-end job that installs the browsers and uploads the report. Two known gaps are recorded as test.fail() expectations so they report as soon as they are fixed: - initial on an SVG element is applied as an inline style by createStyles, which builds it with buildHTMLStyles, while Motion animates SVG geometry through attributes. The inline style outranks the attribute and the element never moves. - With no animate prop, the target resolved when a gesture ends is empty, and an empty target is a no-op, so the element stays on the gesture's values instead of reverting. Also switches from vite-plugin-solid to @solidjs/vite-plugin; the former is now a stub that only re-exports the latter. Co-Authored-By: Claude Opus 5 (1M context) --- .eslintrc | 8 +- .github/workflows/test.yml | 30 + .gitignore | 4 +- .prettierignore | 3 + .storybook/main.ts | 6 - .storybook/preview.tsx | 7 - README.md | 17 +- e2e/animate.spec.ts | 126 + e2e/gestures.spec.ts | 171 + e2e/helpers.ts | 45 + e2e/presence.spec.ts | 99 + e2e/rendering.spec.ts | 51 + e2e/tsconfig.json | 7 + jest/jest.config.cjs | 57 - jest/resolver.cjs | 33 - jest/transform-client.cjs | 9 - jest/transform-ssr.cjs | 15 - package.json | 32 +- playground/index.html | 40 + playground/src/demos.tsx | 595 +++ playground/src/main.tsx | 39 + {stories => playground}/tsconfig.json | 3 +- playground/vite.config.ts | 15 + playwright.config.ts | 38 + pnpm-lock.yaml | 5127 +++++-------------------- src/engine.ts | 3 +- stories/Animate.stories.tsx | 81 - stories/Gestures.stories.tsx | 87 - stories/InView.stories.tsx | 71 - stories/Motion.stories.tsx | 86 - stories/Presence.stories.tsx | 216 -- stories/Primitives.stories.tsx | 91 - stories/Transition.stories.tsx | 70 - stories/Variants.stories.tsx | 91 - test/engine.test.tsx | 234 ++ test/motion.test.tsx | 47 +- test/primitives.test.tsx | 98 +- test/setup.js | 16 - test/setup.ts | 26 + test/ssr.test.tsx | 5 - test/tsconfig.json | 2 +- tsconfig.node.json | 2 +- vitest.config.ts | 67 + 43 files changed, 2608 insertions(+), 5262 deletions(-) delete mode 100644 .storybook/main.ts delete mode 100644 .storybook/preview.tsx create mode 100644 e2e/animate.spec.ts create mode 100644 e2e/gestures.spec.ts create mode 100644 e2e/helpers.ts create mode 100644 e2e/presence.spec.ts create mode 100644 e2e/rendering.spec.ts create mode 100644 e2e/tsconfig.json delete mode 100644 jest/jest.config.cjs delete mode 100644 jest/resolver.cjs delete mode 100644 jest/transform-client.cjs delete mode 100644 jest/transform-ssr.cjs create mode 100644 playground/index.html create mode 100644 playground/src/demos.tsx create mode 100644 playground/src/main.tsx rename {stories => playground}/tsconfig.json (66%) create mode 100644 playground/vite.config.ts create mode 100644 playwright.config.ts delete mode 100644 stories/Animate.stories.tsx delete mode 100644 stories/Gestures.stories.tsx delete mode 100644 stories/InView.stories.tsx delete mode 100644 stories/Motion.stories.tsx delete mode 100644 stories/Presence.stories.tsx delete mode 100644 stories/Primitives.stories.tsx delete mode 100644 stories/Transition.stories.tsx delete mode 100644 stories/Variants.stories.tsx create mode 100644 test/engine.test.tsx delete mode 100644 test/setup.js create mode 100644 test/setup.ts create mode 100644 vitest.config.ts diff --git a/.eslintrc b/.eslintrc index afc7936..fb99f30 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,7 +4,13 @@ "plugins": ["@typescript-eslint", "no-only-tests", "eslint-comments"], "ignorePatterns": ["node_modules", "dist"], "parserOptions": { - "project": ["./tsconfig.json", "./tsconfig.node.json", "./test/tsconfig.json"], + "project": [ + "./tsconfig.json", + "./tsconfig.node.json", + "./test/tsconfig.json", + "./e2e/tsconfig.json", + "./playground/tsconfig.json" + ], "tsconfigRootDir": ".", "sourceType": "module" }, diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 45e50d8..7c48fe4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,3 +34,33 @@ jobs: - name: Lint run: pnpm lint + + e2e: + name: End-to-end + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile --ignore-scripts + + - name: Install Playwright browsers + run: pnpm exec playwright install --with-deps chromium firefox webkit + + - name: Run Playwright tests + run: pnpm run test:e2e + + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index 36b6469..c27beed 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ dist node_modules -storybook-static +test-results +playwright-report +coverage diff --git a/.prettierignore b/.prettierignore index c4cbfff..d34c7b0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,6 @@ dist node_modules pnpm-lock.yaml +test-results +playwright-report +coverage diff --git a/.storybook/main.ts b/.storybook/main.ts deleted file mode 100644 index 6920050..0000000 --- a/.storybook/main.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type {StorybookConfig} from "storybook-solidjs-vite" - -export default { - stories: ["../stories/**/*.stories.@(ts|tsx)"], - framework: "storybook-solidjs-vite", -} satisfies StorybookConfig diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx deleted file mode 100644 index 4b1c9d5..0000000 --- a/.storybook/preview.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import type {Preview} from "storybook-solidjs-vite" - -export default { - parameters: { - controls: {expanded: true}, - }, -} satisfies Preview diff --git a/README.md b/README.md index 9571c22..dd7fbe9 100644 --- a/README.md +++ b/README.md @@ -323,7 +323,6 @@ For cases where you don't want to render a `` component — e.g. animati ```tsx import {motion} from "solid-motion" - ;
({ initial: {opacity: 0}, @@ -391,9 +390,21 @@ The following types are exported for typing your own components and helpers: ## Examples -Every feature documented above has a live, interactive example in this repo's Storybook. Run it locally with: +Every feature documented above has a live example in this repo's playground. Run it locally with: ```bash pnpm install -pnpm run storybook +pnpm run dev ``` + +That serves an index of every demo; each one is also reachable directly at `?demo=`. The playground doubles as the app the Playwright suite drives, so the demos are kept working by the tests rather than by hand. + +## Testing + +```bash +pnpm test # Vitest: the state machine, in jsdom and in SSR +pnpm run test:coverage +pnpm run test:e2e # Playwright: real browsers, across Chromium, Firefox and WebKit +``` + +Vitest covers the engine's own logic. Playwright covers everything jsdom cannot reach: real animation interpolation through the Web Animations API, real `IntersectionObserver` for `inView`, real pointer input for `hover`/`press`, and real scrolling for `useScroll`. diff --git a/e2e/animate.spec.ts b/e2e/animate.spec.ts new file mode 100644 index 0000000..54375a3 --- /dev/null +++ b/e2e/animate.spec.ts @@ -0,0 +1,126 @@ +import {expect, test} from "@playwright/test" +import {computed, opacity, openDemo, settled, translateX} from "./helpers.js" + +test.describe("animate", () => { + test("animates from initial to the animate target", async ({page}) => { + await openDemo(page, "basic-enter") + + const box = page.getByTestId("box") + // starts at the initial target rather than jumping to animate + expect(await opacity(box)).toBeLessThan(1) + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + test("initial={false} applies the animate target with no transition", async ({page}) => { + await openDemo(page, "initial-false") + + // the demo's transition is 5s, so anything but an instant apply is visible + const box = page.getByTestId("box") + expect(await opacity(box)).toBeCloseTo(0.4, 1) + expect(await computed(box, "transform")).toContain("100") + }) + + test("no animation runs when initial already equals animate", async ({page}) => { + await openDemo(page, "no-op-when-equal") + + await page.waitForTimeout(300) + await expect(page.getByTestId("starts")).toHaveText("0") + expect(await opacity(page.getByTestId("box"))).toBeCloseTo(0.6, 1) + }) + + test("a reactive animate target re-triggers the animation", async ({page}) => { + await openDemo(page, "reactive-animate") + + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(0.25, 1) + + await page.getByTestId("toggle").click() + expect(Number(await settled(box))).toBeCloseTo(1, 1) + + await page.getByTestId("toggle").click() + expect(Number(await settled(box))).toBeCloseTo(0.25, 1) + }) +}) + +test.describe("transitions", () => { + test("Motion One's `easing` spelling is accepted", async ({page}) => { + await openDemo(page, "legacy-easing") + + // an unrecognised easing would throw or snap; this should interpolate + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + /* + The per-value override sets only `duration`, so it has to inherit the rest + of the base transition. `x` runs 1.5s against the base 0.2s, so opacity + must finish well before x does. + */ + test("a per-value override inherits the base transition", async ({page}) => { + await openDemo(page, "per-value-override") + + const box = page.getByTestId("box") + await expect.poll(() => opacity(box)).toBeGreaterThan(0.95) + + const x = await computed(box, "transform") + expect(x).not.toContain("120") + + await expect.poll(() => computed(box, "transform"), {timeout: 4000}).toContain("120") + }) + + test("a target's own transition overrides the component transition", async ({page}) => { + await openDemo(page, "per-target-override") + + // base duration is 0.05s, the target's own is 1.5s: still mid-flight here + await page.waitForTimeout(300) + expect(await opacity(page.getByTestId("box"))).toBeLessThan(0.95) + expect(Number(await settled(page.getByTestId("box")))).toBeCloseTo(1, 1) + }) + + test("keyframe arrays step through every value", async ({page}) => { + await openDemo(page, "keyframes") + + const box = page.getByTestId("box") + const seen = new Set() + for (let i = 0; i < 25; i++) { + seen.add(await computed(box, "transform")) + await page.waitForTimeout(20) + } + // a single jump to the end would give one or two distinct values + expect(seen.size).toBeGreaterThan(3) + await expect.poll(() => computed(box, "transform")).toContain("40") + }) +}) + +test.describe("variants", () => { + test("string keys resolve against the variants map", async ({page}) => { + await openDemo(page, "variants") + + expect(Number(await settled(page.getByTestId("box")))).toBeCloseTo(1, 1) + }) + + test("a descendant inherits the ancestor's initial variant key", async ({page}) => { + await openDemo(page, "variant-inheritance") + + /* + The child sets no `initial` of its own, so it inherits the key "hidden" + from its parent and resolves it against its own variants map, starting + translated by 60px rather than at rest. + */ + const child = page.getByTestId("child") + expect(await translateX(child)).toBeGreaterThan(40) + + await settled(child, "transform") + expect(await translateX(child)).toBeCloseTo(0, 1) + }) + + test("swapping the variants map re-animates an unchanged key", async ({page}) => { + await openDemo(page, "reactive-variants") + + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(0.3, 1) + + await page.getByTestId("swap").click() + expect(Number(await settled(box))).toBeCloseTo(0.9, 1) + }) +}) diff --git a/e2e/gestures.spec.ts b/e2e/gestures.spec.ts new file mode 100644 index 0000000..61bf8ca --- /dev/null +++ b/e2e/gestures.spec.ts @@ -0,0 +1,171 @@ +import {expect, test} from "@playwright/test" +import {opacity, openDemo, settled, translateX} from "./helpers.js" + +test.describe("gestures", () => { + test("hover animates in and back out", async ({page}) => { + await openDemo(page, "hover") + + const box = page.getByTestId("box") + await expect(page.getByTestId("hover")).toHaveText("idle") + + await box.hover() + await expect(page.getByTestId("hover")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.4, 1) + + await page.mouse.move(0, 0) + await expect(page.getByTestId("hover")).toHaveText("idle") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + test("press animates in and back out", async ({page}) => { + await openDemo(page, "press") + + const box = page.getByTestId("box") + await box.hover() + await page.mouse.down() + + await expect(page.getByTestId("press")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.3, 1) + + await page.mouse.up() + await expect(page.getByTestId("press")).toHaveText("idle") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + test("press layers on top of hover and reverts to it on release", async ({page}) => { + await openDemo(page, "hover-and-press") + + const box = page.getByTestId("box") + await box.hover() + await expect(page.getByTestId("hover")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.7, 1) + + await page.mouse.down() + await expect(page.getByTestId("press")).toHaveText("active") + // press wins over hover for the shared key + expect(Number(await settled(box))).toBeCloseTo(0.2, 1) + + await page.mouse.up() + // still hovering, so it falls back to the hover target rather than base + await expect(page.getByTestId("press")).toHaveText("idle") + await expect(page.getByTestId("hover")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.7, 1) + }) + + /* + Known gap, kept as a failing expectation so it reports as soon as it is + fixed: with no `animate` prop the target resolved on hover-out is empty, + and an empty target is a no-op, so the element stays on the hover values + instead of reverting. Reverting would need the engine to remember the + pre-gesture base style. + */ + test.fail("a gesture with no animate base reverts on leave", async ({page}) => { + await openDemo(page, "hover-no-base") + + const box = page.getByTestId("box") + await box.hover() + expect(Number(await settled(box))).toBeCloseTo(0.4, 1) + + await page.mouse.move(0, 0) + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) +}) + +test.describe("inView", () => { + test("entering the viewport triggers the inView target", async ({page}) => { + await openDemo(page, "in-view") + + const box = page.getByTestId("box") + await expect(page.getByTestId("view")).toHaveText("not yet") + + await box.scrollIntoViewIfNeeded() + await expect(page.getByTestId("view")).toHaveText("entered") + expect(Number(await settled(box))).toBeCloseTo(0.2, 1) + }) + + /* + Motion's `inView` hands its callback `(element, entry)`. Reading the first + argument as the entry would put the element into `originalEntry`, and this + assertion would see "undefined" instead of a boolean. + */ + test("onViewEnter receives the IntersectionObserverEntry", async ({page}) => { + await openDemo(page, "in-view") + + await page.getByTestId("box").scrollIntoViewIfNeeded() + await expect(page.getByTestId("entry")).toHaveText("true") + }) + + test("leaving the viewport reverses the inView target", async ({page}) => { + await openDemo(page, "in-view") + + const box = page.getByTestId("box") + await box.scrollIntoViewIfNeeded() + await expect(page.getByTestId("view")).toHaveText("entered") + + await page.evaluate(() => window.scrollTo(0, 0)) + await expect(page.getByTestId("view")).toHaveText("left") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + /* + inView is a layer under hover, so hovering must not discard its values. + Before inView had its own active flag, the recompute triggered by the + hover dropped the inView target entirely. + */ + test("hovering does not discard the inView target", async ({page}) => { + await openDemo(page, "in-view-with-hover") + + const box = page.getByTestId("box") + await box.scrollIntoViewIfNeeded() + await settled(box, "transform") + expect(await translateX(box)).toBeCloseTo(120, 0) + + await box.hover() + expect(Number(await settled(box))).toBeCloseTo(0.5, 1) + // the inView translation is still applied underneath the hover + expect(await translateX(box)).toBeCloseTo(120, 0) + }) + + test("inViewOptions.amount holds the trigger until enough is visible", async ({page}) => { + await openDemo(page, "in-view-amount") + + // scroll just far enough to reveal the top sliver of the tall box + await page.evaluate(() => { + const el = document.querySelector('[data-testid="box"]')! + window.scrollTo( + 0, + el.getBoundingClientRect().top + window.scrollY - window.innerHeight + 40, + ) + }) + await page.waitForTimeout(300) + await expect(page.getByTestId("view")).toHaveText("not yet") + + await page.getByTestId("box").scrollIntoViewIfNeeded() + await expect(page.getByTestId("view")).toHaveText("entered") + await expect.poll(() => opacity(page.getByTestId("box"))).toBeLessThan(1) + }) +}) + +test.describe("useScroll", () => { + test("reports scroll progress reactively", async ({page}) => { + await openDemo(page, "use-scroll") + + await expect(page.getByTestId("progress")).toHaveText("0.00") + + await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight)) + await expect.poll(() => page.getByTestId("progress").textContent()).toBe("1.00") + + await page.evaluate(() => window.scrollTo(0, 0)) + await expect.poll(() => page.getByTestId("progress").textContent()).toBe("0.00") + }) +}) + +test.describe("primitives", () => { + test("the motion ref factory animates a plain element", async ({page}) => { + await openDemo(page, "ref-factory") + + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + expect(await translateX(box)).toBeCloseTo(0, 1) + }) +}) diff --git a/e2e/helpers.ts b/e2e/helpers.ts new file mode 100644 index 0000000..101b21d --- /dev/null +++ b/e2e/helpers.ts @@ -0,0 +1,45 @@ +import {expect, type Locator, type Page} from "@playwright/test" + +/** Navigates to one playground demo. */ +export async function openDemo(page: Page, id: string): Promise { + await page.goto(`/?demo=${id}`) + await expect(page.getByTestId("unknown-demo")).toHaveCount(0) +} + +/** + * Reads a resolved style value off an element. Unlike the inline `style` + * attribute the unit tests assert on, this is what the browser actually + * computed, so it reflects a running animation. + */ +export function computed(locator: Locator, property: string): Promise { + return locator.evaluate((el, prop) => getComputedStyle(el).getPropertyValue(prop), property) +} + +/** Resolved opacity as a number, for range assertions during an animation. */ +export async function opacity(locator: Locator): Promise { + return Number(await computed(locator, "opacity")) +} + +/** + * Waits until an element's computed property stops changing, i.e. its + * animation has settled. Avoids sleeping for a fixed duration, which is + * flaky across the three browser engines. + */ +export async function settled(locator: Locator, property = "opacity"): Promise { + let previous = await computed(locator, property) + for (let i = 0; i < 60; i++) { + await locator.page().waitForTimeout(50) + const next = await computed(locator, property) + if (next === previous) return next + previous = next + } + throw new Error(`"${property}" never settled (last value ${previous})`) +} + +/** The horizontal translation of an element's computed transform, in pixels. */ +export async function translateX(locator: Locator): Promise { + const transform = await computed(locator, "transform") + if (transform === "none") return 0 + const values = transform.match(/matrix\(([^)]+)\)/)?.[1]?.split(",") + return Number(values?.[4] ?? 0) +} diff --git a/e2e/presence.spec.ts b/e2e/presence.spec.ts new file mode 100644 index 0000000..11228bd --- /dev/null +++ b/e2e/presence.spec.ts @@ -0,0 +1,99 @@ +import {expect, test} from "@playwright/test" +import {opacity, openDemo, settled} from "./helpers.js" + +test.describe("Presence", () => { + test("an element animates out before it is removed", async ({page}) => { + await openDemo(page, "presence-basic") + + const box = page.getByTestId("box") + await expect(box).toBeVisible() + + await page.getByTestId("toggle").click() + // still in the DOM while the exit animation runs + await expect(box).toBeAttached() + expect(await opacity(box)).toBeLessThan(1) + + await expect(box).toHaveCount(0) + }) + + /* + `exit="missing"` resolves to no values at all. The element still has to be + removed: the exit has to report itself finished even when there is nothing + to animate, or Presence waits forever. + */ + test("an exit that resolves to no values still removes the element", async ({page}) => { + await openDemo(page, "presence-empty-exit") + + await expect(page.getByTestId("box")).toBeVisible() + await page.getByTestId("toggle").click() + await expect(page.getByTestId("box")).toHaveCount(0) + }) + + test("exitBeforeEnter holds the incoming element until the outgoing one leaves", async ({ + page, + }) => { + await openDemo(page, "presence-exit-before-enter") + + await expect(page.getByTestId("box-a")).toBeVisible() + + await page.getByTestId("toggle").click() + // b must not appear while a is still exiting + await expect(page.getByTestId("box-a")).toBeAttached() + await expect(page.getByTestId("box-b")).toHaveCount(0) + + await expect(page.getByTestId("box-a")).toHaveCount(0) + await expect(page.getByTestId("box-b")).toBeVisible() + + // and back again + await page.getByTestId("toggle").click() + await expect(page.getByTestId("box-b")).toHaveCount(0) + await expect(page.getByTestId("box-a")).toBeVisible() + }) + + /* + In the default parallel mode the incoming element is torn down and + remounted while the outgoing one exits. If its exit flag survives that + remount it stays pinned to the exit target and ignores every later update. + */ + test("an element that entered during an exit still animates afterwards", async ({page}) => { + await openDemo(page, "presence-parallel-swap") + + expect(Number(await settled(page.getByTestId("box-1")))).toBeCloseTo(0.5, 1) + + await page.getByTestId("swap").click() + const second = page.getByTestId("box-2") + await expect(second).toBeVisible() + await expect(page.getByTestId("box-1")).toHaveCount(0) + expect(Number(await settled(second))).toBeCloseTo(0.5, 1) + + await page.getByTestId("fade").click() + expect(Number(await settled(second))).toBeCloseTo(0.9, 1) + }) + + test("every nested descendant runs its own exit before the subtree goes", async ({page}) => { + await openDemo(page, "presence-nested-exit") + + await expect(page.getByTestId("parent")).toBeVisible() + await expect(page.getByTestId("child")).toBeVisible() + + await page.getByTestId("toggle").click() + // both are still attached and both are fading + await expect(page.getByTestId("parent")).toBeAttached() + await expect.poll(() => opacity(page.getByTestId("child"))).toBeLessThan(1) + await expect.poll(() => opacity(page.getByTestId("parent"))).toBeLessThan(1) + + await expect(page.getByTestId("parent")).toHaveCount(0) + await expect(page.getByTestId("child")).toHaveCount(0) + }) + + test("initial={false} suppresses only the first render's children", async ({page}) => { + await openDemo(page, "presence-initial-false") + + // present on the first render: jumps straight to animate despite a 5s transition + expect(await opacity(page.getByTestId("first"))).toBeCloseTo(1, 1) + + await page.getByTestId("toggle").click() + // added later: animates in normally, so it starts from its initial + expect(await opacity(page.getByTestId("late"))).toBeLessThan(0.5) + }) +}) diff --git a/e2e/rendering.spec.ts b/e2e/rendering.spec.ts new file mode 100644 index 0000000..547b306 --- /dev/null +++ b/e2e/rendering.spec.ts @@ -0,0 +1,51 @@ +import {expect, test} from "@playwright/test" +import {computed, openDemo, settled} from "./helpers.js" + +test.describe("rendering", () => { + test("the proxy and the tag prop both pick the rendered element", async ({page}) => { + await openDemo(page, "proxy-tags") + + await expect(page.getByTestId("span")).toHaveJSProperty("tagName", "SPAN") + await expect(page.getByTestId("button")).toHaveJSProperty("tagName", "BUTTON") + await expect(page.getByTestId("li")).toHaveJSProperty("tagName", "LI") + await expect(page.getByTestId("default")).toHaveJSProperty("tagName", "DIV") + }) + + test("svg elements render and keep their attributes", async ({page}) => { + await openDemo(page, "proxy-tags") + + const circle = page.getByTestId("circle") + await expect(circle).toHaveAttribute("r", "28") + await expect(circle).toHaveAttribute("fill", "darkorange") + }) + + /* + Known bug, kept as a failing expectation so it reports as soon as it is + fixed: `createStyles` builds the `initial` target with motion-dom's + `buildHTMLStyles` and applies it as an inline style, but Motion animates + SVG geometry via attributes. The inline `height: 20px` therefore outranks + the animated `height` attribute in the cascade and the rect never moves. + Fixing it means branching `createStyles` onto `buildSVGAttrs` for SVG + elements. + */ + test.fail("animated svg geometry interpolates", async ({page}) => { + await openDemo(page, "svg-attrs") + + const rect = page.getByTestId("rect") + await expect + .poll(() => rect.evaluate(el => (el as SVGGraphicsElement).getBBox().height)) + .toBeGreaterThan(70) + }) + + test("a user style is merged with the animated one, not replaced", async ({page}) => { + await openDemo(page, "style-merging") + + for (const id of ["object-style", "string-style"]) { + const el = page.getByTestId(id) + // the user's own declarations survive + expect(await computed(el, "width")).toBe("80px") + // and the animated value still lands + expect(Number(await settled(el))).toBeCloseTo(1, 1) + } + }) +}) diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..92cb2b0 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "types": ["node"] + } +} diff --git a/jest/jest.config.cjs b/jest/jest.config.cjs deleted file mode 100644 index fd9419a..0000000 --- a/jest/jest.config.cjs +++ /dev/null @@ -1,57 +0,0 @@ -const transform_client_path = require.resolve("./transform-client.cjs") -const transform_ssr_path = require.resolve("./transform-ssr.cjs") -const resolver_path = require.resolve("./resolver.cjs") - -/** @type {import('@jest/types').Config.InitialOptions} */ -const common_config = { - rootDir: "../", - globals: {"ts-jest": {useESM: true}}, - transformIgnorePatterns: ["node_modules/(?!solid-js.*|.*(?<=.[tj]sx))$"], - /* handles @solid-primitives/* ESM-only next-tag resolution, see resolver.cjs */ - resolver: resolver_path, - /* - to support NodeNext module imports - https://stackoverflow.com/questions/73735202/typescript-jest-imports-with-js-extension-cause-error-cannot-find-module - */ - moduleNameMapper: { - "(.+)\\.js": "$1", - "(.+)\\.jsx": "$1", - }, - extensionsToTreatAsEsm: [".ts", ".tsx"], -} - -/** @type {import('@jest/types').Config.InitialOptions} */ -const client_config = { - ...common_config, - testEnvironment: "jsdom", - testMatch: ["/test/**/*.test.(js|ts)?(x)"], - testPathIgnorePatterns: ["/node_modules/", "ssr"], - setupFilesAfterEnv: ["/test/setup.js"], - /* picks the "browser" exports condition so @solidjs/web resolves its DOM build */ - testEnvironmentOptions: { - customExportConditions: ["browser"], - }, - /* transform ts, tsx, and esm .mjs files */ - transform: { - "\\.[jt]sx$": transform_client_path, - "\\.[jt]s$": transform_client_path, - "\\.mjs$": transform_client_path, - }, -} - -/** @type {import('@jest/types').Config.InitialOptions} */ -const server_config = { - ...common_config, - // avoid loading jsdom. - testEnvironment: "node", - testMatch: ["/test/ssr.test.(js|ts)?(x)"], - /* transform ts, tsx, and esm .mjs files */ - transform: { - "\\.[jt]sx$": transform_ssr_path, - "\\.[jt]s$": transform_ssr_path, - "\\.mjs$": transform_ssr_path, - }, -} - -/** @type {import('@jest/types').Config.InitialOptions} */ -module.exports = process.env["SSR"] ? server_config : client_config diff --git a/jest/resolver.cjs b/jest/resolver.cjs deleted file mode 100644 index a35a520..0000000 --- a/jest/resolver.cjs +++ /dev/null @@ -1,33 +0,0 @@ -const fs = require("fs") -const path = require("path") - -/* -@solid-primitives/* next-tag prereleases only publish an ESM "import" export -condition (no "require"/"main" fallback), which our CJS-based babel-jest -pipeline can't require() through package.json exports resolution. Walk up -node_modules by hand (mirroring Node's own lookup algorithm) to find the -package directory without going through the exports gate, then point -straight at its "module" (or "main") entry. -*/ -function findPackageDir(specifier, fromDir) { - let dir = fromDir - for (;;) { - const candidate = path.join(dir, "node_modules", specifier) - if (fs.existsSync(candidate)) return candidate - const parent = path.dirname(dir) - if (parent === dir) return null - dir = parent - } -} - -module.exports = function resolver(request, options) { - if (request.startsWith("@solid-primitives/")) { - const pkg_dir = findPackageDir(request, options.basedir) - if (pkg_dir) { - const pkg_json = JSON.parse(fs.readFileSync(path.join(pkg_dir, "package.json"), "utf8")) - const entry = pkg_json.module || pkg_json.main - if (entry) return path.join(pkg_dir, entry) - } - } - return options.defaultResolver(request, options) -} diff --git a/jest/transform-client.cjs b/jest/transform-client.cjs deleted file mode 100644 index bcc5a2b..0000000 --- a/jest/transform-client.cjs +++ /dev/null @@ -1,9 +0,0 @@ -const babelJest = require("babel-jest") - -module.exports = babelJest.default.createTransformer({ - presets: [ - "@babel/preset-env", - "babel-preset-solid", - ["@babel/preset-typescript", {onlyRemoveTypeImports: true}], - ], -}) diff --git a/jest/transform-ssr.cjs b/jest/transform-ssr.cjs deleted file mode 100644 index c914494..0000000 --- a/jest/transform-ssr.cjs +++ /dev/null @@ -1,15 +0,0 @@ -const babelJest = require("babel-jest") - -module.exports = babelJest.default.createTransformer({ - presets: [ - "@babel/preset-env", - [ - "babel-preset-solid", - { - generate: "ssr", - hydratable: true, - }, - ], - ["@babel/preset-typescript", {onlyRemoveTypeImports: true}], - ], -}) diff --git a/package.json b/package.json index bbcaf37..39e3eb2 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,16 @@ "scripts": { "prepublishOnly": "pnpm build", "build": "tsup", - "test": "pnpm run test:client && pnpm run test:ssr", - "test:client": "jest --config jest/jest.config.cjs", - "test:ssr": "SSR=true jest --config jest/jest.config.cjs", + "dev": "vite --config playground/vite.config.ts", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", "format": "prettier --cache -w .", "lint": "pnpm run lint:code && pnpm run lint:types", - "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 --ext .js,.jsx,.ts,.tsx src", - "lint:types": "tsc --noEmit", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build" + "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 --ext .js,.jsx,.ts,.tsx src test e2e playground", + "lint:types": "tsc --noEmit && tsc --noEmit -p test && tsc --noEmit -p e2e && tsc --noEmit -p playground" }, "type": "module", "files": [ @@ -54,31 +55,26 @@ "motion-utils": "^13.0.0" }, "devDependencies": { - "@babel/preset-env": "^7.23.7", - "@babel/preset-typescript": "^7.23.3", - "@jest/types": "^29.6.3", + "@playwright/test": "^1.62.1", "@solidjs/testing-library": "1.0.0-beta.2", + "@solidjs/vite-plugin": "^3.0.0-next.37", "@solidjs/web": "2.0.0-rc.3", - "@types/jest": "^29.5.11", + "@testing-library/jest-dom": "^6.9.1", "@types/node": "^20.10.6", "@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/parser": "^6.17.0", - "babel-jest": "^29.7.0", - "babel-preset-solid": "2.0.0-rc.2", + "@vitest/coverage-v8": "^4.1.11", "eslint": "^8.56.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-no-only-tests": "^3.1.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", + "jsdom": "^30.0.1", "prettier": "^3.1.1", "solid-js": "2.0.0-rc.3", - "storybook": "10.5.10", - "storybook-solidjs-vite": "10.7.1", "tsup": "^8.0.1", "tsup-preset-solid": "^2.2.0", "typescript": "^5.3.3", "vite": "^8.2.2", - "vite-plugin-solid": "3.0.0-next.27" + "vitest": "^4.1.11" }, "peerDependencies": { "solid-js": "^2.0.0-rc.0" diff --git a/playground/index.html b/playground/index.html new file mode 100644 index 0000000..31a2252 --- /dev/null +++ b/playground/index.html @@ -0,0 +1,40 @@ + + + + + + solid-motion playground + + + +
+ + + diff --git a/playground/src/demos.tsx b/playground/src/demos.tsx new file mode 100644 index 0000000..3091e83 --- /dev/null +++ b/playground/src/demos.tsx @@ -0,0 +1,595 @@ +import {createSignal, Show} from "solid-js" +import type {JSX} from "@solidjs/web" +import {Motion, Presence, motion, useScroll} from "../../src/index.jsx" +import type {AnimationOptions} from "../../src/index.jsx" + +/* +Every demo the Playwright suite drives, keyed by the `?demo=` id it is +reached at. Each one exposes the state a test needs to assert on as text +inside a `data-testid` node, so assertions do not depend on reading a +half-finished animation's interpolated style. +*/ + +const box = { + width: "80px", + height: "80px", + "border-radius": "8px", + background: "royalblue", +} as const + +function Status(props: {id: string; value: string}): JSX.Element { + return ( +

+ {props.value} +

+ ) +} + +/* -------------------------------- rendering ------------------------------- */ + +const ProxyTags = (): JSX.Element => ( +
+ + span + + button + + + + + li via tag prop + + +
+) + +const StyleMerging = (): JSX.Element => ( +
+ + +
+) + +const SvgAttrs = (): JSX.Element => ( + + + +) + +/* --------------------------------- animate -------------------------------- */ + +const BasicEnter = (): JSX.Element => ( + +) + +const InitialFalse = (): JSX.Element => ( + +) + +const NoOpWhenEqual = (): JSX.Element => { + const [starts, setStarts] = createSignal(0) + const target = {opacity: 0.6} + return ( +
+ + setStarts(n => n + 1)} + /> +
+ ) +} + +const ReactiveAnimate = (): JSX.Element => { + const [opacity, setOpacity] = createSignal(0.25) + return ( +
+ + +
+ ) +} + +/* -------------------------------- gestures -------------------------------- */ + +const Hover = (): JSX.Element => { + const [status, setStatus] = createSignal("idle") + return ( +
+ + setStatus("active")} + onHoverEnd={() => setStatus("idle")} + /> +
+ ) +} + +const Press = (): JSX.Element => { + const [status, setStatus] = createSignal("idle") + return ( +
+ + setStatus("active")} + onPressEnd={() => setStatus("idle")} + /> +
+ ) +} + +/* Press must win over hover for overlapping keys, since it layers on top. */ +const HoverAndPress = (): JSX.Element => { + const [hover, setHover] = createSignal("idle") + const [press, setPress] = createSignal("idle") + return ( +
+ + + setHover("active")} + onHoverEnd={() => setHover("idle")} + onPressStart={() => setPress("active")} + onPressEnd={() => setPress("idle")} + /> +
+ ) +} + +/* +A gesture with no `animate` base: the resolved target on hover-out is empty, +which currently leaves the element stuck on the hover values. +*/ +const HoverNoBase = (): JSX.Element => ( + +) + +/* --------------------------------- inView --------------------------------- */ + +const InView = (): JSX.Element => { + const [status, setStatus] = createSignal("not yet") + const [entries, setEntries] = createSignal("none") + return ( +
+ + +
+ { + setStatus("entered") + // guards against the handler being handed the element instead + setEntries(String(event.detail.originalEntry.isIntersecting)) + }} + onViewLeave={() => setStatus("left")} + /> +
+
+ ) +} + +/* inView layered under hover: hovering must not drop the inView values. */ +const InViewWithHover = (): JSX.Element => ( +
+
+ +
+
+) + +const InViewAmount = (): JSX.Element => { + const [status, setStatus] = createSignal("not yet") + return ( +
+ +
+ setStatus("entered")} + onViewLeave={() => setStatus("left")} + /> +
+
+ ) +} + +/* -------------------------------- presence -------------------------------- */ + +const PresenceBasic = (): JSX.Element => { + const [show, setShow] = createSignal(true) + return ( +
+ + + + + + +
+ ) +} + +/* An `exit` that resolves to nothing must still let the element be removed. */ +const PresenceEmptyExit = (): JSX.Element => { + const [show, setShow] = createSignal(true) + return ( +
+ + + + + + +
+ ) +} + +const PresenceExitBeforeEnter = (): JSX.Element => { + const [condition, setCondition] = createSignal(true) + const El = (props: {label: string}): JSX.Element => ( + + ) + return ( +
+ + + } fallback={} /> + +
+ ) +} + +/* +The parallel-mode swap: the incoming element is briefly torn down and +remounted while the outgoing one exits, and must not be left pinned to its +exit target afterwards. +*/ +const PresenceParallelSwap = (): JSX.Element => { + const [key, setKey] = createSignal(1) + const [opacity, setOpacity] = createSignal(0.5) + return ( +
+ + + + + {k => ( + + )} + + +
+ ) +} + +const PresenceNestedExit = (): JSX.Element => { + const [show, setShow] = createSignal(true) + // long enough that a mid-exit assertion cannot race the animation finishing + const exit = {opacity: 0, transition: {duration: 1}} + return ( +
+ + + + + + + + +
+ ) +} + +/* `initial={false}` suppresses only the children present on the first render. */ +const PresenceInitialFalse = (): JSX.Element => { + const [show, setShow] = createSignal(false) + return ( +
+ + + + } + > + + + +
+ ) +} + +/* -------------------------------- variants -------------------------------- */ + +const Variants = (): JSX.Element => ( + +) + +/* A descendant with no `initial` inherits the ancestor's variant key. */ +const VariantInheritance = (): JSX.Element => ( + + + +) + +/* Swapping the variants map under an unchanged `animate` key must re-animate. */ +const ReactiveVariants = (): JSX.Element => { + const [variants, setVariants] = createSignal({on: {opacity: 0.3}}) + return ( +
+ + +
+ ) +} + +/* ------------------------------- transitions ------------------------------ */ + +/* `easing` is Motion One's spelling, translated internally to `ease`. */ +const LegacyEasing = (): JSX.Element => ( + +) + +/* A per-value override inherits what it does not restate from the base. */ +const PerValueOverride = (): JSX.Element => ( + +) + +/* A target's own `transition` wins over the component-level one. */ +const PerTargetOverride = (): JSX.Element => ( + +) + +const Keyframes = (): JSX.Element => ( + +) + +/* ------------------------------- primitives ------------------------------- */ + +const RefFactory = (): JSX.Element => ( +
({ + initial: {opacity: 0, y: -20}, + animate: {opacity: 1, y: 0}, + transition: {duration: 0.2}, + }))} + /> +) + +const UseScroll = (): JSX.Element => { + const {scrollY} = useScroll() + return ( +
+

+ {scrollY().progress.toFixed(2)} +

+
Scroll
+
+ ) +} + +export const DEMOS: Record JSX.Element> = { + "proxy-tags": ProxyTags, + "style-merging": StyleMerging, + "svg-attrs": SvgAttrs, + "basic-enter": BasicEnter, + "initial-false": InitialFalse, + "no-op-when-equal": NoOpWhenEqual, + "reactive-animate": ReactiveAnimate, + hover: Hover, + press: Press, + "hover-and-press": HoverAndPress, + "hover-no-base": HoverNoBase, + "in-view": InView, + "in-view-with-hover": InViewWithHover, + "in-view-amount": InViewAmount, + "presence-basic": PresenceBasic, + "presence-empty-exit": PresenceEmptyExit, + "presence-exit-before-enter": PresenceExitBeforeEnter, + "presence-parallel-swap": PresenceParallelSwap, + "presence-nested-exit": PresenceNestedExit, + "presence-initial-false": PresenceInitialFalse, + variants: Variants, + "variant-inheritance": VariantInheritance, + "reactive-variants": ReactiveVariants, + "legacy-easing": LegacyEasing, + "per-value-override": PerValueOverride, + "per-target-override": PerTargetOverride, + keyframes: Keyframes, + "ref-factory": RefFactory, + "use-scroll": UseScroll, +} diff --git a/playground/src/main.tsx b/playground/src/main.tsx new file mode 100644 index 0000000..cb7b612 --- /dev/null +++ b/playground/src/main.tsx @@ -0,0 +1,39 @@ +import {render} from "@solidjs/web" +import {Show} from "solid-js" +import type {JSX} from "@solidjs/web" +import {DEMOS} from "./demos.jsx" + +/* +No router: the demo is picked from `?demo=` so a Playwright test can +navigate straight to one. Without the parameter this renders an index of +every demo, which doubles as the manual replacement for the Storybook +sidebar when running `pnpm dev`. +*/ +function App(): JSX.Element { + const id = new URLSearchParams(window.location.search).get("demo") + const Demo = id ? DEMOS[id] : undefined + + return ( + +

solid-motion playground

+ +

Unknown demo: {id}

+
+
    + {Object.keys(DEMOS).map(key => ( +
  • + {key} +
  • + ))} +
+ + } + /> + ) +} + +render(() => , document.getElementById("root")!) diff --git a/stories/tsconfig.json b/playground/tsconfig.json similarity index 66% rename from stories/tsconfig.json rename to playground/tsconfig.json index 943cb4d..ee9dddd 100644 --- a/stories/tsconfig.json +++ b/playground/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "lib": ["ESNext", "DOM"], "jsx": "preserve", - "jsxImportSource": "@solidjs/web" + "jsxImportSource": "@solidjs/web", + "types": ["node"] } } diff --git a/playground/vite.config.ts b/playground/vite.config.ts new file mode 100644 index 0000000..e3b0fac --- /dev/null +++ b/playground/vite.config.ts @@ -0,0 +1,15 @@ +import {defineConfig} from "vite" +import solid from "@solidjs/vite-plugin" +import {fileURLToPath} from "node:url" + +/* +The playground is the app the Playwright suite drives. It replaces the old +Storybook setup: every demo is a plain route, so a test can navigate straight +to `?demo=` instead of going through a story runner. +*/ +export default defineConfig({ + root: fileURLToPath(new URL(".", import.meta.url)), + plugins: [solid()], + server: {port: 5173}, + preview: {port: 5173}, +}) diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..ee9b5da --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,38 @@ +import {defineConfig, devices} from "@playwright/test" + +const PORT = 5173 +const BASE_URL = `http://localhost:${PORT}` + +/* +The Playwright suite covers what jsdom cannot: real animation interpolation +through the Web Animations API, real IntersectionObserver for `inView`, real +pointer input for `hover`/`press`, and real scrolling for `useScroll`. The +Vitest suite covers the state machine itself. + +Tests run against the playground app in `playground/`, which exposes one demo +per `?demo=` route. +*/ +export default defineConfig({ + testDir: "./e2e", + fullyParallel: true, + forbidOnly: !!process.env["CI"], + retries: process.env["CI"] ? 2 : 0, + workers: process.env["CI"] ? 1 : undefined, + reporter: process.env["CI"] ? "github" : "list", + use: { + baseURL: BASE_URL, + trace: "on-first-retry", + }, + projects: [ + {name: "chromium", use: {...devices["Desktop Chrome"]}}, + {name: "firefox", use: {...devices["Desktop Firefox"]}}, + {name: "webkit", use: {...devices["Desktop Safari"]}}, + ], + webServer: { + command: `pnpm run dev --port ${PORT}`, + url: BASE_URL, + reuseExistingServer: !process.env["CI"], + stdout: "ignore", + stderr: "pipe", + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac7bf14..fda4e94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,24 +36,21 @@ importers: specifier: ^13.0.0 version: 13.0.0 devDependencies: - '@babel/preset-env': - specifier: ^7.23.7 - version: 7.26.9(@babel/core@7.26.10) - '@babel/preset-typescript': - specifier: ^7.23.3 - version: 7.27.0(@babel/core@7.26.10) - '@jest/types': - specifier: ^29.6.3 - version: 29.6.3 + '@playwright/test': + specifier: ^1.62.1 + version: 1.62.1 '@solidjs/testing-library': specifier: 1.0.0-beta.2 version: 1.0.0-beta.2(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.37 + version: 3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) '@solidjs/web': specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(solid-js@2.0.0-rc.3) - '@types/jest': - specifier: ^29.5.11 - version: 29.5.14 + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 '@types/node': specifier: ^20.10.6 version: 20.17.31 @@ -63,12 +60,9 @@ importers: '@typescript-eslint/parser': specifier: ^6.17.0 version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) - babel-jest: - specifier: ^29.7.0 - version: 29.7.0(@babel/core@7.26.10) - babel-preset-solid: - specifier: 2.0.0-rc.2 - version: 2.0.0-rc.2(@babel/core@7.26.10)(solid-js@2.0.0-rc.3) + '@vitest/coverage-v8': + specifier: ^4.1.11 + version: 4.1.11(vitest@4.1.11) eslint: specifier: ^8.56.0 version: 8.57.1 @@ -78,24 +72,15 @@ importers: eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.3.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.31) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 + jsdom: + specifier: ^30.0.1 + version: 30.0.1 prettier: specifier: ^3.1.1 version: 3.5.3 solid-js: specifier: 2.0.0-rc.3 version: 2.0.0-rc.3 - storybook: - specifier: 10.5.10 - version: 10.5.10(prettier@3.5.3)(react@19.2.8) - storybook-solidjs-vite: - specifier: 10.7.1 - version: 10.7.1(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(esbuild@0.25.3)(rollup@4.40.0)(solid-js@2.0.0-rc.3)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) tsup: specifier: ^8.0.1 version: 8.4.0(postcss@8.5.26)(typescript@5.8.3) @@ -108,9 +93,9 @@ importers: vite: specifier: ^8.2.2 version: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vite-plugin-solid: - specifier: 3.0.0-next.27 - version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + vitest: + specifier: ^4.1.11 + version: 4.1.11(@types/node@20.17.31)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) packages: @@ -121,6 +106,14 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@asamuzakjp/css-color@6.0.7': + resolution: {integrity: sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==} + engines: {node: ^22.13.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@8.3.2': + resolution: {integrity: sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==} + engines: {node: ^22.13.0 || >=24.0.0} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -151,17 +144,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} @@ -188,12 +170,6 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} @@ -208,16 +184,20 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} '@babel/helpers@7.27.0': @@ -229,84 +209,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@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-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - 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/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true '@babel/plugin-syntax-jsx@7.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} @@ -314,493 +220,167 @@ packages: 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.25.9': resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-typescript@7.27.0': + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/preset-typescript@7.27.0': + resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/color-helpers@6.1.1': + resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==} + engines: {node: '>=20.19.0'} - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} - engines: {node: '>=6.9.0'} + '@csstools/css-calc@3.3.0': + resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} + '@csstools/css-color-parser@4.2.2': + resolution: {integrity: sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} - engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} - engines: {node: '>=6.9.0'} + '@csstools/css-syntax-patches-for-csstree@1.1.12': + resolution: {integrity: sha512-3vLQK+dXxhBMR2Wx99PTCifE+vHtW2ndZWyla8yK813ev6oGhyn8Lja8jCyGAWTJ+LEYZK7EVtJxrDj8ztevJw==} peerDependencies: - '@babel/core': ^7.0.0-0 + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} - engines: {node: '>=6.9.0'} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.44': + resolution: {integrity: sha512-f1kx6TeMQgaLVkGfuxMn0BkH0+HvsycFf1qPHbYoBqmBQd6Ag/EXOxkSpfcaC+UOBMSaF4BKXegGDchRNTWKrg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.20.12 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@dom-expressions/babel-plugin-jsx@0.50.0-next.44': - resolution: {integrity: sha512-f1kx6TeMQgaLVkGfuxMn0BkH0+HvsycFf1qPHbYoBqmBQd6Ag/EXOxkSpfcaC+UOBMSaF4BKXegGDchRNTWKrg==} - peerDependencies: - '@babel/core': ^7.20.12 - - '@emnapi/core@1.11.0': - resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} - - '@emnapi/core@1.11.3': - resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} - - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - - '@emnapi/runtime@1.11.0': - resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} - - '@emnapi/runtime@1.11.3': - resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - - '@emnapi/wasi-threads@1.2.3': - resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} - - '@esbuild/aix-ppc64@0.25.3': - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.3': - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.3': - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.3': - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.3': - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.3': - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.3': - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.3': - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.3': - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.3': - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] '@esbuild/linux-ia32@0.25.3': resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} @@ -910,6 +490,15 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -927,87 +516,10 @@ packages: 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@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1019,9 +531,15 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -1041,292 +559,80 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-parser/binding-android-arm-eabi@0.127.0': - resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} + '@oxc-project/types@0.147.0': + resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} + hasBin: true + + '@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] - '@oxc-parser/binding-android-arm64@0.127.0': - resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} + '@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] - '@oxc-parser/binding-darwin-arm64@0.127.0': - resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} + '@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] - '@oxc-parser/binding-darwin-x64@0.127.0': - resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} + '@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] - '@oxc-parser/binding-freebsd-x64@0.127.0': - resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} + '@rolldown/binding-freebsd-x64@1.2.6': + resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': - resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': - resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} + '@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] - '@oxc-parser/binding-linux-arm64-gnu@0.127.0': - resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} + '@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] - '@oxc-parser/binding-linux-arm64-musl@0.127.0': - resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} + '@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] - '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': - resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.6': + resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': - resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.6': + resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] + cpu: [s390x] os: [linux] - '@oxc-parser/binding-linux-riscv64-musl@0.127.0': - resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-parser/binding-linux-s390x-gnu@0.127.0': - resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - - '@oxc-parser/binding-linux-x64-gnu@0.127.0': - resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-linux-x64-musl@0.127.0': - resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-openharmony-arm64@0.127.0': - resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@oxc-parser/binding-wasm32-wasi@0.127.0': - resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@oxc-parser/binding-win32-arm64-msvc@0.127.0': - resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@oxc-parser/binding-win32-ia32-msvc@0.127.0': - resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@oxc-parser/binding-win32-x64-msvc@0.127.0': - resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@oxc-project/types@0.127.0': - resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - - '@oxc-project/types@0.147.0': - resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} - - '@oxc-resolver/binding-android-arm-eabi@11.21.2': - resolution: {integrity: sha512-xQoCRv+gKax9KTdwdaQNnAFOai8neay7g3jExDIORzhbrejwGSJaZNTdOJHR5ziLg2joMxOCMOFMo4zuxza2uQ==} - cpu: [arm] - os: [android] - - '@oxc-resolver/binding-android-arm64@11.21.2': - resolution: {integrity: sha512-HF5oiE2L05yInPYCFD/4uxSrEZW4SuIfn99Y6L1xnJnzl066JR+MJs2rIdstw8A2MPlAKH+13dpFPNycjqzvGg==} - cpu: [arm64] - os: [android] - - '@oxc-resolver/binding-darwin-arm64@11.21.2': - resolution: {integrity: sha512-UX4u49CVCAD8QZNELaW8eMGgMAGwFWYEPbvNsh+3r/gs4NX3KfpiACMVwRQT0EuH3uat9hM5Zl+Ppm9pJD8tgg==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@11.21.2': - resolution: {integrity: sha512-J9xPx7YBkrRmJ+xl561ztnMWEc1aOyjEIxBiGX1dVb3u7bGSnfObfcZk+Pd+uM0HZAPNsQ1xvD8j52A/uOSqNQ==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@11.21.2': - resolution: {integrity: sha512-fRlt7OvSaQkWj6+EDTVxawVxOlqJB2QSnBfkeCyK4RTvsGctbw3BiH2Tb7DzMs7bikc4BRBpvWP5zF9K8b54Zg==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2': - resolution: {integrity: sha512-gK+vPUcPQITkGwBKpZGrcDHSlU6eDGl7AQacxS2CEKAZIBHWkOVFeJwLZ4tYnA1acJqRM5lt7yYwPCVqGHIJ7A==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2': - resolution: {integrity: sha512-L/Rgas7SrOKy/z7IH+HxSFRqVO4PuLDKLEGKvnhoCBBq3UJ0YzGBou3qMzaAGgkJwsIvX2pBF+7ojzfUhLiZxQ==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@11.21.2': - resolution: {integrity: sha512-CUEYvlX1Fk7E9kUMzuswru1J9HLxMwnpDeQGjQuI4ZH+iNCoa2X9T+pvyzrbsgl7WnIeTFTlNlHsRfVdf5g9/g==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-musl@11.21.2': - resolution: {integrity: sha512-ViN1ZibQyxwC67GpoP33oo+S9UyUnkog13vzQb9+v9bCNvrVzJuk0MRdacjtv/9xfRMVF/eqHFyl8YOeykI10Q==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2': - resolution: {integrity: sha512-CU1sCqWnhGqYD5I1HedHk5pujrn7ssDkNB/AEQd/pd3D/EojVSgJUlpbafwIbyhia3PgIfkvdFpRPWSALzVumA==} - cpu: [ppc64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2': - resolution: {integrity: sha512-jWVyZtIHca4Gb96x7dag+y69vlei7ffjrsveLkmf2ZhqEAz6ZSBnY1GWvgZUaZlwZP62A3xD092BW97Q5VGc+g==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-musl@11.21.2': - resolution: {integrity: sha512-LF29obFqNgBUgDX7rmUK7M4D0JQG5LxhYzn3xXmECcHU9aQAdWG7NiY052qybtesEdwHQXKNTWYQ7mTsybNvWg==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-s390x-gnu@11.21.2': - resolution: {integrity: sha512-+NYcm+cCHBbtdQQ3A4phQTSuVRYnNHz7wrl9XRAPEovcdoqi0mb1K5ZOl+jN54ZD+q1zz3V0vltbFJmzecJKmw==} - cpu: [s390x] - os: [linux] - - '@oxc-resolver/binding-linux-x64-gnu@11.21.2': - resolution: {integrity: sha512-UQqZDdG2r2HhAOsZEgufkIWHPQ886IUyuJQkoZByvzhW8j51R4UNzGBJFkTiTnLhQnggwJRdJgFWK4uY6ZVIMw==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-linux-x64-musl@11.21.2': - resolution: {integrity: sha512-3Q9PMRjalWkT6NZ4jfujuqTCFwoWErg3y3BnOgb544B8IMw4PktiwWOigMfOHNRLMghZeJ7hpfpZf4CP7rV7Og==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-openharmony-arm64@11.21.2': - resolution: {integrity: sha512-Eljeq3ndtyKhM+Es8LITi4Zl2htzuRZcrPMF3kMCsrILztvU6AjZ3FuEhHHKobPUB9rMpzLpJP5bDqXI7r+iog==} - cpu: [arm64] - os: [openharmony] - - '@oxc-resolver/binding-wasm32-wasi@11.21.2': - resolution: {integrity: sha512-HGDbNsIywqc4LxU38+CTJNnB/6BF7rheWOJ259b4eE0aEnelYblC8x+1tEd63bp31fYne63RQz9Jb4yVnC7Yig==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': - resolution: {integrity: sha512-iWx25CBEgH49iE9q5coEGI/jb1jl5kkCY9z6U5Og67xCkQ/WFMDc2J5U78+AE91SUxM2NqSLhJC8/PLfWnImww==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.21.2': - resolution: {integrity: sha512-VPoCAhKvCQTlG7vxqaBXcmuvbh77BfnGXj8g0pbvVXpm1F/R8rDVwqIWcEbMzrI1JvJlm8v7T9uMVQb6UctMRg==} - cpu: [x64] - os: [win32] - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@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.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.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.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.2.6': - resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@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.2.6': - resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@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] - - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - - '@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] - - '@rolldown/binding-linux-x64-gnu@1.2.6': - resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} + '@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] @@ -1458,15 +764,6 @@ packages: cpu: [x64] os: [win32] - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@solid-primitives/props@4.0.0-next.3': resolution: {integrity: sha512-V2Gn96sQLLhwyiAcGogExqP8+5++Itv0/KBQMNiNp/ldNwbQkr8Q11Ku5VXswYFiFmuiHJ/pGANfwzgsla7zpA==} peerDependencies: @@ -1490,42 +787,42 @@ packages: '@solidjs/web': ^2.0.0-rc.0 solid-js: ^2.0.0-rc.0 - '@solidjs/babel-plugin@2.0.0-rc.4': - resolution: {integrity: sha512-4RYR4PWAlQIz1dmIyPheaUvVb9EnSIw5KIGsEISmHod5qfT1IPVKgtb9bctyQ5FeDAuc7JcpbkFYN2heLrk6rQ==} + '@solidjs/babel-plugin@2.0.0-rc.5': + resolution: {integrity: sha512-Wd2cHNSRBxisVXTsl0Nq+21+0DFVYeKLQxnZqQqxCqXM8cEnijv6tfcIUzlSEp3esEyQD0gXnbQpSOyoLkHCwg==} peerDependencies: '@babel/core': ^7.20.12 - '@solidjs/compiler-darwin-arm64@2.0.0-rc.4': - resolution: {integrity: sha512-YR4T15ucsV1Vb4J6yaHxss2hakdcbZ353ye53AhX+FWNayuEhO/Cyjdtb9uS38Dfzysok/rIEQdaeZcaXt+rPA==} + '@solidjs/compiler-darwin-arm64@2.0.0-rc.5': + resolution: {integrity: sha512-rCSbArP+hLkYeUPdw6OisdQD313VxP+oaI7FOLohSx1FfiEOVwyAvKgYqGROe4T0ZZXjgTkSZUKHBzbG468j4A==} cpu: [arm64] os: [darwin] - '@solidjs/compiler-darwin-x64@2.0.0-rc.4': - resolution: {integrity: sha512-95SkVSyXP2eh7PvPWi+fTeH5aTcTwOUvRV7ubeUrutE4akW3ndq1N8cvg2WZ+LhKrf2pvDO0eSDEZ72I769CLg==} + '@solidjs/compiler-darwin-x64@2.0.0-rc.5': + resolution: {integrity: sha512-l1P0zal1yKy2k/TNMqnh2jFf7CkCr2Iu/AM45Rai65NW2n7zgPO+2LY6kDKCO/ooU4ZZ3FdnTKpwza6mT1xqUQ==} cpu: [x64] os: [darwin] - '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.4': - resolution: {integrity: sha512-36Ht+EUAVUt8fAxq8zlfPS0+vZ61hfJRJDiX1HDNXvlAwZE1B7FH/ym1wfXrhG1TvrNA63Sjjj5CeccYO2H4Tg==} + '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.5': + resolution: {integrity: sha512-G2BBNzwIUJHtAxPISMjtMi+IsgyCWfJ29tS4MxfUC+Q4aEykTV55ybItAAffwF9YgeHA6JtQY3iVU002QGJDuw==} cpu: [arm64] os: [linux] - '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.4': - resolution: {integrity: sha512-DSFOQEjfYmmRQ70pNLamRXPNQ+aP+5vyh1rMjSKwAzONt0xB2rcy9Alt02GU38gztW9YN6ZyxM4rwkYe+7MfaQ==} + '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.5': + resolution: {integrity: sha512-3ckN7cot0FiUiGUSnnKJON+sOJgIS8zuEXUPUv/ijjE+gA9pEepX8u06/DXzvEXkrDzPHGWrFx+v19Aogl+l5g==} cpu: [x64] os: [linux] - '@solidjs/compiler-wasm32-wasi@2.0.0-rc.4': - resolution: {integrity: sha512-zVxXS+01rbv+0yOp2vaGjIu0om5I1UhhPpzNYeE+AmfpVc2eCWxqDsPai3dIxFDGPTjaJ+npwjKJRmOTaoknRw==} + '@solidjs/compiler-wasm32-wasi@2.0.0-rc.5': + resolution: {integrity: sha512-1l35k2lCYtpIV/RZBqpy9y7JNMruGAlMBZVxjIHDxCJDs9vKLue/7WPT0qg7cm3dCqa69hVxRNBQYqRHLa4P2g==} engines: {node: '>=14.0.0'} - '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.4': - resolution: {integrity: sha512-DkzTHMZXzaiL/KhL76UJWN24pKkkXeLpPYtDxUqX6VaKuOCPDmp/m7GLWSDrqCdF7leuYsig2MuMJTXZRLOkbQ==} + '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.5': + resolution: {integrity: sha512-ZYumQABKyBWv0iEonwcMnrjOt1cKWdjdBeKc9xQ0eNxqMlJsOQvRFMB3Ow7OS2U2aYKfAIzfcPCKgsXv9JbIvA==} cpu: [x64] os: [win32] - '@solidjs/compiler@2.0.0-rc.4': - resolution: {integrity: sha512-lKx6Jp1KbHxqO+v+g7cRbm8I1DHx/10Lj8bKG4vmdGnCfSlFbyhCd8cPTLdLV0YVG7GGSzzF5m8NkC9NlfGN5w==} + '@solidjs/compiler@2.0.0-rc.5': + resolution: {integrity: sha512-DQF24zYiTW4GDhhOTITEjjK1PGvPGx8P3qR6ogWBeaXggeMN6vV2s0oqyrYoJr2g2ufJj1vf2FIdLVDu8Ip7zw==} '@solidjs/signals@2.0.0-rc.3': resolution: {integrity: sha512-/yPhTf3xS1FRR4MX8kTYCd4MjsFxzwkO+KyOTfbu35lTEiaJ4Fxy+JL91XonDzt31GV1mYaZ9CGD2TQIzvXuNA==} @@ -1537,8 +834,8 @@ packages: '@solidjs/web': '>=2.0.0' solid-js: '>=2.0.0' - '@solidjs/vite-plugin@3.0.0-next.36': - resolution: {integrity: sha512-PMreKx9IeQwSRt6xt8LQHe58Gk79CVaB57PQMlvXUdbyL5JliaehOSg5a4W6bKoJfeWku7nryEWUvTDKyZ2PBg==} + '@solidjs/vite-plugin@3.0.0-next.37': + resolution: {integrity: sha512-P1mWQ4TnqZexlVJHGHRlsVRLXfOklx7HrGgC4KBvPZX5v3MUYBNnmIrpxi+nOac5//Qo2pJHzhLj4J5Fx6Mh9g==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@solidjs/start-devtools': ^1.0.0-next.2 @@ -1557,37 +854,8 @@ packages: peerDependencies: solid-js: ^2.0.0-rc.3 - '@storybook/builder-vite@10.5.10': - resolution: {integrity: sha512-O4GgIP0tKLRueom3EmU3OaBUHKjNYj+jkOvmTIkn3PYTiWVkCuHqSKEs4ADvRyaQuLH+peHhFe4JtkNC9KbtrQ==} - peerDependencies: - storybook: ^10.5.10 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@storybook/csf-plugin@10.5.10': - resolution: {integrity: sha512-TaCLBrqVEr767+w58QDotDUiCTuE5cyRJuRcDlsKQyUIyGBv+lYD3lu8wBiVCYxgIjB/gu9HmqiC+0yx1rHzaw==} - peerDependencies: - esbuild: '*' - rollup: '*' - storybook: ^10.5.10 - vite: '*' - webpack: '*' - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - - '@storybook/icons@2.1.0': - resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -1597,16 +865,6 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/user-event@14.6.6': - resolution: {integrity: sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -1622,8 +880,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@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==} @@ -1634,24 +892,6 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@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@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1661,18 +901,6 @@ packages: '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@6.21.0': resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1731,74 +959,60 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript/typescript6@6.0.2': - resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} - hasBin: true - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/coverage-v8@4.1.11': + resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} + peerDependencies: + '@vitest/browser': 4.1.11 + vitest: 4.1.11 + peerDependenciesMeta: + '@vitest/browser': + optional: true - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} - '@volar/language-core@2.4.28': - resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + '@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 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@volar/source-map@2.4.28': - resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} - '@volar/typescript@2.4.28': - resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} - '@webcontainer/env@1.1.1': - resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true - acorn@8.18.0: - resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1822,13 +1036,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - 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==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1843,52 +1050,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + ast-v8-to-istanbul@1.0.5: + resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} babel-preset-solid@2.0.0-rc.2: resolution: {integrity: sha512-Venq++Aa6+RzGIAyS5vSo3kX1fE8zRreEPCh1eTh5DTjlTft9qZGIG14RSZDv/sjVxT8x5Gs9+21PzxuLe8U+g==} @@ -1902,6 +1065,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1917,16 +1083,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - 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==} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1937,63 +1093,25 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - 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-lite@1.0.30001715: resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - - 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.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2001,10 +1119,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -2019,37 +1133,23 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} @@ -2060,44 +1160,12 @@ packages: supports-color: optional: true - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.1: - resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} - engines: {node: '>=18'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2106,14 +1174,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'} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2128,25 +1188,12 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} electron-to-chromium@1.5.143: resolution: {integrity: sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==} - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2157,24 +1204,12 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} esbuild-plugin-solid@0.5.0: resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} @@ -2195,19 +1230,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - 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'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-plugin-eslint-comments@3.2.0: resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} @@ -2236,11 +1262,6 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -2253,21 +1274,16 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2285,9 +1301,6 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.4: resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -2313,10 +1326,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - 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'} @@ -2332,10 +1341,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} - framer-motion@13.1.1: resolution: {integrity: sha512-B/xn2TPS4f61cEBLFjiYlQFnBZUW1YVj/LM+C+N4OP8Rs95VLEI2ot/RlfBg111la/EiyECFaJJi/A3FWA8MUA==} peerDependencies: @@ -2350,38 +1355,20 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - 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-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2410,13 +1397,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -2424,21 +1404,9 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} @@ -2446,22 +1414,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2470,11 +1422,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - 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'} @@ -2490,18 +1437,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - 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'} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2510,19 +1445,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - 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-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2534,18 +1460,10 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2553,196 +1471,40 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - 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@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + 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@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.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@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} + jsdom@30.0.1: + resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} peerDependencies: - canvas: ^2.5.0 + canvas: ^3.2.3 peerDependenciesMeta: canvas: optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2751,9 +1513,6 @@ packages: 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==} @@ -2765,20 +1524,9 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - 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'} @@ -2864,29 +1612,23 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.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'} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2894,24 +1636,23 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.4: + resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2920,18 +1661,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2971,69 +1700,32 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - 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'} - - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + 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'} - - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxc-parser@0.127.0: - resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} - engines: {node: ^20.19.0 || >=22.12.0} - - oxc-resolver@11.21.2: - resolution: {integrity: sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - 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'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3041,15 +1733,11 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -3063,9 +1751,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - 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'} @@ -3074,9 +1759,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3097,9 +1781,15 @@ packages: 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'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} @@ -3136,36 +1826,16 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.2.8: resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} @@ -3174,49 +1844,17 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recast@0.23.21: - resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} - engines: {node: '>= 4'} - redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3225,15 +1863,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3253,16 +1882,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -3276,11 +1898,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - seroval-plugins@1.5.6: resolution: {integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==} engines: {node: '>=10'} @@ -3299,16 +1916,13 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3320,57 +1934,15 @@ 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'} - source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - storybook-solidjs-vite@10.7.1: - resolution: {integrity: sha512-bxNEcK745kVlL4D8vh4ERMd/G2IGLPzdkr5/I6QdonUj7exp3WReca9eGxQlqYVSWeSB+pkIJgu/KdihgAj2rA==} - peerDependencies: - '@solidjs/web': ^2.0.0-0 - solid-js: ^1.8.0-0 || ^2.0.0-0 - storybook: ^0.0.0-0 || ^10.0.0 - typescript: '*' - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vite-plugin-solid: ^2.0.0-0 || ^3.0.0-0 - peerDependenciesMeta: - '@solidjs/web': - optional: true - typescript: - optional: true - - storybook@10.5.10: - resolution: {integrity: sha512-Rz8k9ejFHsi7lbtJTaxZlhCUz4GkbJIKEoKDjXeLfr/ZhXip73E6keKxW0KH8iGeKiCqHAbJCV4YIQrxTOLiig==} - hasBin: true - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - prettier: ^2 || ^3 - vite-plus: ^0.1.15 || ^0.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - prettier: - optional: true - vite-plus: - optional: true + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -3388,14 +1960,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 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-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3413,21 +1977,9 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3438,12 +1990,16 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -3452,31 +2008,31 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} + tldts-core@7.4.11: + resolution: {integrity: sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + tldts@7.4.11: + resolution: {integrity: sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==} + hasBin: true to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -3488,10 +2044,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-dedent@2.3.0: - resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} - engines: {node: '>=6.10'} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3526,54 +2078,21 @@ 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.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} - hasBin: true - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - unplugin@2.3.11: - resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} - engines: {node: '>=18.12.0'} + undici@8.10.1: + resolution: {integrity: sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==} + engines: {node: '>=22.19.0'} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -3584,24 +2103,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - vite-plugin-solid@3.0.0-next.27: - resolution: {integrity: sha512-bDzjIIplkSDH73BiGP9pbPR3ZnjeUA18SAYugLhqDCy4u0bl3qdrETstxrXuo2vHXLB0VD9rvOr0iesZBBul4Q==} - vite@8.2.2: resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3653,37 +2157,69 @@ packages: vite: optional: true - vscode-uri@3.2.0: - resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} - - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + 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.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 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + whatwg-url@17.1.0: + resolution: {integrity: sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==} + engines: {node: ^22.14.0 || >=24.0.0} whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -3693,6 +2229,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3708,60 +2249,16 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.21.3: - resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - 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'} @@ -3773,7 +2270,22 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 + + '@asamuzakjp/css-color@6.0.7': + dependencies: + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + lru-cache: 11.5.2 + + '@asamuzakjp/dom-selector@8.3.2': + dependencies: + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 '@babel/code-frame@7.26.2': dependencies: @@ -3791,10 +2303,10 @@ snapshots: '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 + '@babel/parser': 7.29.8 '@babel/template': 7.27.0 '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -3836,24 +2348,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.27.0 @@ -3887,15 +2381,6 @@ snapshots: '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -3914,1150 +2399,328 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-wrap-function@7.25.9': - dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option@7.25.9': {} '@babel/helpers@7.27.0': dependencies: '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 '@babel/parser@7.27.0': dependencies: '@babel/types': 7.27.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + '@babel/parser@7.29.8': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.29.8 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': + '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': + '@babel/runtime@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + regenerator-runtime: 0.14.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': + '@babel/template@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': + '@babel/traverse@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': + '@babel/types@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': + '@babel/types@7.29.8': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@bcoe/v8-coverage@1.0.2': {} - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@bramus/specificity@2.4.2': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + css-tree: 3.2.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + '@csstools/color-helpers@6.1.1': {} - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + '@csstools/css-color-parser@4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color + '@csstools/color-helpers': 6.1.1 + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color + '@csstools/css-tokenizer': 4.0.0 - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@csstools/css-syntax-patches-for-csstree@1.1.12(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@csstools/css-tokenizer@4.0.0': {} - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + '@dom-expressions/babel-plugin-jsx@0.50.0-next.44(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/types': 7.27.0 + html-entities: 2.3.3 + parse5: 7.3.0 + validate-html-nesting: 1.2.2 - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.27.0 - esutils: 2.0.3 - - '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - - '@babel/traverse@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.27.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@bcoe/v8-coverage@0.2.3': {} - - '@dom-expressions/babel-plugin-jsx@0.50.0-next.44(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 - html-entities: 2.3.3 - parse5: 7.3.0 - validate-html-nesting: 1.2.2 - - '@emnapi/core@1.11.0': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - - '@emnapi/core@1.11.3': - dependencies: - '@emnapi/wasi-threads': 1.2.3 - tslib: 2.8.1 - optional: true - - '@emnapi/core@1.9.2': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.9.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.3': + '@emnapi/core@1.11.3': dependencies: + '@emnapi/wasi-threads': 1.2.3 tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.3': - optional: true - - '@esbuild/android-arm64@0.25.3': - optional: true - - '@esbuild/android-arm@0.25.3': - optional: true - - '@esbuild/android-x64@0.25.3': - optional: true - - '@esbuild/darwin-arm64@0.25.3': - optional: true - - '@esbuild/darwin-x64@0.25.3': - optional: true - - '@esbuild/freebsd-arm64@0.25.3': - optional: true - - '@esbuild/freebsd-x64@0.25.3': - optional: true - - '@esbuild/linux-arm64@0.25.3': - optional: true - - '@esbuild/linux-arm@0.25.3': - optional: true - - '@esbuild/linux-ia32@0.25.3': - optional: true - - '@esbuild/linux-loong64@0.25.3': - optional: true - - '@esbuild/linux-mips64el@0.25.3': - optional: true - - '@esbuild/linux-ppc64@0.25.3': - optional: true - - '@esbuild/linux-riscv64@0.25.3': - optional: true - - '@esbuild/linux-s390x@0.25.3': - optional: true - - '@esbuild/linux-x64@0.25.3': - optional: true - - '@esbuild/netbsd-arm64@0.25.3': - optional: true - - '@esbuild/netbsd-x64@0.25.3': - optional: true - - '@esbuild/openbsd-arm64@0.25.3': - optional: true - - '@esbuild/openbsd-x64@0.25.3': - optional: true - - '@esbuild/sunos-x64@0.25.3': - optional: true - - '@esbuild/win32-arm64@0.25.3': - optional: true - - '@esbuild/win32-ia32@0.25.3': - optional: true - - '@esbuild/win32-x64@0.25.3': - optional: true - - '@eslint-community/eslint-utils@4.6.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.31) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.17.31 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.17.31 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - 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: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.26.10 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.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: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.31 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': - dependencies: - '@emnapi/core': 1.11.0 - '@emnapi/runtime': 1.11.0 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': - dependencies: - '@emnapi/core': 1.11.3 - '@emnapi/runtime': 1.11.3 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@napi-rs/wasm-runtime@1.2.3(@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.3 - optional: true - - '@nodelib/fs.scandir@2.1.5': + '@emnapi/runtime@1.11.3': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} + tslib: 2.8.1 + optional: true - '@nodelib/fs.walk@1.2.8': + '@emnapi/wasi-threads@1.2.3': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@oxc-parser/binding-android-arm-eabi@0.127.0': + tslib: 2.8.1 optional: true - '@oxc-parser/binding-android-arm64@0.127.0': + '@esbuild/aix-ppc64@0.25.3': optional: true - '@oxc-parser/binding-darwin-arm64@0.127.0': + '@esbuild/android-arm64@0.25.3': optional: true - '@oxc-parser/binding-darwin-x64@0.127.0': + '@esbuild/android-arm@0.25.3': optional: true - '@oxc-parser/binding-freebsd-x64@0.127.0': + '@esbuild/android-x64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + '@esbuild/darwin-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + '@esbuild/darwin-x64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + '@esbuild/freebsd-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.127.0': + '@esbuild/freebsd-x64@0.25.3': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + '@esbuild/linux-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + '@esbuild/linux-arm@0.25.3': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + '@esbuild/linux-ia32@0.25.3': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + '@esbuild/linux-loong64@0.25.3': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.127.0': + '@esbuild/linux-mips64el@0.25.3': optional: true - '@oxc-parser/binding-linux-x64-musl@0.127.0': + '@esbuild/linux-ppc64@0.25.3': optional: true - '@oxc-parser/binding-openharmony-arm64@0.127.0': + '@esbuild/linux-riscv64@0.25.3': optional: true - '@oxc-parser/binding-wasm32-wasi@0.127.0': - dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@esbuild/linux-s390x@0.25.3': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + '@esbuild/linux-x64@0.25.3': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + '@esbuild/netbsd-arm64@0.25.3': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.127.0': + '@esbuild/netbsd-x64@0.25.3': optional: true - '@oxc-project/types@0.127.0': {} - - '@oxc-project/types@0.147.0': {} - - '@oxc-resolver/binding-android-arm-eabi@11.21.2': + '@esbuild/openbsd-arm64@0.25.3': optional: true - '@oxc-resolver/binding-android-arm64@11.21.2': + '@esbuild/openbsd-x64@0.25.3': optional: true - '@oxc-resolver/binding-darwin-arm64@11.21.2': + '@esbuild/sunos-x64@0.25.3': optional: true - '@oxc-resolver/binding-darwin-x64@11.21.2': + '@esbuild/win32-arm64@0.25.3': optional: true - '@oxc-resolver/binding-freebsd-x64@11.21.2': + '@esbuild/win32-ia32@0.25.3': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2': + '@esbuild/win32-x64@0.25.3': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2': - optional: true + '@eslint-community/eslint-utils@4.6.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 - '@oxc-resolver/binding-linux-arm64-gnu@11.21.2': - optional: true + '@eslint-community/regexpp@4.12.1': {} - '@oxc-resolver/binding-linux-arm64-musl@11.21.2': - optional: true + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2': - optional: true + '@eslint/js@8.57.1': {} - '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2': - optional: true + '@exodus/bytes@1.15.1': {} - '@oxc-resolver/binding-linux-riscv64-musl@11.21.2': - optional: true + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - '@oxc-resolver/binding-linux-s390x-gnu@11.21.2': - optional: true + '@humanwhocodes/module-importer@1.0.1': {} - '@oxc-resolver/binding-linux-x64-gnu@11.21.2': - optional: true + '@humanwhocodes/object-schema@2.0.3': {} - '@oxc-resolver/binding-linux-x64-musl@11.21.2': - optional: true + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@oxc-resolver/binding-openharmony-arm64@11.21.2': - optional: true + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} - '@oxc-resolver/binding-wasm32-wasi@11.21.2': + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@emnapi/core': 1.11.0 - '@emnapi/runtime': 1.11.0 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) - optional: true + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': - optional: true + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@oxc-resolver/binding-win32-x64-msvc@11.21.2': + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.3 optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oxc-project/types@0.147.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@playwright/test@1.62.1': + dependencies: + playwright: 1.62.1 + '@rolldown/binding-android-arm-eabi@1.2.6': optional: true @@ -5165,16 +2828,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true - '@sinclair/typebox@0.27.8': {} - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - '@solid-primitives/props@4.0.0-next.3(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3)': dependencies: '@solid-primitives/utils': 7.0.0-next.4(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3) @@ -5199,46 +2852,46 @@ snapshots: '@solidjs/web': 2.0.0-rc.3(solid-js@2.0.0-rc.3) solid-js: 2.0.0-rc.3 - '@solidjs/babel-plugin@2.0.0-rc.4(@babel/core@7.26.10)': + '@solidjs/babel-plugin@2.0.0-rc.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 html-entities: 2.3.3 parse5: 7.3.0 validate-html-nesting: 1.2.2 - '@solidjs/compiler-darwin-arm64@2.0.0-rc.4': + '@solidjs/compiler-darwin-arm64@2.0.0-rc.5': optional: true - '@solidjs/compiler-darwin-x64@2.0.0-rc.4': + '@solidjs/compiler-darwin-x64@2.0.0-rc.5': optional: true - '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.4': + '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.5': optional: true - '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.4': + '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.5': optional: true - '@solidjs/compiler-wasm32-wasi@2.0.0-rc.4': + '@solidjs/compiler-wasm32-wasi@2.0.0-rc.5': dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true - '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.4': + '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.5': optional: true - '@solidjs/compiler@2.0.0-rc.4': + '@solidjs/compiler@2.0.0-rc.5': optionalDependencies: - '@solidjs/compiler-darwin-arm64': 2.0.0-rc.4 - '@solidjs/compiler-darwin-x64': 2.0.0-rc.4 - '@solidjs/compiler-linux-arm64-gnu': 2.0.0-rc.4 - '@solidjs/compiler-linux-x64-gnu': 2.0.0-rc.4 - '@solidjs/compiler-wasm32-wasi': 2.0.0-rc.4 - '@solidjs/compiler-win32-x64-msvc': 2.0.0-rc.4 + '@solidjs/compiler-darwin-arm64': 2.0.0-rc.5 + '@solidjs/compiler-darwin-x64': 2.0.0-rc.5 + '@solidjs/compiler-linux-arm64-gnu': 2.0.0-rc.5 + '@solidjs/compiler-linux-x64-gnu': 2.0.0-rc.5 + '@solidjs/compiler-wasm32-wasi': 2.0.0-rc.5 + '@solidjs/compiler-win32-x64-msvc': 2.0.0-rc.5 '@solidjs/signals@2.0.0-rc.3': {} @@ -5248,12 +2901,12 @@ snapshots: '@testing-library/dom': 10.4.1 solid-js: 2.0.0-rc.3 - '@solidjs/vite-plugin@3.0.0-next.36(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': + '@solidjs/vite-plugin@3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': dependencies: '@ampproject/remapping': 2.3.0 '@babel/core': 7.26.10 - '@solidjs/babel-plugin': 2.0.0-rc.4(@babel/core@7.26.10) - '@solidjs/compiler': 2.0.0-rc.4 + '@solidjs/babel-plugin': 2.0.0-rc.5(@babel/core@7.26.10) + '@solidjs/compiler': 2.0.0-rc.5 '@solidjs/web': 2.0.0-rc.3(solid-js@2.0.0-rc.3) '@types/babel__core': 7.20.5 merge-anything: 5.1.7 @@ -5271,31 +2924,7 @@ snapshots: seroval-plugins: 1.5.6(seroval@1.5.6) solid-js: 2.0.0-rc.3 - '@storybook/builder-vite@10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': - dependencies: - '@storybook/csf-plugin': 10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - storybook: 10.5.10(prettier@3.5.3)(react@19.2.8) - ts-dedent: 2.3.0 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - transitivePeerDependencies: - - esbuild - - rollup - - webpack - - '@storybook/csf-plugin@10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': - dependencies: - storybook: 10.5.10(prettier@3.5.3)(react@19.2.8) - unplugin: 2.3.11 - optionalDependencies: - esbuild: 0.25.3 - rollup: 4.40.0 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - - '@storybook/global@5.0.0': {} - - '@storybook/icons@2.1.0(react@19.2.8)': - dependencies: - react: 19.2.8 + '@standard-schema/spec@1.1.0': {} '@testing-library/dom@10.4.1': dependencies: @@ -5317,12 +2946,6 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/user-event@14.6.6(@testing-library/dom@10.4.1)': - dependencies: - '@testing-library/dom': 10.4.1 - - '@tootallnate/once@2.0.0': {} - '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -5332,24 +2955,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 '@types/chai@5.2.3': dependencies: @@ -5360,31 +2983,6 @@ snapshots: '@types/estree@1.0.7': {} - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 20.17.31 - - '@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@29.5.14': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - - '@types/jsdom@20.0.1': - dependencies: - '@types/node': 20.17.31 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - '@types/json-schema@7.0.15': {} '@types/node@20.17.31': @@ -5393,16 +2991,6 @@ snapshots: '@types/semver@7.7.0': {} - '@types/stack-utils@2.0.3': {} - - '@types/tough-cookie@4.0.5': {} - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.33': - dependencies: - '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5489,73 +3077,69 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript/typescript6@6.0.2': - dependencies: - '@typescript/old': typescript@6.0.3 - '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.2.4': + '@vitest/coverage-v8@4.1.11(vitest@4.1.11)': dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.11 + ast-v8-to-istanbul: 1.0.5 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.4 + obug: 2.1.4 + std-env: 4.2.0 + tinyrainbow: 3.1.1 + vitest: 4.1.11(@types/node@20.17.31)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - '@vitest/pretty-format@3.2.4': + '@vitest/expect@4.1.11': dependencies: - tinyrainbow: 2.0.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + chai: 6.2.2 + tinyrainbow: 3.1.1 - '@vitest/spy@3.2.4': + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': dependencies: - tinyspy: 4.0.4 + '@vitest/spy': 4.1.11 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - '@vitest/utils@3.2.4': + '@vitest/pretty-format@4.1.11': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.1 - '@volar/language-core@2.4.28': + '@vitest/runner@4.1.11': dependencies: - '@volar/source-map': 2.4.28 - - '@volar/source-map@2.4.28': {} + '@vitest/utils': 4.1.11 + pathe: 2.0.3 - '@volar/typescript@2.4.28': + '@vitest/snapshot@4.1.11': dependencies: - '@volar/language-core': 2.4.28 - path-browserify: 1.0.1 - vscode-uri: 3.2.0 + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 + magic-string: 0.30.21 + pathe: 2.0.3 - '@webcontainer/env@1.1.1': {} + '@vitest/spy@4.1.11': {} - abab@2.0.6: {} - - acorn-globals@7.0.1: + '@vitest/utils@4.1.11': dependencies: - acorn: 8.14.1 - acorn-walk: 8.3.4 + '@vitest/pretty-format': 4.1.11 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.1 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.1 - acorn@8.14.1: {} - acorn@8.18.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5563,10 +3147,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -5581,109 +3161,21 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - array-union@2.1.0: {} - - assertion-error@2.0.1: {} - - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - - asynckit@0.4.0: {} - - babel-jest@29.7.0(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.10) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.26.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): + argparse@2.0.1: {} + + aria-query@5.3.0: dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) - - babel-preset-jest@29.6.3(@babel/core@7.26.10): + dequal: 2.0.3 + + array-union@2.1.0: {} + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.5: dependencies: - '@babel/core': 7.26.10 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 babel-preset-solid@2.0.0-rc.2(@babel/core@7.26.10)(solid-js@2.0.0-rc.3): dependencies: @@ -5694,6 +3186,10 @@ snapshots: balanced-match@1.0.2: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -5714,16 +3210,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) - 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 - bundle-require@5.1.0(esbuild@0.25.3): dependencies: esbuild: 0.25.3 @@ -5731,64 +3217,27 @@ snapshots: cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - callsites@3.1.0: {} - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - caniuse-lite@1.0.30001715: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - char-regex@1.0.2: {} - - check-error@2.1.3: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 - ci-info@3.9.0: {} - - cjs-module-lexer@1.4.3: {} - - 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.2: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@4.1.1: {} concat-map@0.0.1: {} @@ -5797,82 +3246,40 @@ snapshots: convert-source-map@2.0.0: {} - core-js-compat@3.41.0: - dependencies: - browserslist: 4.24.4 - - create-jest@29.7.0(@types/node@20.17.31): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.31) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css.escape@1.5.1: {} - - cssom@0.3.8: {} - - cssom@0.5.0: {} - - cssstyle@2.3.0: + css-tree@3.2.1: dependencies: - cssom: 0.3.8 + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css.escape@1.5.1: {} csstype@3.1.3: {} - data-urls@3.0.2: + data-urls@7.0.0: dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' debug@4.4.0: dependencies: ms: 2.1.3 - decimal.js@10.5.0: {} - - dedent@1.5.3: {} - - deep-eql@5.0.2: {} + decimal.js@10.6.0: {} deep-is@0.1.4: {} - deepmerge@4.3.1: {} - - default-browser-id@5.0.1: {} - - default-browser@5.5.1: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - - define-lazy-prop@3.0.0: {} - - delayed-stream@1.0.0: {} - dequal@2.0.3: {} detect-libc@2.1.2: {} - detect-newline@3.1.0: {} - - diff-sequences@29.6.3: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -5885,46 +3292,19 @@ snapshots: dom-accessibility-api@0.6.3: {} - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - eastasianwidth@0.2.0: {} electron-to-chromium@1.5.143: {} - emittery@0.13.1: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} entities@6.0.0: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 + entities@8.0.0: {} - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + es-module-lexer@2.3.2: {} esbuild-plugin-solid@0.5.0(esbuild@0.25.3)(solid-js@2.0.0-rc.3): dependencies: @@ -5968,18 +3348,8 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): dependencies: escape-string-regexp: 1.0.5 @@ -6044,8 +3414,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -6056,29 +3424,13 @@ snapshots: estraverse@5.3.0: {} - esutils@2.0.3: {} - - execa@5.1.1: + estree-walker@3.0.3: 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 + '@types/estree': 1.0.7 - exit@0.1.2: {} + esutils@2.0.3: {} - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + expect-type@1.4.0: {} fast-deep-equal@3.1.3: {} @@ -6098,10 +3450,6 @@ snapshots: dependencies: reusify: 1.1.0 - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -6118,11 +3466,6 @@ snapshots: dependencies: to-regex-range: 5.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 @@ -6141,13 +3484,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - framer-motion@13.1.1(react@19.2.8): dependencies: motion-dom: 13.1.1 @@ -6158,37 +3494,14 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@2.3.3: + fsevents@2.3.2: optional: true - function-bind@1.1.2: {} + fsevents@2.3.3: + optional: true gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-package-type@0.1.0: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@6.0.1: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6230,53 +3543,20 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - graphemer@1.4.0: {} has-flag@4.0.0: {} - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: + html-encoding-sniffer@6.0.0: dependencies: - function-bind: 1.1.2 - - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 + '@exodus/bytes': 1.15.1 + transitivePeerDependencies: + - '@noble/hashes' html-entities@2.3.3: {} html-escaper@2.0.2: {} - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ignore@5.3.2: {} import-fresh@3.3.1: @@ -6284,500 +3564,104 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - 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-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-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-potential-custom-element-name@1.0.1: {} - - is-stream@2.0.1: {} - - is-what@4.1.16: {} - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 - 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@4.0.1: - dependencies: - debug: 4.4.0 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - 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@29.7.0: - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - - jest-circus@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.3 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@20.17.31): - dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.31) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.31) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@20.17.31): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.17.31 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-docblock@29.7.0: - dependencies: - detect-newline: 3.1.0 - - jest-each@29.7.0: - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - - jest-environment-jsdom@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 20.17.31 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - jest-get-type@29.6.3: {} - - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.31 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@29.7.0: - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-matcher-utils@29.7.0: - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + indent-string@4.0.0: {} - jest-message-util@29.7.0: + inflight@1.0.6: dependencies: - '@babel/code-frame': 7.26.2 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + once: 1.4.0 + wrappy: 1.0.2 - jest-mock@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - jest-util: 29.7.0 + inherits@2.0.4: {} - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 + is-extglob@2.1.1: {} - jest-regex-util@29.6.3: {} + is-fullwidth-code-point@3.0.0: {} - jest-resolve-dependencies@29.7.0: + is-glob@4.0.3: dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color + is-extglob: 2.1.1 - jest-resolve@29.7.0: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.10 - resolve.exports: 2.0.3 - slash: 3.0.0 + is-number@7.0.0: {} - jest-runner@29.7.0: - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color + is-path-inside@3.0.3: {} - jest-runtime@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color + is-potential-custom-element-name@1.0.1: {} - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color + is-what@4.1.16: {} - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 + isexe@2.0.0: {} - jest-validate@29.7.0: - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 + istanbul-lib-coverage@3.2.2: {} - jest-watcher@29.7.0: + istanbul-lib-report@3.0.1: dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - jest-worker@29.7.0: + istanbul-reports@3.2.0: dependencies: - '@types/node': 20.17.31 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - jest@29.7.0(@types/node@20.17.31): + jackspeak@3.4.3: dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.31) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 joycon@3.1.1: {} - js-tokens@4.0.0: {} + js-tokens@10.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-tokens@4.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsdom@20.0.3: - dependencies: - abab: 2.0.6 - acorn: 8.14.1 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.5.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.2 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 + jsdom@30.0.1: + dependencies: + '@asamuzakjp/css-color': 6.0.7 + '@asamuzakjp/dom-selector': 8.3.2 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.12(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 - parse5: 7.3.0 + lru-cache: 11.5.2 + parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.18.1 - xml-name-validator: 4.0.0 + tough-cookie: 6.0.2 + undici: 8.10.1 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 17.1.0 + xml-name-validator: 5.0.0 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsesc@3.0.2: {} + - '@noble/hashes' jsesc@3.1.0: {} 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: {} json5@2.2.3: {} - jsonc-parser@3.3.1: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} - - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6838,46 +3722,44 @@ snapshots: load-tsconfig@0.2.5: {} - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 - lodash.debounce@4.0.8: {} - lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} - loupe@3.2.1: {} - lru-cache@10.4.3: {} + lru-cache@11.5.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 lz-string@1.5.0: {} - make-dir@4.0.0: + magic-string@0.30.21: dependencies: - semver: 7.7.1 + '@jridgewell/sourcemap-codec': 1.6.0 + + magicast@0.5.4: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 - makeerror@1.0.12: + make-dir@4.0.0: dependencies: - tmpl: 1.0.5 + semver: 7.7.1 - math-intrinsics@1.1.0: {} + mdn-data@2.27.1: {} merge-anything@5.1.7: dependencies: is-what: 4.1.16 - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -6885,14 +3767,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mimic-fn@2.1.0: {} - min-indent@1.0.1: {} minimatch@3.1.2: @@ -6927,35 +3801,16 @@ snapshots: natural-compare@1.4.0: {} - node-int64@0.4.0: {} - node-releases@2.0.19: {} - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - nwsapi@2.2.20: {} - object-assign@4.1.1: {} + obug@2.1.4: {} + once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@10.2.0: - dependencies: - default-browser: 5.5.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - wsl-utils: 0.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6965,89 +3820,27 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxc-parser@0.127.0: - dependencies: - '@oxc-project/types': 0.127.0 - optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.127.0 - '@oxc-parser/binding-android-arm64': 0.127.0 - '@oxc-parser/binding-darwin-arm64': 0.127.0 - '@oxc-parser/binding-darwin-x64': 0.127.0 - '@oxc-parser/binding-freebsd-x64': 0.127.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 - '@oxc-parser/binding-linux-arm64-musl': 0.127.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 - '@oxc-parser/binding-linux-x64-gnu': 0.127.0 - '@oxc-parser/binding-linux-x64-musl': 0.127.0 - '@oxc-parser/binding-openharmony-arm64': 0.127.0 - '@oxc-parser/binding-wasm32-wasi': 0.127.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 - '@oxc-parser/binding-win32-x64-msvc': 0.127.0 - - oxc-resolver@11.21.2: - optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.21.2 - '@oxc-resolver/binding-android-arm64': 11.21.2 - '@oxc-resolver/binding-darwin-arm64': 11.21.2 - '@oxc-resolver/binding-darwin-x64': 11.21.2 - '@oxc-resolver/binding-freebsd-x64': 11.21.2 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.2 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.2 - '@oxc-resolver/binding-linux-arm64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-arm64-musl': 11.21.2 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-riscv64-musl': 11.21.2 - '@oxc-resolver/binding-linux-s390x-gnu': 11.21.2 - '@oxc-resolver/binding-linux-x64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-x64-musl': 11.21.2 - '@oxc-resolver/binding-openharmony-arm64': 11.21.2 - '@oxc-resolver/binding-wasm32-wasi': 11.21.2 - '@oxc-resolver/binding-win32-arm64-msvc': 11.21.2 - '@oxc-resolver/binding-win32-x64-msvc': 11.21.2 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - 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: {} - package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse5@7.3.0: dependencies: entities: 6.0.0 - path-browserify@1.0.1: {} + parse5@8.0.1: + dependencies: + entities: 8.0.0 path-exists@4.0.0: {} @@ -7055,8 +3848,6 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -7064,7 +3855,7 @@ snapshots: path-type@4.0.0: {} - pathval@2.0.1: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -7076,9 +3867,13 @@ snapshots: pirates@4.0.7: {} - pkg-dir@4.2.0: + playwright-core@1.62.1: {} + + playwright@1.62.1: dependencies: - find-up: 4.1.0 + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 postcss-load-config@6.0.1(postcss@8.5.26): dependencies: @@ -7102,97 +3897,30 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - punycode@2.3.1: {} - pure-rand@6.1.0: {} - - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} react-is@17.0.2: {} - react-is@18.3.1: {} - - react@19.2.8: {} + react@19.2.8: + optional: true readdirp@4.1.2: {} - recast@0.23.21: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - regenerator-runtime@0.14.1: {} - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.27.0 - - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - - regjsgen@0.8.0: {} - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - require-directory@2.1.1: {} - - requires-port@1.0.0: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 + require-from-string@2.0.2: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve.exports@2.0.3: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} rimraf@3.0.2: @@ -7246,14 +3974,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 - run-applescript@7.1.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safer-buffer@2.1.2: {} - saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -7262,8 +3986,6 @@ snapshots: semver@7.7.1: {} - semver@7.8.5: {} - seroval-plugins@1.5.6(seroval@1.5.6): dependencies: seroval: 1.5.6 @@ -7276,12 +3998,10 @@ snapshots: shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} + siginfo@2.0.0: {} signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - slash@3.0.0: {} solid-js@2.0.0-rc.3: @@ -7293,73 +4013,13 @@ 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: {} - source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - sprintf-js@1.0.3: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - storybook-solidjs-vite@10.7.1(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(esbuild@0.25.3)(rollup@4.40.0)(solid-js@2.0.0-rc.3)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): - dependencies: - '@storybook/builder-vite': 10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - '@storybook/global': 5.0.0 - '@typescript/typescript6': 6.0.2 - '@volar/language-core': 2.4.28 - '@volar/typescript': 2.4.28 - semver: 7.8.5 - solid-js: 2.0.0-rc.3 - storybook: 10.5.10(prettier@3.5.3)(react@19.2.8) - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vite-plugin-solid: 3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - optionalDependencies: - '@solidjs/web': 2.0.0-rc.3(solid-js@2.0.0-rc.3) - typescript: 5.8.3 - transitivePeerDependencies: - - esbuild - - rollup - - webpack - - storybook@10.5.10(prettier@3.5.3)(react@19.2.8): - dependencies: - '@storybook/global': 5.0.0 - '@storybook/icons': 2.1.0(react@19.2.8) - '@testing-library/dom': 10.4.1 - '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) - '@vitest/expect': 3.2.4 - '@vitest/spy': 3.2.4 - '@webcontainer/env': 1.1.1 - esbuild: 0.25.3 - jsonc-parser: 3.3.1 - open: 10.2.0 - oxc-parser: 0.127.0 - oxc-resolver: 11.21.2 - recast: 0.23.21 - semver: 7.8.5 - use-sync-external-store: 1.6.0(react@19.2.8) - ws: 8.21.3 - optionalDependencies: - prettier: 3.5.3 - transitivePeerDependencies: - - bufferutil - - react - - utf-8-validate + stackback@0.0.2: {} - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 + std-env@4.2.0: {} string-width@4.2.3: dependencies: @@ -7381,10 +4041,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -7405,20 +4061,8 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: {} - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - text-table@0.2.0: {} thenify-all@1.6.0: @@ -7429,10 +4073,12 @@ snapshots: dependencies: any-promise: 1.3.0 - tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} + tinyexec@1.3.0: {} + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -7443,28 +4089,27 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinyrainbow@2.0.0: {} + tinyrainbow@3.1.1: {} - tinyspy@4.0.4: {} + tldts-core@7.4.11: {} - tmpl@1.0.5: {} + tldts@7.4.11: + dependencies: + tldts-core: 7.4.11 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tough-cookie@4.1.4: + tough-cookie@6.0.2: dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + tldts: 7.4.11 tr46@1.0.1: dependencies: punycode: 2.3.1 - tr46@3.0.0: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -7474,8 +4119,6 @@ snapshots: dependencies: typescript: 5.8.3 - ts-dedent@2.3.0: {} - ts-interface-checker@0.1.13: {} tslib@2.8.1: {} @@ -7520,37 +4163,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} - typescript@5.8.3: {} - typescript@6.0.3: {} - undici-types@6.19.8: {} - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.2.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - - universalify@0.2.0: {} - - unplugin@2.3.11: - dependencies: - '@jridgewell/remapping': 2.3.5 - acorn: 8.18.0 - picomatch: 4.0.7 - webpack-virtual-modules: 0.6.2 + undici@8.10.1: {} update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: @@ -7562,34 +4181,8 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - use-sync-external-store@1.6.0(react@19.2.8): - dependencies: - react: 19.2.8 - - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - validate-html-nesting@1.2.2: {} - vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): - dependencies: - '@solidjs/vite-plugin': 3.0.0-next.36(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - transitivePeerDependencies: - - '@solidjs/start-devtools' - - '@solidjs/web' - - '@testing-library/jest-dom' - - solid-js - - supports-color - - vite - vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3): dependencies: lightningcss: 1.33.0 @@ -7606,32 +4199,60 @@ snapshots: optionalDependencies: vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vscode-uri@3.2.0: {} - - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 + vitest@4.1.11(@types/node@20.17.31)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + '@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.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.31 + '@vitest/coverage-v8': 4.1.11(vitest@4.1.11) + jsdom: 30.0.1 + transitivePeerDependencies: + - msw - walker@1.0.8: + w3c-xmlserializer@5.0.0: dependencies: - makeerror: 1.0.12 + xml-name-validator: 5.0.0 webidl-conversions@4.0.2: {} - webidl-conversions@7.0.0: {} + webidl-conversions@8.0.1: {} - webpack-virtual-modules@0.6.2: {} + whatwg-mimetype@5.0.0: {} - whatwg-encoding@2.0.0: + whatwg-url@16.0.1: dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@3.0.0: {} + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' - whatwg-url@11.0.0: + whatwg-url@17.1.0: dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' whatwg-url@7.1.0: dependencies: @@ -7643,6 +4264,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -7659,37 +4285,10 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - ws@8.18.1: {} - - ws@8.21.3: {} - - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.1 - - xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} - y18n@5.0.8: {} - yallist@3.1.1: {} - 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 - yocto-queue@0.1.0: {} diff --git a/src/engine.ts b/src/engine.ts index fe99d7f..5950de5 100644 --- a/src/engine.ts +++ b/src/engine.ts @@ -66,7 +66,8 @@ per-value override syntax: of its own completes almost instantly instead of over the base duration). Merging here keeps the documented, more ergonomic behavior working. */ -function normalizeTransition(transition: unknown): AnimationOptions | undefined { +/** @internal exported for tests: this compat shim is easier to check directly */ +export function normalizeTransition(transition: unknown): AnimationOptions | undefined { if (!transition || typeof transition !== "object") return transition as AnimationOptions | undefined diff --git a/stories/Animate.stories.tsx b/stories/Animate.stories.tsx deleted file mode 100644 index ffa6327..0000000 --- a/stories/Animate.stories.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Animate", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", -} as const - -/** `initial` -> `animate`: the element animates from its initial style to the animate target on mount. */ -export const BasicEnter: Story = { - render: () => ( - - ), -} - -/** `initial={false}`: the enter animation is skipped — `animate` values apply immediately, no transition. */ -export const InitialFalse: Story = { - render: () => , -} - -/** When `initial` and `animate` resolve to the same target, no animation runs and `onMotionComplete` never fires. */ -export const NoOpWhenEqual: Story = { - render: () => { - const target = {opacity: 0.6} - let fired = false - return ( -
- (fired = true)} - /> -

- If this library is working correctly, no animation ever starts here (no - onMotionComplete), since initial already equals animate. -

-
- ) - }, -} - -/** Changing a signal fed into `animate` reactively re-triggers the animation to the new target. */ -export const ReactiveAnimateChange: Story = { - render: () => { - const [color, setColor] = createSignal("crimson") - return ( -
- setColor(c => (c === "crimson" ? "royalblue" : "crimson"))} - > - Toggle color - - -
- ) - }, -} diff --git a/stories/Gestures.stories.tsx b/stories/Gestures.stories.tsx deleted file mode 100644 index 3a2ee72..0000000 --- a/stories/Gestures.stories.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Gestures", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", -} as const - -/** `hover` — hovering the box animates it to the hover target; leaving animates back. */ -export const Hover: Story = { - render: () => { - const [status, setStatus] = createSignal("idle") - return ( -
-

hover: {status()}

- setStatus("active")} - onHoverEnd={() => setStatus("idle")} - /> -
- ) - }, -} - -/** `press` — pressing and releasing animates to/from the press target. */ -export const Press: Story = { - render: () => { - const [status, setStatus] = createSignal("idle") - return ( -
-

press: {status()}

- setStatus("active")} - onPressEnd={() => setStatus("idle")} - /> -
- ) - }, -} - -/** - * `hover` + `press` together: computeEffectiveTarget layers press on top of hover - * (`Object.assign` order), so pressing while already hovering should show the - * press target win over the hover one for any overlapping keys. - */ -export const HoverAndPressComposition: Story = { - render: () => { - const [hoverStatus, setHoverStatus] = createSignal("idle") - const [pressStatus, setPressStatus] = createSignal("idle") - return ( -
-

hover: {hoverStatus()}

-

press: {pressStatus()}

-

- Hover first (scales to 1.15, turns orange), then press while hovering (should - scale to 0.85, turn crimson). -

- setHoverStatus("active")} - onHoverEnd={() => setHoverStatus("idle")} - onPressStart={() => setPressStatus("active")} - onPressEnd={() => setPressStatus("idle")} - /> -
- ) - }, -} diff --git a/stories/InView.stories.tsx b/stories/InView.stories.tsx deleted file mode 100644 index 33c50d8..0000000 --- a/stories/InView.stories.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/InView", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "seagreen", -} as const - -/** - * `inView` — scroll the box into the viewport to trigger its inView target; - * scroll it back out to reverse. This prop has no automated test coverage - * (relies on IntersectionObserver, which jsdom doesn't implement), so this - * story is the first real, browser-driven verification of it. - */ -export const ScrollTrigger: Story = { - render: () => { - const [status, setStatus] = createSignal("not yet") - return ( -
-

- inView: {status()} -

-

Scroll down to bring the box into view.

-
- setStatus("entered")} - onViewLeave={() => setStatus("left")} - /> -
-
- ) - }, -} - -/** `inViewOptions.amount` — requires more of the element to be visible before triggering. */ -export const AmountOption: Story = { - render: () => { - const [status, setStatus] = createSignal("not yet") - return ( -
-

- inView (amount: 0.8): {status()} -

-

Requires 80% of the box visible before triggering — scroll slowly.

-
- setStatus("entered")} - onViewLeave={() => setStatus("left")} - /> -
-
- ) - }, -} diff --git a/stories/Motion.stories.tsx b/stories/Motion.stories.tsx deleted file mode 100644 index 456ba43..0000000 --- a/stories/Motion.stories.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Rendering", -} satisfies Meta - -export default meta -type Story = StoryObj - -/** `` renders a `div` by default. */ -export const DefaultTag: Story = { - render: () => ( - - ), -} - -/** `Motion.span`, `Motion.button`, `Motion.svg` etc. — the Proxy picks the tag from the property accessed. */ -export const ProxyTags: Story = { - render: () => ( -
- - span - - button - - - -
- ), -} - -/** `` — the same tag selection via an explicit prop instead of the proxy. */ -export const ExplicitTagProp: Story = { - render: () => ( -
    - - rendered as <li> - -
- ), -} - -/** SVG attributes (`viewBox`, `width`, `x`, `y`) pass through alongside animated values. */ -export const SvgAttrs: Story = { - render: () => ( - - - - ), -} - -/** A user-supplied `style` (object or CSS string) is merged with Motion's computed style, not replaced by it. */ -export const StyleMerging: Story = { - render: () => ( -
- - -
- ), -} diff --git a/stories/Presence.stories.tsx b/stories/Presence.stories.tsx deleted file mode 100644 index 85b1ff5..0000000 --- a/stories/Presence.stories.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {expect, userEvent, waitFor, within} from "storybook/test" -import {createSignal, Show} from "solid-js" -import {Motion, Presence} from "../src/index.jsx" - -const meta = { - title: "Motion/Presence", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", -} as const - -/** - * Basic enter/exit: removing the element from a `` inside `` - * animates it out via `exit` before it actually leaves the DOM (rather than - * disappearing instantly). The play function drives the toggle and proves - * the element is still present mid-exit, then gone once the animation ends — - * then toggles back on so the story doesn't land on an empty canvas. - */ -export const BasicEnterExit: Story = { - render: () => { - const [show, setShow] = createSignal(true) - return ( -
- - - - - - -
- ) - }, - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - await waitFor(() => expect(canvas.getByTestId("box")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - // still present immediately after toggling off — exit animation hasn't finished - expect(canvas.getByTestId("box")).toBeInTheDocument() - // gone once the exit animation completes and Presence removes it - await waitFor(() => expect(canvas.queryByTestId("box")).not.toBeInTheDocument(), { - timeout: 3000, - }) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.getByTestId("box")).toBeInTheDocument()) - }, -} - -/** - * `` suppresses the *first* enter animation for - * every child — the `animate` target applies immediately instead. - */ -export const PresenceInitialFalse: Story = { - render: () => ( - - - - ), - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - const el = canvas.getByTestId("box") as HTMLElement - // applied immediately (no 2s transition ever ran) — opacity is already 1 - await waitFor(() => expect(getComputedStyle(el).opacity).toBe("1")) - }, -} - -/** - * `exitBeforeEnter` (mode "out-in"): the incoming element's enter animation - * waits for the outgoing element's exit to finish, instead of running in - * parallel. This exercises the exact multi-cycle swap that used to hang in - * jsdom (fixed by scoping mount-cycle cleanup in engine.ts) — this story is - * its permanent, real-browser regression check. - */ -export const ExitBeforeEnter: Story = { - render: () => { - const [condition, setCondition] = createSignal(true) - const El = (props: {label: string; color: string}) => ( - - ) - return ( -
- - - } - fallback={} - /> - -
- ) - }, - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - await waitFor(() => expect(canvas.getByTestId("box-a")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - // box-a exits first; box-b must not appear until box-a is fully gone - await waitFor(() => expect(canvas.queryByTestId("box-a")).not.toBeInTheDocument(), { - timeout: 2000, - }) - await waitFor(() => expect(canvas.getByTestId("box-b")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.queryByTestId("box-b")).not.toBeInTheDocument(), { - timeout: 2000, - }) - await waitFor(() => expect(canvas.getByTestId("box-a")).toBeInTheDocument()) - }, -} - -/** - * Multiple nested descendants each have their own `exit` — every one must - * finish its own exit animation before the whole subtree is removed. - */ -export const NestedExit: Story = { - render: () => { - const [show, setShow] = createSignal(true) - const exit = {opacity: 0, transition: {duration: 0.5}} - return ( -
- - - - - - - - -
- ) - }, - // round-trips back to the visible state so the story doesn't land on an - // empty canvas after the automated demonstration finishes — a 0.001s - // duration (fast enough for jsdom-based unit tests) also finishes far too - // quickly to actually see, so this uses a human-visible 0.5s instead. - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - await waitFor(() => expect(canvas.getByTestId("parent")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.queryByTestId("parent")).not.toBeInTheDocument(), { - timeout: 2000, - }) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.getByTestId("parent")).toBeInTheDocument()) - }, -} - -/** `exit` can carry its own `transition`, overriding the component's base transition just for the exit phase. */ -export const ExitTransitionOverride: Story = { - render: () => { - const [show, setShow] = createSignal(true) - return ( -
- - - - - - -
- ) - }, -} diff --git a/stories/Primitives.stories.tsx b/stories/Primitives.stories.tsx deleted file mode 100644 index 81e0f84..0000000 --- a/stories/Primitives.stories.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {motion, useScroll} from "../src/index.jsx" - -const meta = { - title: "Motion/Primitives", -} satisfies Meta - -export default meta -type Story = StoryObj - -/** - * The `motion` ref factory is the non-component API: bind animation - * behavior directly to a plain element's `ref`, without going through - * ``. Useful for animating an element you don't otherwise control - * (e.g. one rendered by another library). - */ -export const RefFactory: Story = { - render: () => ( -
({ - initial: {opacity: 0, y: -20}, - animate: {opacity: 1, y: 0}, - transition: {duration: 0.6}, - }))} - style={{ - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", - }} - /> - ), -} - -/** The ref factory's options accessor is reactive, same as a `` component's props. */ -export const ReactiveRefFactory: Story = { - render: () => { - const [opacity, setOpacity] = createSignal(0.3) - return ( -
- -
({ - initial: {opacity: 0}, - animate: {opacity: opacity()}, - transition: {duration: 0.4}, - }))} - style={{ - width: "80px", - height: "80px", - "border-radius": "8px", - background: "seagreen", - }} - /> -
- ) - }, -} - -/** - * `useScroll` exposes reactive page-scroll progress (0–1) for driving - * scroll-linked animations — scroll the story's canvas to see the bar fill. - */ -export const ScrollProgress: Story = { - render: () => { - const {scrollY} = useScroll() - return ( -
-
-
- Scroll down to progress the bar above. -
-
- ) - }, -} diff --git a/stories/Transition.stories.tsx b/stories/Transition.stories.tsx deleted file mode 100644 index 03bb1b8..0000000 --- a/stories/Transition.stories.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Transition", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", -} as const - -/** Global `transition`: `duration` plus `easing` (Motion One's naming — translated internally to modern Motion's `ease`). */ -export const GlobalTransition: Story = { - render: () => ( - - ), -} - -/** Per-property transition override: `rotate` runs on its own, slower schedule than the other properties. */ -export const PerPropertyOverride: Story = { - render: () => ( - - ), -} - -/** Per-target transition override: the target object's own `transition` wins over the component-level one. */ -export const PerTargetOverride: Story = { - render: () => ( - - ), -} - -/** Keyframe arrays: `x` steps through every value in the array, evenly spaced across `duration`. */ -export const KeyframeArray: Story = { - render: () => ( - - ), -} - -/** Keyframes with a custom `offset`: skews where in the timeline each step lands. */ -export const KeyframeOffset: Story = { - render: () => ( - - ), -} diff --git a/stories/Variants.stories.tsx b/stories/Variants.stories.tsx deleted file mode 100644 index 3a353a3..0000000 --- a/stories/Variants.stories.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Variants", -} satisfies Meta - -export default meta -type Story = StoryObj - -/** String `variants`: `initial`/`animate` reference a key that's looked up in the `variants` map. */ -export const StringVariants: Story = { - render: () => ( - - ), -} - -/** - * Nested variant-key *inheritance*: only the root sets `initial="hidden"`. - * Each descendant has no `initial` of its own, so it inherits the *key* - * "hidden" from its closest ancestor and resolves it against its *own* - * `variants` map — matching ssr.test.tsx's "Children render inherited - * initial" case, extended here with an explicit `animate="visible"` per - * level (inheritance only applies to `initial`, not `animate`) so the - * whole tree visibly animates in. - */ -export const NestedInheritance: Story = { - render: () => ( - - - - Each level inherits the "hidden" key, resolved against its own variants. - - - - ), -} - -/** An empty `variants={{}}` map combined with `hover`/`press` — no crash, base (unstyled) render. */ -export const EmptyVariants: Story = { - render: () => ( - - ), -} diff --git a/test/engine.test.tsx b/test/engine.test.tsx new file mode 100644 index 0000000..b65d1a8 --- /dev/null +++ b/test/engine.test.tsx @@ -0,0 +1,234 @@ +import {createStyles, createMotionState, mountedStates, normalizeTransition} from "../src/engine.js" + +const sleep = (ms: number): Promise => new Promise(resolve => setTimeout(resolve, ms)) + +/* +motion-dom filters out non-primary pointers, and jsdom's PointerEvent +defaults to an empty `pointerType` with `isPrimary: false`, which the filter +rejects. These spell out a plain left-button mouse press. +*/ +const pointer = (type: string): PointerEvent => + new PointerEvent(type, {bubbles: true, pointerType: "mouse", button: 0, isPrimary: true}) + +/** An element attached to the document, since Motion reads computed style off it. */ +function mounted(): HTMLDivElement { + const el = document.createElement("div") + document.body.appendChild(el) + return el +} + +describe("createStyles", () => { + test("Maps transform shorthands onto a transform declaration", () => { + expect(createStyles({x: 100, scale: 1.5})).toEqual({ + transform: "translateX(100px) scale(1.5)", + }) + }) + + test("Uses the first value of a keyframe list", () => { + // a static style can't represent a list, so the starting frame is used + expect(createStyles({opacity: [0.2, 0.9]})).toEqual({opacity: 0.2}) + }) + + test("Passes CSS custom properties through", () => { + expect(createStyles({"--brand": "red"})).toEqual({"--brand": "red"}) + }) + + test("Ignores a target's own transition", () => { + expect(createStyles({opacity: 1, transition: {duration: 5}})).toEqual({opacity: 1}) + }) + + test("Returns nothing for an empty target", () => { + expect(createStyles({})).toEqual({}) + }) +}) + +describe("normalizeTransition", () => { + test("Passes a non-object transition straight through", () => { + expect(normalizeTransition(undefined)).toBeUndefined() + expect(normalizeTransition(null)).toBeNull() + }) + + test("Renames Motion One's `easing` to `ease`", () => { + expect(normalizeTransition({duration: 1, easing: "ease-in-out"})).toEqual({ + duration: 1, + ease: "ease-in-out", + }) + }) + + test("A per-value override inherits what it does not restate", () => { + expect(normalizeTransition({duration: 1, ease: "linear", rotate: {duration: 2}})).toEqual({ + duration: 1, + ease: "linear", + rotate: {duration: 2, ease: "linear"}, + }) + }) + + test("Renames `easing` inside a per-value override too", () => { + expect(normalizeTransition({duration: 1, x: {easing: "linear"}})).toEqual({ + duration: 1, + x: {duration: 1, ease: "linear"}, + }) + }) + + test("Treats an array value as a base option, not an override", () => { + // `ease` as a cubic bezier is an array, and must not be read as a per-value override + expect(normalizeTransition({duration: 1, ease: [0.4, 0, 0.2, 1]})).toEqual({ + duration: 1, + ease: [0.4, 0, 0.2, 1], + }) + }) +}) + +describe("createMotionState", () => { + test("Applies the start target on mount and registers the element", () => { + const el = mounted() + const state = createMotionState({initial: {opacity: 0.25}}) + const unmount = state.mount(el) + + expect(el.style.opacity).toBe("0.25") + expect(mountedStates.get(el)).toBe(state) + + unmount() + expect(mountedStates.has(el)).toBe(false) + }) + + test("Resolves initial through the variants map", () => { + const state = createMotionState({ + initial: "hidden", + variants: {hidden: {opacity: 0.1}}, + }) + expect(state.getTarget()).toEqual({opacity: 0.1}) + }) + + test("initial={false} starts on the animate target", () => { + const state = createMotionState({initial: false, animate: {opacity: 0.7}}) + expect(state.getTarget()).toEqual({opacity: 0.7}) + }) + + test("An unset initial inherits the parent's variant key", () => { + const parent = createMotionState({initial: "hidden", variants: {hidden: {opacity: 0}}}) + const child = createMotionState({variants: {hidden: {opacity: 0.4}}}, parent) + + expect(child.getInitialVariantKey()).toBe("hidden") + // resolved against the child's own variants, not the parent's + expect(child.getTarget()).toEqual({opacity: 0.4}) + }) + + test("An unset initial with no ancestor key starts empty", () => { + expect(createMotionState({animate: {opacity: 1}}).getTarget()).toEqual({}) + }) + + test("getOptions reports the latest options", () => { + const state = createMotionState({animate: {opacity: 0.2}}) + state.update({animate: {opacity: 0.6}}) + expect(state.getOptions()).toEqual({animate: {opacity: 0.6}}) + }) + + test("A press gesture layers over animate, and reverts on release", async () => { + const el = mounted() + const state = createMotionState({ + animate: {opacity: 1}, + press: {opacity: 0.3}, + transition: {duration: 0.001}, + }) + const unmount = state.mount(el) + + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.opacity).toBe("0.3") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + expect(el.style.opacity).toBe("1") + + unmount() + }) + + test("Gestures are rebound when one is added and unbound on unmount", async () => { + const el = mounted() + const state = createMotionState({animate: {opacity: 1}, transition: {duration: 0.001}}) + const unmount = state.mount(el) + + // no press gesture yet, so the pointer event does nothing + el.dispatchEvent(pointer("pointerdown")) + await sleep(30) + expect(el.style.opacity).toBe("1") + + state.update({animate: {opacity: 1}, press: {opacity: 0.2}, transition: {duration: 0.001}}) + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.opacity).toBe("0.2") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + + unmount() + // after unmount the gesture is unbound, so this must not animate anything + el.dispatchEvent(pointer("pointerdown")) + await sleep(30) + expect(el.style.opacity).toBe("1") + }) + + test("An exit target with no values still resolves", async () => { + const el = mounted() + const state = createMotionState({animate: {opacity: 1}, exit: "missing"}) + const unmount = state.mount(el) + + let completed = false + el.addEventListener("motioncomplete", () => (completed = true)) + + await state.setActive("exit", true) + expect(completed).toBe(true) + + unmount() + }) + + test("update() is ignored while the element is exiting", async () => { + const el = mounted() + const state = createMotionState({ + animate: {opacity: 1}, + exit: {opacity: 0}, + transition: {duration: 0.001}, + }) + const unmount = state.mount(el) + + await state.setActive("exit", true) + expect(el.style.opacity).toBe("0") + + state.update({ + animate: {opacity: 0.9}, + exit: {opacity: 0}, + transition: {duration: 0.001}, + }) + await sleep(50) + // still on the exit target rather than the new animate one + expect(el.style.opacity).toBe("0") + + unmount() + }) + + test("A remount clears the exit flag", async () => { + const el = mounted() + const state = createMotionState({ + animate: {opacity: 0.5}, + exit: {opacity: 0}, + transition: {duration: 0.001}, + }) + + let unmount = state.mount(el) + await state.setActive("exit", true) + unmount() + + unmount = state.mount(el) + await sleep(50) + expect(el.style.opacity).toBe("0.5") + + unmount() + }) + + test("Animating with no element in play is a no-op", async () => { + const state = createMotionState({animate: {opacity: 1}, exit: {opacity: 0}}) + // never mounted, so there is nothing to animate and nothing to throw + await expect(state.setActive("exit", true)).resolves.toBeUndefined() + }) +}) diff --git a/test/motion.test.tsx b/test/motion.test.tsx index c20ffe9..b59cd27 100644 --- a/test/motion.test.tsx +++ b/test/motion.test.tsx @@ -78,27 +78,34 @@ describe("Motion", () => { }) test("Animation runs when target changes", async () => { - const result = await new Promise(resolve => - createRoot(dispose => { - const Component = (props: any): JSX.Element => { - return ( - { - if (detail.target.opacity === 0.8) resolve(true) - }} - transition={{duration}} - /> - ) - } - const [animate, setAnimate] = createSignal({opacity: 0.5}) - render(() => ) - setAnimate({opacity: 0.8}) - setTimeout(dispose, 20) - }), + const Component = (props: any): JSX.Element => ( + { + if (detail.target.opacity === 0.8) resolve(true) + }} + transition={{duration}} + /> ) - expect(result).toBe(true) + + let resolve!: (value: boolean) => void + const completed = new Promise(r => (resolve = r)) + + /* + The signal lives outside the root, and is written to after it: Solid 2.0 + rejects writes made from inside an owned scope. + */ + const [animate, setAnimate] = createSignal({opacity: 0.5}) + const dispose = createRoot(dispose => { + render(() => ) + return dispose + }) + + setAnimate({opacity: 0.8}) + + expect(await completed).toBe(true) + dispose() }) test("Accepts default transition", async () => { diff --git a/test/primitives.test.tsx b/test/primitives.test.tsx index c4065f3..980b66c 100644 --- a/test/primitives.test.tsx +++ b/test/primitives.test.tsx @@ -1,7 +1,7 @@ import {createRoot, createSignal, Show} from "solid-js" import type {JSX} from "@solidjs/web" import {screen, render} from "@solidjs/testing-library" -import {Presence, VariantDefinition, motion} from "../src/index.jsx" +import {Presence, VariantDefinition, createMotion, motion, useScroll} from "../src/index.jsx" const duration = 0.001 @@ -27,7 +27,7 @@ describe("motion ref factory", () => { render(() => (
(ref = el as HTMLDivElement), + el => (ref = el), motion(() => ({ initial: {opacity: 0.4}, animate: {opacity: [0, 0.8]}, @@ -43,15 +43,26 @@ describe("motion ref factory", () => { test("Animation runs when target changes", async () => { const [opacity, setOpacity] = createSignal(0.5) - const element = createRoot(() => ( + /* + Rendered into the document rather than built in a bare createRoot: + Motion reads computed style off the element, and jsdom throws on that + for a node with no owner document. + */ + let ref!: HTMLDivElement + render(() => (
({ - initial: {opacity: 0}, - animate: {opacity: opacity()}, - transition: {duration}, - }))} + data-testid="box" + ref={[ + el => (ref = el), + motion(() => ({ + initial: {opacity: 0}, + animate: {opacity: opacity()}, + transition: {duration}, + })), + ]} /> - )) as HTMLDivElement + )) + const element = ref expect(element.style.opacity).toBe("0") @@ -74,7 +85,7 @@ describe("motion ref factory", () => { render(() => (
(ref = el as HTMLDivElement), + el => (ref = el), motion(() => ({ initial: {opacity: 0.5}, animate: {opacity: 0.9}, @@ -140,3 +151,70 @@ describe("motion ref factory", () => { })) }) }) + +describe("createMotion", () => { + test("Applies the start target to an element it is handed", () => { + const el = document.createElement("div") + document.body.appendChild(el) + + const dispose = createRoot(dispose => { + createMotion(el, {initial: {opacity: 0.35, x: 40}}) + return dispose + }) + + expect(el.style.opacity).toBe("0.35") + expect(el.style.transform).toBe("translateX(40px)") + dispose() + }) + + test("Accepts an options accessor as well as a plain object", async () => { + const el = document.createElement("div") + document.body.appendChild(el) + + const dispose = createRoot(dispose => { + createMotion(el, () => ({ + initial: {opacity: 0.2}, + animate: {opacity: 0.9}, + transition: {duration}, + })) + return dispose + }) + + await sleep(60) + expect(el.style.opacity).toBe("0.9") + dispose() + }) +}) + +describe("useScroll", () => { + test("Starts at zero on both axes", () => { + const dispose = createRoot(dispose => { + const {time, scrollX, scrollY} = useScroll() + + expect(time()).toBe(0) + expect(scrollX().progress).toBe(0) + expect(scrollY()).toMatchObject({ + current: 0, + progress: 0, + scrollLength: 0, + velocity: 0, + }) + return dispose + }) + + // unsubscribes without throwing + expect(() => dispose()).not.toThrow() + }) + + test("Accepts scroll options", () => { + const container = document.createElement("div") + document.body.appendChild(container) + + const dispose = createRoot(dispose => { + const {scrollY} = useScroll({container, axis: "y"}) + expect(scrollY().progress).toBe(0) + return dispose + }) + dispose() + }) +}) diff --git a/test/setup.js b/test/setup.js deleted file mode 100644 index 697f4c5..0000000 --- a/test/setup.js +++ /dev/null @@ -1,16 +0,0 @@ -/* -jsdom doesn't implement IntersectionObserver. This is a minimal stub so -`inView()` (used for the `inView` prop) can construct and register without -crashing; it never actually fires, so entry-triggering behavior isn't -covered by these tests. -*/ -if (typeof globalThis.IntersectionObserver === "undefined") { - globalThis.IntersectionObserver = class IntersectionObserver { - observe() {} - unobserve() {} - disconnect() {} - takeRecords() { - return [] - } - } -} diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000..fda2a9f --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,26 @@ +/* +jsdom implements neither IntersectionObserver nor the Web Animations API that +Motion drives its animations with. These are minimal stubs so the unit tests +can exercise the library's own state machine. + +`inView` behavior and real animation interpolation are covered by the +Playwright suite in `e2e/`, which runs against a real browser. +*/ + +/* eslint-disable @typescript-eslint/no-empty-function -- the stub does nothing by design */ +class IntersectionObserverStub implements IntersectionObserver { + readonly root = null + readonly rootMargin = "" + readonly thresholds: readonly number[] = [] + observe(): void {} + unobserve(): void {} + disconnect(): void {} + takeRecords(): IntersectionObserverEntry[] { + return [] + } +} + +if (typeof globalThis.IntersectionObserver === "undefined") { + globalThis.IntersectionObserver = + IntersectionObserverStub as unknown as typeof IntersectionObserver +} diff --git a/test/ssr.test.tsx b/test/ssr.test.tsx index 60aeae2..16e8e6d 100644 --- a/test/ssr.test.tsx +++ b/test/ssr.test.tsx @@ -1,11 +1,6 @@ import {renderToString} from "@solidjs/web" import {Motion, Presence} from "../src/index.jsx" -jest.mock("@solidjs/web", () => ({ - ...jest.requireActual("@solidjs/web"), - template: jest.fn(), -})) - describe("ssr", () => { test("Renders", () => { const html = renderToString(() => ) diff --git a/test/tsconfig.json b/test/tsconfig.json index 2ebe989..04000ed 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -4,6 +4,6 @@ "lib": ["ESNext", "DOM"], "jsx": "preserve", "jsxImportSource": "@solidjs/web", - "types": ["jest"] + "types": ["vitest/globals"] } } diff --git a/tsconfig.node.json b/tsconfig.node.json index 0426177..68c5b3c 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -5,5 +5,5 @@ "checkJs": true, "types": ["node"] }, - "include": ["./tsup.config.ts", "jest"] + "include": ["./tsup.config.ts", "./vitest.config.ts", "./playwright.config.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..b297b03 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,67 @@ +import {defineConfig} from "vitest/config" +import solid from "@solidjs/vite-plugin" + +/* +Two projects, because the library has two compilation targets and the Solid +JSX transform has to be configured differently for each: + +- `client` compiles the DOM transform and runs in jsdom. +- `ssr` compiles the string-rendering transform and runs in plain node, so + the server build is never loaded alongside jsdom. + +The old jest setup did this with two babel transformers and an `SSR=true` +environment variable that selected between two config objects. Vitest runs +both in one pass instead, so `pnpm test` covers client and server together. +*/ +export default defineConfig({ + test: { + projects: [ + { + plugins: [solid()], + resolve: { + /* + Picks the "browser" exports condition so @solidjs/web resolves + its DOM build rather than the server one. + */ + conditions: ["browser", "development"], + }, + test: { + name: "client", + environment: "jsdom", + include: ["test/**/*.test.{ts,tsx}"], + exclude: ["test/ssr.test.tsx"], + setupFiles: ["test/setup.ts"], + globals: true, + }, + }, + { + plugins: [solid({solid: {generate: "ssr", hydratable: true}, ssr: true})], + resolve: { + conditions: ["node"], + }, + test: { + name: "ssr", + environment: "node", + include: ["test/ssr.test.tsx"], + globals: true, + }, + }, + ], + coverage: { + provider: "v8", + include: ["src/**/*.{ts,tsx}"], + reporter: ["text", "html", "lcov"], + /* + `src/index.tsx` is a re-export barrel with no logic of its own, and + `src/types.ts` is types plus a module augmentation. + */ + exclude: ["src/index.tsx", "src/types.ts"], + thresholds: { + statements: 95, + branches: 92, + functions: 92, + lines: 95, + }, + }, + }, +}) From 44fe17c16eb67963e8560487e68e06dc446d35fb Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 3 Sep 2026 01:54:40 +0800 Subject: [PATCH 3/4] Fix SVG start targets and gesture reverts The two bugs the Playwright suite recorded as expected failures. Both test.fail() markers become ordinary tests. SVG geometry never animated. createStyles built every start target with motion-dom's buildHTMLStyles and applied it as an inline style, but Motion animates SVG geometry through attributes, so `initial={{height: 20}}` on a rect emitted `style="height: 20px"`, which outranks the animated `height` attribute in the cascade and pinned the element to its starting value. createStyles now takes the tag, routes SVG elements through buildSVGAttrs, and returns the style and the attributes separately. Callers apply both: mount sets the attributes on the element, and the Motion component folds them into the props it spreads. They are folded into the existing spread rather than added as a second one, because an extra prop source shifts Solid's hydration key numbering and adds a stray separator to the rendered markup. An element with no SVG geometry therefore renders exactly as before. The SSR expectation for a rect changes from style="height:50px" to height="50px", which is the point of the fix. A gesture with no `animate` prop never reverted. Releasing it resolved to a target holding no values at all, and an empty target is a no-op, so the element stayed on the gesture's values. The engine now records what the element showed before a gesture layer first introduced a key that no other layer drives, reading a transform shorthand's identity value from defaultTransformValue and everything else off computed style, and feeds those back into the resolved target once the layer goes inactive. The record is cleared on mount along with the other per-element flags. Adds unit tests for the SVG attribute path, both revert paths, and the transform identity case, keeping coverage above its thresholds. 69 Vitest tests and 96 Playwright tests pass. Co-Authored-By: Claude Opus 5 (1M context) --- e2e/gestures.spec.ts | 11 +++--- e2e/rendering.spec.ts | 12 +++---- src/engine.ts | 84 +++++++++++++++++++++++++++++++++++++++---- src/motion.tsx | 23 +++++++++--- src/primitives.ts | 17 ++++++--- test/engine.test.tsx | 80 ++++++++++++++++++++++++++++++++++++++--- test/ssr.test.tsx | 6 +++- 7 files changed, 196 insertions(+), 37 deletions(-) diff --git a/e2e/gestures.spec.ts b/e2e/gestures.spec.ts index 61bf8ca..2a301cf 100644 --- a/e2e/gestures.spec.ts +++ b/e2e/gestures.spec.ts @@ -53,13 +53,12 @@ test.describe("gestures", () => { }) /* - Known gap, kept as a failing expectation so it reports as soon as it is - fixed: with no `animate` prop the target resolved on hover-out is empty, - and an empty target is a no-op, so the element stays on the hover values - instead of reverting. Reverting would need the engine to remember the - pre-gesture base style. + Regression guard: with no `animate` prop the target resolved on hover-out + holds no values at all, and an empty target is a no-op. The engine now + remembers what the element showed before the gesture introduced the key, + so it has something to animate back to. */ - test.fail("a gesture with no animate base reverts on leave", async ({page}) => { + test("a gesture with no animate base reverts on leave", async ({page}) => { await openDemo(page, "hover-no-base") const box = page.getByTestId("box") diff --git a/e2e/rendering.spec.ts b/e2e/rendering.spec.ts index 547b306..ef15932 100644 --- a/e2e/rendering.spec.ts +++ b/e2e/rendering.spec.ts @@ -20,15 +20,11 @@ test.describe("rendering", () => { }) /* - Known bug, kept as a failing expectation so it reports as soon as it is - fixed: `createStyles` builds the `initial` target with motion-dom's - `buildHTMLStyles` and applies it as an inline style, but Motion animates - SVG geometry via attributes. The inline `height: 20px` therefore outranks - the animated `height` attribute in the cascade and the rect never moves. - Fixing it means branching `createStyles` onto `buildSVGAttrs` for SVG - elements. + Regression guard: the `initial` target used to be applied as an inline + style even on SVG elements, which outranked the attribute Motion animates + and pinned the rect to its starting height forever. */ - test.fail("animated svg geometry interpolates", async ({page}) => { + test("animated svg geometry interpolates", async ({page}) => { await openDemo(page, "svg-attrs") const rect = page.getByTestId("rect") diff --git a/src/engine.ts b/src/engine.ts index 5950de5..ab3d21e 100644 --- a/src/engine.ts +++ b/src/engine.ts @@ -1,5 +1,15 @@ import {animate, inView} from "framer-motion/dom" -import {hover, press, buildHTMLStyles} from "motion-dom" +import { + hover, + press, + buildHTMLStyles, + buildSVGAttrs, + isSVGTag, + transformProps, + defaultTransformValue, + camelToDash, +} from "motion-dom" +import {SVGElements} from "@solidjs/web" import type {AnimationOptions} from "motion-dom" import type {Options, Target, VariantDefinition} from "./types.js" @@ -88,16 +98,40 @@ export function normalizeTransition(transition: unknown): AnimationOptions | und return result as AnimationOptions } -/** @internal */ -export function createStyles(target: Target): Record { - const renderState = {transform: {}, transformOrigin: {}, vars: {}, style: {}} +/** @internal what a target renders as statically, before anything animates */ +export interface StartStyles { + style: Record + /** SVG geometry, which is carried by attributes rather than by style */ + attrs: Record +} + +/** + * @internal + * @param tag the element's tag name, which decides whether the target is built + * as HTML styles or as SVG attributes + */ +export function createStyles(target: Target, tag = "div"): StartStyles { + const renderState = {transform: {}, transformOrigin: {}, vars: {}, style: {}, attrs: {}} // a static (non-animated) style can't represent a keyframe list — use its first value const staticValues: Record = {} for (const [key, value] of Object.entries(targetValues(target))) { staticValues[key] = Array.isArray(value) ? value[0] : value } - buildHTMLStyles(renderState as any, staticValues as any) - return {...(renderState.vars as any), ...(renderState.style as any)} + /* + SVG geometry (`height`, `cx`, `r`, ...) is animated by Motion as an + attribute, not as a style. Emitting the starting value as an inline style + instead would outrank the animated attribute in the cascade and pin the + element to its `initial` forever, so SVG elements are built through + `buildSVGAttrs`, which splits geometry into `attrs` and leaves the rest + (opacity, fill, the `` root's own transform) in `style`. + */ + if (SVGElements.has(tag)) buildSVGAttrs(renderState as any, staticValues as any, isSVGTag(tag)) + else buildHTMLStyles(renderState as any, staticValues as any) + + return { + style: {...(renderState.vars as any), ...(renderState.style as any)}, + attrs: renderState.attrs as Record, + } } /** @internal */ @@ -109,8 +143,9 @@ export const style = { } function applyStylesDirect(el: Element, target: Target): void { - const styles = createStyles(target) + const {style: styles, attrs} = createStyles(target, el.tagName.toLowerCase()) for (const key in styles) style.set(el, key, styles[key]) + for (const key in attrs) el.setAttribute(key, String(attrs[key])) } function dispatch(el: Element, type: string, detail: Record): void { @@ -220,6 +255,15 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) /** the target most recently animated to — the baseline `update()` diffs against */ let lastTarget: Target | undefined + /* + What the element looked like before a gesture layer first introduced a key + that no other layer sets. Turning that layer off resolves to a target which + simply omits the key, and an omitted key is not an instruction to animate + back — without a remembered base value, a `hover` used with no `animate` + prop would leave the element stuck on its hover values forever. + */ + const baseValues: Record = {} + /* Scoped to whichever mount() call is currently active. A sibling Motion component can get constructed — and briefly mounted/unmounted again — @@ -267,6 +311,11 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) if (active[layer]) Object.assign(target, resolveTarget(options[layer], options.variants)) } + // bring back the pre-gesture value of anything no active layer drives now + const values = target as Record + for (const key in baseValues) { + if (!(key in values)) values[key] = baseValues[key] + } return target } @@ -310,7 +359,27 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) ) } + /** Reads what the element currently shows for a value nothing else drives. */ + function readBaseValue(el: Element, key: string): unknown { + if (transformProps.has(key)) return defaultTransformValue(key) + const computed = window.getComputedStyle(el) + return key.startsWith("--") + ? computed.getPropertyValue(key) + : computed.getPropertyValue(camelToDash(key)) + } + + function captureBaseValues(el: Element, layer: GestureLayer): void { + const introduced = targetValues(resolveTarget(options[layer], options.variants)) + const driven = targetValues(resolveActiveTarget()) + for (const key of Object.keys(introduced)) { + // anything another layer already sets resolves on its own when this one ends + if (key in baseValues || key in driven) continue + baseValues[key] = readBaseValue(el, key) + } + } + function setLayer(el: Element, gesture: Gesture, isActive: boolean, event: unknown): void { + if (isActive) captureBaseValues(el, gesture.layer) active[gesture.layer] = isActive dispatch(el, isActive ? gesture.enter : gesture.leave, gesture.detail(event)) void applyTarget(resolveActiveTarget()) @@ -345,6 +414,7 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) */ exiting = false active.inView = active.hover = active.press = false + for (const key in baseValues) delete baseValues[key] const startTarget = getStartTarget() applyStylesDirect(el, startTarget) diff --git a/src/motion.tsx b/src/motion.tsx index debbfa7..81fee94 100644 --- a/src/motion.tsx +++ b/src/motion.tsx @@ -1,6 +1,6 @@ import {Dynamic} from "@solidjs/web" import type {JSX} from "@solidjs/web" -import {omit, createContext} from "solid-js" +import {merge, omit, createContext} from "solid-js" import {combineStyle} from "@solid-primitives/props" import {MotionState} from "./engine.js" @@ -33,8 +33,9 @@ export const MotionComponent = ( }, ): JSX.Element => { const attrs = omit(props, ...OPTION_KEYS, ...ATTR_KEYS) + const tag = props.tag || "div" - const [state, style] = createAndBindMotionState( + const [state, startStyles] = createAndBindMotionState( () => root, () => ({ initial: props.initial, @@ -49,19 +50,31 @@ export const MotionComponent = ( }), tryUseContext(PresenceContext), tryUseContext(ParentContext), + tag, ) + /* + Folded into one object rather than spread separately: an extra prop source + shifts Solid's hydration key numbering and adds a stray separator to the + rendered markup, so an element with no SVG geometry keeps exactly the props + it had before. The start target goes last so its geometry wins over a + same-named prop, matching how the computed style layers over `props.style`. + */ + const renderedAttrs = Object.keys(startStyles.attrs).length + ? merge(attrs, startStyles.attrs) + : attrs + let root!: Element return ( { root = el props.ref?.(el) }} - component={props.tag || "div"} - style={combineStyle(props.style, style)} + component={tag} + style={combineStyle(props.style, startStyles.style)} /> ) diff --git a/src/primitives.ts b/src/primitives.ts index ae90c87..31b8e52 100644 --- a/src/primitives.ts +++ b/src/primitives.ts @@ -1,7 +1,7 @@ import {scrollInfo} from "framer-motion/dom" import {isServer} from "@solidjs/web" -import {createMotionState, createStyles, MotionState, style} from "./engine.js" +import {createMotionState, createStyles, MotionState, StartStyles, style} from "./engine.js" import {Accessor, Context, createEffect, createSignal, flush, onCleanup, useContext} from "solid-js" import {PresenceContext, PresenceContextState} from "./presence.jsx" @@ -29,7 +29,9 @@ export function createAndBindMotionState( options: Accessor, presence_state?: PresenceContextState, parent_state?: MotionState, -): [MotionState, ReturnType] { + /* the tag being rendered, so an SVG start target is built as attributes */ + tag = "div", +): [MotionState, StartStyles] { const state = createMotionState( presence_state?.initial === false ? {...options(), initial: false} : options(), parent_state, @@ -80,7 +82,7 @@ export function createAndBindMotionState( }, ) - return [state, createStyles(state.getTarget())] as const + return [state, createStyles(state.getTarget(), tag)] as const } /** @@ -100,10 +102,15 @@ export function createMotion( () => target, typeof options === "function" ? options : () => options, presenceState, + undefined, + target.tagName.toLowerCase(), ) - for (const key in styles) { - style.set(target, key, styles[key]) + for (const key in styles.style) { + style.set(target, key, styles.style[key]) + } + for (const key in styles.attrs) { + target.setAttribute(key, String(styles.attrs[key])) } return state diff --git a/test/engine.test.tsx b/test/engine.test.tsx index b65d1a8..065e206 100644 --- a/test/engine.test.tsx +++ b/test/engine.test.tsx @@ -19,26 +19,42 @@ function mounted(): HTMLDivElement { describe("createStyles", () => { test("Maps transform shorthands onto a transform declaration", () => { - expect(createStyles({x: 100, scale: 1.5})).toEqual({ + expect(createStyles({x: 100, scale: 1.5}).style).toEqual({ transform: "translateX(100px) scale(1.5)", }) }) test("Uses the first value of a keyframe list", () => { // a static style can't represent a list, so the starting frame is used - expect(createStyles({opacity: [0.2, 0.9]})).toEqual({opacity: 0.2}) + expect(createStyles({opacity: [0.2, 0.9]}).style).toEqual({opacity: 0.2}) }) test("Passes CSS custom properties through", () => { - expect(createStyles({"--brand": "red"})).toEqual({"--brand": "red"}) + expect(createStyles({"--brand": "red"}).style).toEqual({"--brand": "red"}) }) test("Ignores a target's own transition", () => { - expect(createStyles({opacity: 1, transition: {duration: 5}})).toEqual({opacity: 1}) + expect(createStyles({opacity: 1, transition: {duration: 5}}).style).toEqual({opacity: 1}) }) test("Returns nothing for an empty target", () => { - expect(createStyles({})).toEqual({}) + expect(createStyles({})).toEqual({style: {}, attrs: {}}) + }) + + /* + SVG geometry has to come out as an attribute. As an inline style it would + outrank the attribute Motion animates, and the element would never move. + */ + test("Emits SVG geometry as attributes, not styles", () => { + const {style, attrs} = createStyles({height: 20, opacity: 0.5}, "rect") + expect(attrs).toEqual({height: "20px"}) + expect(style).toEqual({opacity: 0.5}) + }) + + test("Keeps the svg root's own transform in style", () => { + const {style, attrs} = createStyles({x: 10}, "svg") + expect(attrs).toEqual({}) + expect(style).toEqual({transform: "translateX(10px)"}) }) }) @@ -226,6 +242,60 @@ describe("createMotionState", () => { unmount() }) + /* + With no `animate` prop there is nothing for the released gesture to resolve + back to, so the engine records what the element showed before the gesture + introduced the key and animates to that instead. + */ + test("A gesture with no animate base reverts to the pre-gesture value", async () => { + const el = mounted() + el.style.opacity = "1" + const state = createMotionState({press: {opacity: 0.3}, transition: {duration: 0.001}}) + const unmount = state.mount(el) + + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.opacity).toBe("0.3") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + expect(Number(el.style.opacity)).toBeCloseTo(1, 2) + + unmount() + }) + + test("A transform shorthand reverts to its identity value", async () => { + const el = mounted() + const state = createMotionState({press: {x: 50}, transition: {duration: 0.001}}) + const unmount = state.mount(el) + + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.transform).toContain("50px") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + // back to the identity value, which Motion writes out as "none" + expect(el.style.transform).toBe("none") + + unmount() + }) + + test("Applies an SVG start target as attributes", () => { + const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect") + document.body.appendChild(rect) + + const state = createMotionState({initial: {height: 20, opacity: 0.5}}) + const unmount = state.mount(rect) + + // geometry lands on the attribute, everything else stays a style + expect(rect.getAttribute("height")).toBe("20px") + expect(rect.style.opacity).toBe("0.5") + expect(rect.style.height).toBe("") + + unmount() + }) + test("Animating with no element in play is a no-op", async () => { const state = createMotionState({animate: {opacity: 1}, exit: {opacity: 0}}) // never mounted, so there is nothing to animate and nothing to throw diff --git a/test/ssr.test.tsx b/test/ssr.test.tsx index 16e8e6d..61873e2 100644 --- a/test/ssr.test.tsx +++ b/test/ssr.test.tsx @@ -33,12 +33,16 @@ describe("ssr", () => { ) }) + /* + SVG geometry renders as an attribute, not as a style. An inline style would + outrank the attribute Motion animates and pin the element to its `initial`. + */ test("Renders svg with attrs", () => { const html = renderToString(() => ( )) expect(html).toBe( - ``, + ``, ) }) From b2cb1bce42a34dbbd1098702fd4444c5b3392bff Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 3 Sep 2026 02:25:59 +0800 Subject: [PATCH 4/4] Run CI on Node 22 so the jsdom test workers can start Every jsdom test file failed on GitHub Actions with: Error: [vitest-pool]: Failed to start forks worker for test files ... Caused by: TypeError: webidl.util.markAsUncloneable is not a function jsdom 30 pulls in undici, which destructures `markAsUncloneable` off node:worker_threads at module scope and assigns it to `webidl.util` unconditionally. That API only exists from Node 22.10, so on Node 20 it resolves to undefined and every worker that loads jsdom dies on startup. The `ssr` project has no jsdom and was unaffected, which is why exactly the four client test files failed. The workflow asked for `node-version: 20`, which the runner resolved to 20.20.2. Both workflows now ask for 22, with a comment recording why, and an .nvmrc pins the same version for local work. Node 22.12 is also the floor Vite 8 asks for, so this clears that unmet peer warning too; @types/node moves to ^22.12.0 to match. `engines` is deliberately left alone: this only affects the test environment, and the published library still runs on Node 20. Verified on Node 22.12.0, the new floor: 69 Vitest tests pass, lint and build are clean. Co-Authored-By: Claude Opus 5 --- .github/workflows/format.yml | 2 +- .github/workflows/test.yml | 8 ++++-- .nvmrc | 1 + package.json | 2 +- pnpm-lock.yaml | 52 ++++++++++++++++++------------------ 5 files changed, 35 insertions(+), 30 deletions(-) create mode 100644 .nvmrc diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index e9360de..a5c274f 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7c48fe4..444839b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,10 +17,14 @@ jobs: - uses: pnpm/action-setup@v4 + # Node 22, not 20: jsdom 30 pulls in undici, which reads + # `markAsUncloneable` off node:worker_threads unconditionally. That only + # exists from Node 22.10, so on Node 20 every jsdom test worker dies at + # startup with "[vitest-pool]: Failed to start forks worker". - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install dependencies @@ -46,7 +50,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install dependencies diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/package.json b/package.json index 39e3eb2..4ac2c46 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@solidjs/vite-plugin": "^3.0.0-next.37", "@solidjs/web": "2.0.0-rc.3", "@testing-library/jest-dom": "^6.9.1", - "@types/node": "^20.10.6", + "@types/node": "^22.12.0", "@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/parser": "^6.17.0", "@vitest/coverage-v8": "^4.1.11", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fda4e94..1f8ec92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: version: 1.0.0-beta.2(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3) '@solidjs/vite-plugin': specifier: ^3.0.0-next.37 - version: 3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + version: 3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) '@solidjs/web': specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(solid-js@2.0.0-rc.3) @@ -52,8 +52,8 @@ importers: specifier: ^6.9.1 version: 6.9.1 '@types/node': - specifier: ^20.10.6 - version: 20.17.31 + specifier: ^22.12.0 + version: 22.20.1 '@typescript-eslint/eslint-plugin': specifier: ^6.17.0 version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) @@ -92,10 +92,10 @@ importers: version: 5.8.3 vite: specifier: ^8.2.2 - version: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) + version: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) vitest: specifier: ^4.1.11 - version: 4.1.11(@types/node@20.17.31)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + version: 4.1.11(@types/node@22.20.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) packages: @@ -895,8 +895,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.17.31': - resolution: {integrity: sha512-quODOCNXQAbNf1Q7V+fI8WyErOCh0D5Yd31vHnKu4GkSztGQ7rlltAaqXhHhLl33tlVyUXs2386MkANSwgDn6A==} + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} @@ -2087,8 +2087,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici@8.10.1: resolution: {integrity: sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==} @@ -2901,7 +2901,7 @@ snapshots: '@testing-library/dom': 10.4.1 solid-js: 2.0.0-rc.3 - '@solidjs/vite-plugin@3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': + '@solidjs/vite-plugin@3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3))': dependencies: '@ampproject/remapping': 2.3.0 '@babel/core': 7.26.10 @@ -2911,8 +2911,8 @@ snapshots: '@types/babel__core': 7.20.5 merge-anything: 5.1.7 solid-js: 2.0.0-rc.3 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vitefu: 1.1.3(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) + vitefu: 1.1.3(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: @@ -2985,9 +2985,9 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@20.17.31': + '@types/node@22.20.1': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 '@types/semver@7.7.0': {} @@ -3091,7 +3091,7 @@ snapshots: obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.1 - vitest: 4.1.11(@types/node@20.17.31)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + vitest: 4.1.11(@types/node@22.20.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) '@vitest/expect@4.1.11': dependencies: @@ -3102,13 +3102,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3))': dependencies: '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) '@vitest/pretty-format@4.1.11': dependencies: @@ -4167,7 +4167,7 @@ snapshots: typescript@5.8.3: {} - undici-types@6.19.8: {} + undici-types@6.21.0: {} undici@8.10.1: {} @@ -4183,7 +4183,7 @@ snapshots: validate-html-nesting@1.2.2: {} - vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3): + vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -4191,18 +4191,18 @@ snapshots: rolldown: 1.2.6 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.17.31 + '@types/node': 22.20.1 esbuild: 0.25.3 fsevents: 2.3.3 - vitefu@1.1.3(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): + vitefu@1.1.3(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)): optionalDependencies: - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) - vitest@4.1.11(@types/node@20.17.31)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): + vitest@4.1.11(@types/node@22.20.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)): dependencies: '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) '@vitest/pretty-format': 4.1.11 '@vitest/runner': 4.1.11 '@vitest/snapshot': 4.1.11 @@ -4219,10 +4219,10 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.31 + '@types/node': 22.20.1 '@vitest/coverage-v8': 4.1.11(vitest@4.1.11) jsdom: 30.0.1 transitivePeerDependencies: