From 5b99671c03adbf8e4f3454ae73ced81ef10e34ca Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Sun, 31 May 2026 10:35:59 -0400 Subject: [PATCH 1/5] Initial commit for on-going work --- .changeset/analytics-solid2-redesign.md | 40 ++ packages/analytics/DESIGN.md | 167 +++++++ packages/analytics/README.md | 272 +++++++++- packages/analytics/package.json | 31 +- packages/analytics/src/analytics.ts | 266 ++++++++++ packages/analytics/src/context.ts | 45 ++ packages/analytics/src/ga.ts | 48 -- packages/analytics/src/guard.ts | 73 +++ packages/analytics/src/index.ts | 64 +-- packages/analytics/src/queue.ts | 40 ++ packages/analytics/src/types.ts | 108 ++++ .../analytics/stories/analytics.stories.tsx | 249 ++++++++++ packages/analytics/test/index.test.ts | 469 +++++++++++++++++- packages/analytics/test/server.test.ts | 216 ++++++++ packages/analytics/tsconfig.json | 9 +- pnpm-lock.yaml | 14 +- 16 files changed, 1992 insertions(+), 119 deletions(-) create mode 100644 .changeset/analytics-solid2-redesign.md create mode 100644 packages/analytics/DESIGN.md create mode 100644 packages/analytics/src/analytics.ts create mode 100644 packages/analytics/src/context.ts delete mode 100644 packages/analytics/src/ga.ts create mode 100644 packages/analytics/src/guard.ts create mode 100644 packages/analytics/src/queue.ts create mode 100644 packages/analytics/src/types.ts create mode 100644 packages/analytics/stories/analytics.stories.tsx create mode 100644 packages/analytics/test/server.test.ts diff --git a/.changeset/analytics-solid2-redesign.md b/.changeset/analytics-solid2-redesign.md new file mode 100644 index 000000000..6d50e8470 --- /dev/null +++ b/.changeset/analytics-solid2-redesign.md @@ -0,0 +1,40 @@ +--- +"@solid-primitives/analytics": major +--- + +Redesign for Solid.js v2.0 (beta.14) with a queue-based plugin pipeline + +## Breaking Changes + +**Peer dependencies**: `solid-js@^2.0.0-beta.14` and `@solidjs/web@^2.0.0-beta.14` are now required. + +The previous `createAnalytics(handlers)` default export and `EventType` / `TrackHandler` types have been replaced with a richer API: + +- **`makeAnalytics(plugins, options?)`** — non-reactive base primitive returning `[controls, cleanup]` +- **`createAnalytics(plugins, options?)`** — reactive primitive returning controls plus `initialized` and `pendingCount` signals + +### Plugin format + +Plugins follow the [`analytics`](https://www.npmjs.com/package/analytics) npm package interface (`name`, `initialize`, `loaded`, `page`, `track`, `identify`), so any plugin from the [analytics plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) works directly — install it separately and pass it in. + +No first-party plugins are bundled in this package. + +### Event queue + +Events fired before plugins finish initializing are buffered in a bounded FIFO queue and replayed automatically once all plugins report ready. The queue limit and poll interval are configurable via `AnalyticsOptions`. + +### Migration + +```ts +// Before (v0.x) +import createAnalytics, { EventType } from "@solid-primitives/analytics"; +const track = createAnalytics([myHandler]); +track(EventType.Event, { category: "ui", action: "click" }); + +// After (v1.x) — use any plugin from https://www.npmjs.com/package/analytics#analytic-plugins +import { createAnalytics } from "@solid-primitives/analytics"; +import googleAnalytics from "@analytics/google-analytics"; + +const analytics = createAnalytics([googleAnalytics({ measurementId: "G-xxx" })]); +analytics.track("click", { category: "ui" }); +``` diff --git a/packages/analytics/DESIGN.md b/packages/analytics/DESIGN.md new file mode 100644 index 000000000..6cf009913 --- /dev/null +++ b/packages/analytics/DESIGN.md @@ -0,0 +1,167 @@ +# Analytics Primitive — Design Document + +## Goals + +1. Provide idiomatic Solid 2.0 `make*` / `create*` primitives for analytics tracking. +2. Be **plugin-compatible** with the [`analytics`](https://www.npmjs.com/package/analytics) npm package so that any existing plugin (GA4, Segment, Amplitude, Mixpanel, etc.) from the [plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) can be dropped in without modification. **No first-party plugins are maintained here.** +3. Expose a simple **event queue** that buffers events while plugins are still initializing, then drains automatically once all plugins are ready. +4. Stay **isomorphic** — no-ops on the server, full functionality in the browser. + +--- + +## Plugin Interface + +Plugins follow the same contract as the `analytics` npm package: + +```ts +interface AnalyticsPlugin { + name: string; + config?: Record; + + // Called once when the plugin is registered. + initialize?: (args: { config: Record }) => void | Promise; + + // Polled to determine whether an async script has finished loading. + loaded?: () => boolean; + + // Event handlers — each receives payload + config + an abort() fn. + page?: (args: PluginArgs) => void | Promise; + track?: (args: PluginArgs) => void | Promise; + identify?: (args: PluginArgs) => void | Promise; +} +``` + +Calling `abort()` inside a plugin handler stops further plugins from receiving that event (sequential dispatch model). + +Existing community plugins for the `analytics` npm package implement the same interface and are therefore directly compatible. + +--- + +## Event Payloads + +``` +PagePayload → { type: "page", properties: PageProperties, meta: EventMeta } +TrackPayload → { type: "track", event: string, properties, meta } +IdentifyPayload → { type: "identify", userId: string, traits, meta } + +EventMeta → { rid: string, ts: number } (request ID + timestamp) +``` + +--- + +## Architecture + +``` +┌─────────────────────────────────────────────────────────┐ +│ createAnalytics / makeAnalytics │ +│ │ +│ ┌──────────────┐ dispatch() ┌──────────────────┐ │ +│ │ page() │──────────────▶ │ │ │ +│ │ track() │ │ Plugin │ │ +│ │ identify() │ │ Registry │ │ +│ └──────────────┘ │ │ │ +│ │ isReady(plugin) │ │ +│ └────────┬─────────┘ │ +│ │ │ +│ ready? │ │ +│ ┌────yes─────────┤ │ +│ │ │ no │ +│ ▼ ▼ │ +│ send sequential EventQueue │ +│ to each plugin (FIFO, bounded) │ +│ │ │ +│ poll timer │ +│ (500 ms default) │ +│ │ │ +│ allReady? → drain │ +└─────────────────────────────────────────────────────────┘ +``` + +### Dispatch pipeline + +Events are dispatched **sequentially** through the plugin list. Each plugin can call `abort()` to prevent subsequent plugins from receiving the event. This mirrors the analytics npm package middleware model. + +### Queue + +A bounded FIFO `EventQueue` (default limit: 100 events) stores events when one or more plugins are not yet ready. The queue is drained automatically: + +- When `initialize()` resolves for a plugin and `allReady()` becomes true. +- On each poll-timer tick (default 500 ms) that observes `allReady()`. +- When a plugin added via `use()` causes `allReady()` to flip to true. + +--- + +## API + +### `makeAnalytics(plugins, options?)` + +Non-reactive base primitive. Returns `[AnalyticsControls, cleanup]`. The consumer is responsible for calling `cleanup()` to stop the poll timer. + +```ts +import googleAnalytics from "@analytics/google-analytics"; +const [analytics, cleanup] = makeAnalytics([googleAnalytics({ measurementId: "G-xxx" })]); +analytics.page({ title: "Home" }); +analytics.track("signup", { plan: "pro" }); +analytics.identify("u-1", { email: "alice@example.com" }); +analytics.use(anotherPlugin); +cleanup(); +``` + +### `createAnalytics(plugins, options?)` + +Reactive primitive that integrates with Solid's owner tree. Auto-cleans up on disposal. Adds two reactive signals: + +- `initialized: Accessor` — true when all plugins have initialized and `loaded()` returns true. +- `pendingCount: Accessor` — number of events currently queued. + +```ts +import googleAnalytics from "@analytics/google-analytics"; +const analytics = createAnalytics([googleAnalytics({ measurementId: "G-xxx" })]); + +// Use in JSX: + + + +

Pending events: {analytics.pendingCount()}

+``` + +## Options + +```ts +type AnalyticsOptions = { + queueLimit?: number; // max queued events, default 100 + retryInterval?: number; // ms between plugin-readiness checks, default 500 +}; +``` + +--- + +## Solid 2.0 Patterns Used + +| Concern | Pattern | +|---|---| +| Server detection | `isServer` from `@solidjs/web` | +| Reactive state | `createSignal` (plain, no ownedWrite needed — writes from async callbacks) | +| Lifecycle cleanup | `tryOnCleanup` from `@solid-primitives/utils` | +| No reactive scope required | All dispatches are imperative (event handlers, timers) | + +No `createEffect`, `createMemo`, or `createResource` are needed — analytics tracking is inherently imperative. Signals are used only to expose observable state (`initialized`, `pendingCount`) to consumers. + +--- + +## Non-Goals + +- **First-party plugins** — use the [analytics plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) directly. No plugins are maintained in this package. +- Middleware/transform pipeline on payload values (plugins handle their own transformations). +- Persistent event log / replay across page loads. +- Built-in retry logic for failed plugin calls (plugins are responsible for their own error handling). +- Replacing the full `analytics` npm package — this primitive is intentionally simpler. + +--- + +## Future Improvements + +- `withMiddleware(fn)` — a payload transformer before dispatch. +- Per-plugin event filtering (route-based, user-segment-based). +- Offline/service-worker queue persistence. +- Additional first-party plugins (Segment, Mixpanel, Plausible). diff --git a/packages/analytics/README.md b/packages/analytics/README.md index aef1a8f56..5cafcee1c 100644 --- a/packages/analytics/README.md +++ b/packages/analytics/README.md @@ -2,7 +2,13 @@ Name: analytics Stage: 0 Package: "@solid-primitives/analytics" -Primitives: createAnalytics +Primitives: + - makeAnalytics + - createAnalytics + - AnalyticsProvider + - useAnalytics + - makeAnalyticsGuard + - createAnalyticsGuard Category: Utilities --- @@ -14,18 +20,270 @@ Category: Utilities [![stage](https://img.shields.io/endpoint?style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-0.json)](https://github.com/solidjs-community/solid-primitives#contribution-process) -Creates a primitive for analytics management. +- [**Docs**](https://primitives.solidjs.community/docs/analytics) -## How to use it +Analytics tracking primitives for Solid.js with a queue-based dispatch pipeline, reactive signals, context sharing, and navigation guards. + +Plugins are **not bundled** — install any plugin from the [analytics plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) (Google Analytics, Segment, Amplitude, Mixpanel, …) and pass it straight in. + +## Installation + +```bash +npm install @solid-primitives/analytics +# or +pnpm add @solid-primitives/analytics +``` + +Install analytics plugins separately: + +```bash +npm install @analytics/google-analytics +``` + +--- + +## Primitives + +The package follows the standard `make*` / `create*` pattern: + +| Primitive | Reactive? | Cleanup | +|---|---|---| +| `makeAnalytics` | No | manual `cleanup()` | +| `createAnalytics` | Yes | auto on owner disposal | +| `AnalyticsProvider` | Yes (via `createAnalytics`) | auto on unmount | +| `makeAnalyticsGuard` | No | manual `cleanup()` | +| `createAnalyticsGuard` | Yes | auto on owner disposal | + +`createAnalytics` is built on top of `makeAnalytics`. `AnalyticsProvider` creates a `createAnalytics` instance and shares it via context. + +--- + +## `makeAnalytics` + +The base primitive. Returns `[controls, cleanup]`. Use this at module level or anywhere Solid's owner tree is unavailable. + +```ts +import { makeAnalytics } from "@solid-primitives/analytics"; +import googleAnalytics from "@analytics/google-analytics"; + +const [analytics, cleanup] = makeAnalytics([ + googleAnalytics({ measurementId: "G-XXXXXXXXXX" }), +]); + +analytics.page({ title: "Home" }); +analytics.track("signup", { plan: "pro" }); +analytics.identify("user-1", { email: "alice@example.com" }); +analytics.use(anotherPlugin); // register a plugin at any time + +// call when done +cleanup(); +``` + +--- + +## `createAnalytics` + +Reactive wrapper built on `makeAnalytics`. Disposes automatically when the owning scope is destroyed. Exposes a reactive signal: + +- `pendingCount: Accessor` — number of events waiting in the queue (non-zero while plugins are still initializing) + +```tsx +import { createAnalytics } from "@solid-primitives/analytics"; +import googleAnalytics from "@analytics/google-analytics"; +import { Show } from "solid-js"; + +function Root() { + const analytics = createAnalytics([ + googleAnalytics({ measurementId: "G-XXXXXXXXXX" }), + ]); + + return ( + <> + 0}> +

{analytics.pendingCount()} events queued — analytics loading

+
+ + + ); +} +``` + +--- + +## `AnalyticsProvider` / `useAnalytics` + +The easiest way to share analytics across a component tree. Wrap your app once; call `useAnalytics()` in any descendant. + +```tsx +import { AnalyticsProvider, useAnalytics } from "@solid-primitives/analytics"; +import googleAnalytics from "@analytics/google-analytics"; + +// At the root + + + + +// Anywhere inside the tree +function BuyButton() { + const analytics = useAnalytics(); + return ( + + ); +} +``` + +`AnalyticsProvider` creates and owns the `createAnalytics` instance. It disposes automatically when the provider unmounts. `useAnalytics()` throws `ContextNotFoundError` if called outside a provider. + +--- + +## Navigation guard + +`makeAnalyticsGuard` / `createAnalyticsGuard` pause navigation until all in-flight plugin dispatches complete, preventing conversion events from being lost when users navigate away before async network calls finish. + +Both guards: +- Return an `onBeforeLeave` handler compatible with SolidJS Router's `useBeforeLeave` +- Register a `beforeunload` listener as a best-effort safety net for hard navigations + +### With SolidJS Router + +```tsx +import { useBeforeLeave } from "@solidjs/router"; +import { useAnalytics, createAnalyticsGuard } from "@solid-primitives/analytics"; + +function App() { + const analytics = useAnalytics(); + const { onBeforeLeave } = createAnalyticsGuard(analytics); + useBeforeLeave(onBeforeLeave); +} +``` + +### Without a router + +```ts +import { makeAnalytics, makeAnalyticsGuard } from "@solid-primitives/analytics"; + +const [analytics, cleanupAnalytics] = makeAnalytics([...]); +const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); + +// wire onBeforeLeave into your routing solution +// call cleanup() when tearing down +``` + +### How it works + +When `onBeforeLeave` fires: +1. Navigation is paused via `event.preventDefault()` +2. `analytics.drain()` waits for all in-flight plugin dispatches to settle +3. Navigation resumes via `event.retry(true)` + +--- + +## `drain()` + +All controls expose `drain(): Promise`, which resolves once every currently in-flight plugin call has settled. Useful for imperative navigation: ```ts -const [running, start, stop] = createAnalytics(() => console.log('hi'))); -start(); +await analytics.drain(); +router.navigate("/checkout"); ``` -## Demo +> Events still in the queue (waiting for a plugin to initialize) are not awaited by `drain()`. In practice, plugins are ready long before a user navigates, so this edge case rarely applies. + +--- + +## Controls reference + +`makeAnalytics`, `createAnalytics`, and `useAnalytics()` all return the same control surface: + +| Method | Description | +|---|---| +| `page(properties?)` | Track a page view. Auto-fills `path`, `url`, `title`, and `referrer` from `window.location` in the browser. | +| `track(event, properties?)` | Track a named event with optional properties. | +| `identify(userId, traits?)` | Associate subsequent events with a user identity. | +| `use(plugin)` | Register an additional plugin at any time. | +| `reset()` | Stop the poll timer and discard all queued events. | +| `drain()` | `Promise` — resolves when all in-flight dispatches have settled. | + +`createAnalytics` and `useAnalytics()` additionally expose: + +| Property | Type | Description | +|---|---|---| +| `pendingCount` | `Accessor` | Events waiting in the queue; non-zero while plugins are still initializing | + +--- + +## How the queue works + +Events fire immediately to all ready plugins. When one or more plugins are still initializing (async script load, consent check, etc.), events are held in a bounded FIFO queue and replayed in order once all plugins become ready. A poll timer (default: 500 ms) handles `loaded()` checks for external scripts. + +Dispatch is **sequential** through the plugin list. A plugin can call `abort()` to prevent subsequent plugins from receiving that event. -You may view a working example here: https://codesandbox.io/s/solid-create-analytics?file=/src/index.tsx +--- + +## Plugin interface + +`AnalyticsPlugin` matches the [analytics npm package plugin interface](https://getanalytics.io/plugins/writing-plugins/), so any plugin from the [catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) is compatible without modification. + +```ts +import type { AnalyticsPlugin } from "@solid-primitives/analytics"; + +const myPlugin: AnalyticsPlugin = { + name: "my-service", + config: { apiKey: "abc123" }, + + // optional async setup (e.g. inject a script tag) + initialize: async ({ config }) => { + await loadScript(`https://cdn.example.com/sdk.js?key=${config.apiKey}`); + }, + + // polled until true before queued events are flushed + loaded: () => typeof window.myService !== "undefined", + + page: ({ payload, abort }) => { window.myService.page(payload.properties); }, + track: ({ payload, abort }) => { window.myService.track(payload.event, payload.properties); }, + identify: ({ payload }) => { window.myService.identify(payload.userId, payload.traits); }, +}; +``` + +All event payloads carry a `meta` object with a unique request ID (`rid`) and a timestamp (`ts`). + +--- + +## Options + +```ts +type AnalyticsOptions = { + /** Maximum events to hold in the queue before discarding. Default: 100 */ + queueLimit?: number; + /** Milliseconds between plugin-readiness polls. Default: 500 */ + retryInterval?: number; + /** + * When set, switches to batch mode: events accumulate and flush on this + * interval (ms) rather than immediately. Without this option events fire + * as soon as plugins are ready. + */ + drainInterval?: number; + /** + * Maximum events dispatched per drain cycle. Only applies when + * `drainInterval` is set. Remaining events stay queued for the next cycle. + */ + drainSize?: number; +}; +``` + +--- + +## SSR + +Both `makeAnalytics` and `createAnalytics` are isomorphic. On the server, `page()` omits browser-only defaults (`url`, `referrer`, `title`) since `window` is not available, but all other behaviour — plugin dispatch, queuing, `drain()` — works identically. Plugins that perform HTTP requests run on both sides without modification. + +`makeAnalyticsGuard` / `createAnalyticsGuard` are no-ops on the server (no `window.addEventListener`). + +--- ## Changelog diff --git a/packages/analytics/package.json b/packages/analytics/package.json index ce6df08fc..00c9e6e41 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -1,7 +1,7 @@ { "name": "@solid-primitives/analytics", - "version": "0.2.1", - "description": "Primitive that makes managing analytics a lot easier.", + "version": "1.0.0", + "description": "Solid primitives for analytics tracking with a plugin-compatible queue-based dispatch pipeline.", "author": "David Di Biase ", "license": "MIT", "homepage": "https://github.com/solidjs-community/solid-primitives/tree/main/packages/analytics#readme", @@ -23,24 +23,43 @@ "dist" ], "scripts": { - "dev": "node --import=@nothing-but/node-resolve-ts --experimental-transform-types ../../scripts/dev.ts", "build": "node --import=@nothing-but/node-resolve-ts --experimental-transform-types ../../scripts/build.ts", "vitest": "vitest -c ../../configs/vitest.config.ts", "test": "pnpm run vitest", "test:ssr": "pnpm run vitest --mode ssr" }, + "primitive": { + "name": "analytics", + "stage": 0, + "list": [ + "makeAnalytics", + "createAnalytics", + "AnalyticsProvider", + "useAnalytics", + "makeAnalyticsGuard", + "createAnalyticsGuard" + ], + "category": "Utilities" + }, "keywords": [ "analytics", "google", "gtag", + "ga4", + "tracking", "solid", "primitives" ], "peerDependencies": { - "solid-js": "^1.6.12" + "@solidjs/web": "^2.0.0-beta.14", + "solid-js": "^2.0.0-beta.14" + }, + "dependencies": { + "@solid-primitives/event-listener": "workspace:^", + "@solid-primitives/utils": "workspace:^" }, - "typesVersions": {}, "devDependencies": { - "solid-js": "^1.9.7" + "@solidjs/web": "2.0.0-beta.14", + "solid-js": "2.0.0-beta.14" } } diff --git a/packages/analytics/src/analytics.ts b/packages/analytics/src/analytics.ts new file mode 100644 index 000000000..0792f9cef --- /dev/null +++ b/packages/analytics/src/analytics.ts @@ -0,0 +1,266 @@ +import { createSignal } from "solid-js"; +import { tryOnCleanup, INTERNAL_OPTIONS } from "@solid-primitives/utils"; +import type { + AnyPayload, + AnalyticsPlugin, + AnalyticsOptions, + AnalyticsControls, + ReactiveAnalyticsControls, + PageProperties, + TrackProperties, + IdentifyTraits, + PagePayload, + TrackPayload, + IdentifyPayload, +} from "./types.js"; +import { EventQueue } from "./queue.js"; + +let _seq = 0; +function generateId(): string { + return `${Date.now().toString(36)}-${(++_seq).toString(36)}`; +} + +function buildPagePayload(properties: PageProperties): PagePayload { + const defaults: PageProperties = + typeof window !== "undefined" + ? { + path: window.location.pathname, + url: window.location.href, + title: document.title, + referrer: document.referrer, + } + : {}; + return { + type: "page", + properties: { ...defaults, ...properties }, + meta: { rid: generateId(), ts: Date.now() }, + }; +} + +function buildTrackPayload(event: string, properties: TrackProperties): TrackPayload { + return { + type: "track", + event, + properties, + meta: { rid: generateId(), ts: Date.now() }, + }; +} + +function buildIdentifyPayload(userId: string, traits: IdentifyTraits): IdentifyPayload { + return { + type: "identify", + userId, + traits, + meta: { rid: generateId(), ts: Date.now() }, + }; +} + +/** + * Send a payload to a single plugin. + * Returns `true` if the plugin processed the event, `false` if it aborted. + */ +async function invokePlugin(plugin: AnalyticsPlugin, payload: AnyPayload): Promise { + const config = plugin.config ?? {}; + let aborted = false; + const abort = (): void => { + aborted = true; + }; + try { + if (payload.type === "page" && plugin.page) { + await plugin.page({ payload, config, abort }); + } else if (payload.type === "track" && plugin.track) { + await plugin.track({ payload, config, abort }); + } else if (payload.type === "identify" && plugin.identify) { + await plugin.identify({ payload, config, abort }); + } + } catch { + // Individual plugin errors never stop the pipeline. + } + return !aborted; +} + +/** + * Send a payload through all ready plugins sequentially. + * A plugin that calls abort() stops subsequent plugins from receiving the event. + */ +async function dispatchSequential(plugins: AnalyticsPlugin[], payload: AnyPayload): Promise { + for (const plugin of plugins) { + const continued = await invokePlugin(plugin, payload); + if (!continued) break; + } +} + +type StateSnapshot = { queueSize: number }; + +/** Internal engine — shared by makeAnalytics and (via makeAnalytics) createAnalytics. */ +function buildCore(options: AnalyticsOptions, onStateChange?: (snap: StateSnapshot) => void) { + const { queueLimit = 100, retryInterval = 500, drainInterval, drainSize } = options; + const batching = drainInterval != null; + const queue = new EventQueue(queueLimit); + const plugins: AnalyticsPlugin[] = []; + const initialized = new Set(); + const inflight = new Set>(); + let pollTimer: ReturnType | undefined; + let drainTimer: ReturnType | undefined; + + function trackInflight(p: Promise): void { + inflight.add(p); + void p.finally(() => inflight.delete(p)); + } + + function isReady(plugin: AnalyticsPlugin): boolean { + return initialized.has(plugin.name) && (plugin.loaded == null || plugin.loaded()); + } + + function allReady(): boolean { + return plugins.length > 0 && plugins.every(isReady); + } + + function notify(): void { + onStateChange?.({ queueSize: queue.size }); + } + + async function drainQueue(): Promise { + const events = queue.drain(drainSize); + notify(); + for (const { payload } of events) { + trackInflight(dispatchSequential(plugins, payload)); + } + await Promise.all([...inflight]); + } + + function stopPoll(): void { + if (pollTimer != null) { + clearInterval(pollTimer); + pollTimer = undefined; + } + } + + function startPoll(): void { + if (pollTimer != null) return; + pollTimer = setInterval(() => { + if (allReady()) { + stopPoll(); + if (!batching) void drainQueue().then(() => notify()); + else startDrainTimer(); + } + }, retryInterval); + } + + function stopDrainTimer(): void { + if (drainTimer != null) { + clearInterval(drainTimer); + drainTimer = undefined; + } + } + + function startDrainTimer(): void { + if (!batching || drainTimer != null) return; + drainTimer = setInterval(() => { + if (queue.size > 0) void drainQueue().then(() => notify()); + }, drainInterval); + } + + async function initPlugin(plugin: AnalyticsPlugin): Promise { + const config = plugin.config ?? {}; + if (plugin.initialize) { + await plugin.initialize({ config }); + } + initialized.add(plugin.name); + if (allReady()) { + stopPoll(); + if (batching) { + startDrainTimer(); + } else { + await drainQueue(); + } + } else { + startPoll(); + } + notify(); + } + + function addPlugin(plugin: AnalyticsPlugin): void { + plugins.push(plugin); + void initPlugin(plugin); + if (!allReady()) startPoll(); + notify(); + } + + function dispatch(payload: AnyPayload): void { + if (batching && allReady()) { + // Batching mode: accumulate in queue, drain on schedule. + queue.enqueue(payload); + notify(); + } else if (allReady()) { + trackInflight(dispatchSequential(plugins, payload)); + } else { + queue.enqueue(payload); + notify(); + } + } + + function drain(): Promise { + return Promise.all([...inflight]).then(() => {}); + } + + function stop(): void { + stopPoll(); + stopDrainTimer(); + queue.clear(); + notify(); + } + + return { addPlugin, dispatch, drain, stop }; +} + +/** + * Non-reactive analytics primitive. Returns controls and a cleanup function. + * Works on both server and client — plugins without DOM dependencies run identically + * in SSR. Page property defaults (path, url, title, referrer) are omitted on the server. + * + * @param onStateChange - Internal hook used by createAnalytics to observe state changes. + * @internal + */ +export function makeAnalytics( + plugins: AnalyticsPlugin[], + options: AnalyticsOptions = {}, + onStateChange?: (snap: StateSnapshot) => void, +): [AnalyticsControls, () => void] { + const core = buildCore(options, onStateChange); + + for (const plugin of plugins) { + core.addPlugin(plugin); + } + + const controls: AnalyticsControls = { + page: (properties = {}) => core.dispatch(buildPagePayload(properties)), + track: (event, properties = {}) => core.dispatch(buildTrackPayload(event, properties)), + identify: (userId, traits = {}) => core.dispatch(buildIdentifyPayload(userId, traits)), + use: plugin => core.addPlugin(plugin), + reset: () => core.stop(), + drain: () => core.drain(), + }; + + return [controls, () => core.stop()]; +} + +/** + * Reactive analytics primitive built on top of `makeAnalytics`. + * Integrates with Solid's owner tree — auto-disposes on cleanup. + * Exposes `initialized` and `pendingCount` signals for reactive UI. + */ +export function createAnalytics( + plugins: AnalyticsPlugin[], + options: AnalyticsOptions = {}, +): ReactiveAnalyticsControls { + const [pendingCount, setPendingCount] = createSignal(0, INTERNAL_OPTIONS); + + const [controls, cleanup] = makeAnalytics(plugins, options, ({ queueSize }) => { + setPendingCount(queueSize); + }); + + tryOnCleanup(cleanup); + + return { ...controls, pendingCount }; +} diff --git a/packages/analytics/src/context.ts b/packages/analytics/src/context.ts new file mode 100644 index 000000000..1af25d497 --- /dev/null +++ b/packages/analytics/src/context.ts @@ -0,0 +1,45 @@ +import { createComponent, createContext, useContext } from "solid-js"; +import type { Element } from "solid-js"; +import { createAnalytics } from "./analytics.js"; +import type { ReactiveAnalyticsControls, AnalyticsPlugin, AnalyticsOptions } from "./types.js"; + +const AnalyticsCtx = createContext(); + +/** + * Provides an analytics instance to all descendant components. + * Creates its own `createAnalytics` instance and disposes it when unmounted. + * + * ```tsx + * import googleAnalytics from "@analytics/google-analytics"; + * + * + * + * + * ``` + */ +export function AnalyticsProvider(props: { + plugins: AnalyticsPlugin[]; + options?: AnalyticsOptions; + children: Element; +}): Element { + const analytics = createAnalytics(props.plugins, props.options); + return createComponent(AnalyticsCtx, { + value: analytics, + get children() { + return props.children; + }, + }); +} + +/** + * Returns the nearest `AnalyticsProvider`'s controls. + * Throws `ContextNotFoundError` if called outside a provider. + * + * ```ts + * function TrackButton() { + * const analytics = useAnalytics(); + * return ; + * } + * ``` + */ +export const useAnalytics = (): ReactiveAnalyticsControls => useContext(AnalyticsCtx); diff --git a/packages/analytics/src/ga.ts b/packages/analytics/src/ga.ts deleted file mode 100644 index ac427808b..000000000 --- a/packages/analytics/src/ga.ts +++ /dev/null @@ -1,48 +0,0 @@ -// @ts-nocheck -import { TrackHandler, EventType } from "./index.js"; - -type GoogleAnalyticsOptions = { - trackingId: string; - cookieDomain?: string; - name?: string; - userId: string; -}; - -export const loadGoogleAnalytics = (options: GoogleAnalyticsOptions) => { - window.ga = - window.ga || - function () { - (ga.q = ga.q || []).push(arguments); - }; - ga.l = +new Date(); - ga("create", options); - const el = document.createElement("script"); - el.async = true; - el.src = "https://www.google-analytics.com/analytics.js"; - document.head.append(el); -}; - -export const trackGoogleAnalytics: TrackHandler = (event, data) => { - switch (event) { - case EventType.Pageview: - ga("send", "pageview", data.location, data.other); - break; - case EventType.Social: - ga("send", { - hitType: "social", - socialNetwork: data.network, - socialAction: data.action, - socialTarget: data.target, - }); - break; - case EventType.Event: - ga("send", "event", { - eventCategory: data.category, - eventAction: data.action, - eventLabel: data.label, - eventValue: data.value, - ...data.other, - }); - break; - } -}; diff --git a/packages/analytics/src/guard.ts b/packages/analytics/src/guard.ts new file mode 100644 index 000000000..481d72cbb --- /dev/null +++ b/packages/analytics/src/guard.ts @@ -0,0 +1,73 @@ +import { isServer } from "@solidjs/web"; +import { makeEventListener, createEventListener } from "@solid-primitives/event-listener"; +import type { AnalyticsControls } from "./types.js"; + +/** Minimal shape required by the guard — accepts both make and create controls. */ +type Drainable = Pick; + +/** + * Minimal shape of SolidJS Router's BeforeLeaveEvent. + * Typed here so the guard compiles without `@solidjs/router` as a hard dependency. + */ +export type BeforeLeaveEvent = { + defaultPrevented: boolean; + preventDefault(): void; + /** Call with `true` to bypass this guard on the retry. */ + retry(force?: boolean): void; +}; + +function buildOnBeforeLeave(analytics: Drainable): (event: BeforeLeaveEvent) => void { + let guarding = false; + return function onBeforeLeave(event: BeforeLeaveEvent): void { + if (guarding || event.defaultPrevented) return; + event.preventDefault(); + guarding = true; + void analytics.drain().finally(() => { + guarding = false; + event.retry(true); + }); + }; +} + +/** + * Non-reactive navigation guard. Call cleanup() when done (e.g. on route teardown). + * + * - Registers a `beforeunload` listener so hard navigations attempt a best-effort drain. + * - Returns `onBeforeLeave` for use with SolidJS Router's `useBeforeLeave`: + * + * ```ts + * import { useBeforeLeave } from "@solidjs/router"; + * const [analytics, cleanup] = makeAnalytics([...]); + * const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); + * useBeforeLeave(onBeforeLeave); + * ``` + */ +export function makeAnalyticsGuard(analytics: Drainable): { + onBeforeLeave: (event: BeforeLeaveEvent) => void; + cleanup: () => void; +} { + if (isServer) return { onBeforeLeave: () => {}, cleanup: () => {} }; + const onBeforeLeave = buildOnBeforeLeave(analytics); + const cleanup = makeEventListener(window, "beforeunload", () => void analytics.drain()); + return { onBeforeLeave, cleanup }; +} + +/** + * Reactive navigation guard. Auto-removes the `beforeunload` listener when the owner disposes. + * + * ```tsx + * function App() { + * const analytics = useAnalytics(); + * const { onBeforeLeave } = createAnalyticsGuard(analytics); + * useBeforeLeave(onBeforeLeave); + * } + * ``` + */ +export function createAnalyticsGuard(analytics: Drainable): { + onBeforeLeave: (event: BeforeLeaveEvent) => void; +} { + if (isServer) return { onBeforeLeave: () => {} }; + const onBeforeLeave = buildOnBeforeLeave(analytics); + createEventListener(window, "beforeunload", () => void analytics.drain()); + return { onBeforeLeave }; +} diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts index 4ba5f4710..38afd6df2 100644 --- a/packages/analytics/src/index.ts +++ b/packages/analytics/src/index.ts @@ -1,44 +1,24 @@ -export enum EventType { - Pageview = "page", - Event = "event", - Social = "social", -} -export type TrackEventData = { - category?: string; - action?: string; - label?: string; - value?: string; - location?: string; - other?: object; -}; -export type TrackSocialData = { - network: string; - action: string; - socialtarget: string; -}; -export type TrackPageview = { - location?: string; - other?: object; -}; -export type TrackHandler = ( - type: EventType, - data: TrackEventData | TrackSocialData | TrackPageview, -) => void; +export type { + PageProperties, + TrackProperties, + IdentifyTraits, + EventMeta, + PagePayload, + TrackPayload, + IdentifyPayload, + AnyPayload, + PluginArgs, + AnalyticsPlugin, + AnalyticsOptions, + AnalyticsControls, + ReactiveAnalyticsControls, +} from "./types.js"; -/** - * Creates a method that support with analytics reporting. - * - * @param handlers A list of reporting handlers - * @returns Returns a tracking a single tracking handler - * - */ -const createAnalytics = (handlers: Array): TrackHandler => { - const track: TrackHandler = (type, data) => { - for (const i in handlers) { - handlers[i]!(type, data); - } - }; - return track; -}; +export type { QueuedEvent } from "./queue.js"; -export default createAnalytics; +export { makeAnalytics, createAnalytics } from "./analytics.js"; + +export { AnalyticsProvider, useAnalytics } from "./context.js"; + +export { makeAnalyticsGuard, createAnalyticsGuard } from "./guard.js"; +export type { BeforeLeaveEvent } from "./guard.js"; diff --git a/packages/analytics/src/queue.ts b/packages/analytics/src/queue.ts new file mode 100644 index 000000000..70040ff04 --- /dev/null +++ b/packages/analytics/src/queue.ts @@ -0,0 +1,40 @@ +import type { AnyPayload } from "./types.js"; + +export type QueuedEvent = { + payload: AnyPayload; +}; + +/** Bounded FIFO queue for analytics events pending plugin initialization. */ +export class EventQueue { + private readonly _limit: number; + private _items: QueuedEvent[] = []; + + constructor(limit = 100) { + this._limit = limit; + } + + /** + * Add an event to the queue. + * @returns `true` if enqueued, `false` if the queue is full. + */ + enqueue(payload: AnyPayload): boolean { + if (this._items.length >= this._limit) return false; + this._items.push({ payload }); + return true; + } + + /** Remove and return up to `limit` queued events (or all if limit is omitted). */ + drain(limit?: number): QueuedEvent[] { + return limit != null ? this._items.splice(0, limit) : this._items.splice(0); + } + + /** Number of events currently in the queue. */ + get size(): number { + return this._items.length; + } + + /** Discard all queued events without dispatching them. */ + clear(): void { + this._items = []; + } +} diff --git a/packages/analytics/src/types.ts b/packages/analytics/src/types.ts new file mode 100644 index 000000000..67cad53d9 --- /dev/null +++ b/packages/analytics/src/types.ts @@ -0,0 +1,108 @@ +import type { Accessor } from "solid-js"; + +export type PageProperties = { + path?: string; + url?: string; + title?: string; + referrer?: string; + [key: string]: unknown; +}; + +export type TrackProperties = Record; + +export type IdentifyTraits = Record; + +export type EventMeta = { + /** Unique request identifier for this event. */ + rid: string; + /** Unix timestamp (ms) when the event was created. */ + ts: number; +}; + +export type PagePayload = { + type: "page"; + properties: PageProperties; + meta: EventMeta; +}; + +export type TrackPayload = { + type: "track"; + event: string; + properties: TrackProperties; + meta: EventMeta; +}; + +export type IdentifyPayload = { + type: "identify"; + userId: string; + traits: IdentifyTraits; + meta: EventMeta; +}; + +export type AnyPayload = PagePayload | TrackPayload | IdentifyPayload; + +export type PluginArgs

= { + payload: P; + /** Plugin-level config merged from plugin.config. */ + config: Record; + /** Stops subsequent plugins from receiving this event. */ + abort: () => void; +}; + +/** + * Analytics plugin interface compatible with the `analytics` npm package. + * Any plugin built for that library can be used directly. + */ +export interface AnalyticsPlugin { + name: string; + /** Static plugin-level configuration passed to each handler. */ + config?: Record; + /** Runs once when the plugin is registered. May be async (e.g. script injection). */ + initialize?: (args: { config: Record }) => void | Promise; + /** Polled to determine whether an async dependency (e.g. a script tag) has loaded. */ + loaded?: () => boolean; + page?: (args: PluginArgs) => void | Promise; + track?: (args: PluginArgs) => void | Promise; + identify?: (args: PluginArgs) => void | Promise; +} + +export type AnalyticsOptions = { + /** Maximum number of events to hold in the queue before discarding. Default: 100. */ + queueLimit?: number; + /** Milliseconds between plugin-readiness checks. Default: 500. */ + retryInterval?: number; + /** + * When set, events are batched and dispatched on this interval (ms) rather than + * immediately. Without this option the current event fires as soon as plugins are ready. + */ + drainInterval?: number; + /** + * Maximum events dispatched per drain cycle. Only applies when `drainInterval` is set. + * Remaining events stay queued until the next cycle. + */ + drainSize?: number; +}; + +export type AnalyticsControls = { + /** Track a page view. Defaults to current window location when called in a browser. */ + page(properties?: PageProperties): void; + /** Track a named event with optional properties. */ + track(event: string, properties?: TrackProperties): void; + /** Associate subsequent events with a user identity. */ + identify(userId: string, traits?: IdentifyTraits): void; + /** Dynamically register an additional plugin. */ + use(plugin: AnalyticsPlugin): void; + /** Stop the internal poll timer and clear any queued events. */ + reset(): void; + /** + * Resolves when all currently in-flight plugin dispatches have settled. + * Useful for holding back navigation until analytics events have been sent. + * Note: events still in the queue (waiting for plugins to load) are not awaited. + */ + drain(): Promise; +}; + +export type ReactiveAnalyticsControls = AnalyticsControls & { + /** Number of events waiting in the queue (plugins not yet ready). */ + pendingCount: Accessor; +}; diff --git a/packages/analytics/stories/analytics.stories.tsx b/packages/analytics/stories/analytics.stories.tsx new file mode 100644 index 000000000..db69ae1cc --- /dev/null +++ b/packages/analytics/stories/analytics.stories.tsx @@ -0,0 +1,249 @@ +import { createSignal } from "solid-js"; +import preview from "../../../.storybook/preview.js"; +import { AnalyticsProvider, createAnalytics, useAnalytics } from "@solid-primitives/analytics"; +import type { AnalyticsPlugin } from "@solid-primitives/analytics"; +import rawReadme from "../README.md?raw"; +import { + Button, + ButtonRow, + colors, + Container, + EventLog, + Section, + StatRow, +} from "../../../.storybook/ui/index.js"; + +// Strip YAML frontmatter so it doesn't appear as raw text in the Docs page. +const readme = rawReadme.replace(/^---[\s\S]*?---\n/, ""); + +const meta = preview.meta({ + title: "Utilities/Analytics", + tags: ["autodocs"], + parameters: { + layout: "centered", + docs: { + description: { component: readme }, + }, + }, +}); + +export default meta; + +export const QueueAndReplayStory = meta.story({ + name: "Queue & replay on plugin ready", + parameters: { + docs: { + description: { + story: + "Events fired before all plugins have finished initializing accumulate in a bounded queue. Once every plugin's `loaded()` check passes, the queue drains in order and `pendingCount` resets to zero. Click the buttons immediately after mount — the plugin resolves after 1.5 s — to see events queue up and then replay automatically.", + }, + }, + }, + render: () => { + const [log, setLog] = createSignal<{ label: string; time: string }[]>([]); + const addLog = (label: string) => + setLog(prev => [{ label, time: new Date().toLocaleTimeString() }, ...prev].slice(0, 8)); + + let pluginLoaded = false; + const plugin: AnalyticsPlugin = { + name: "demo-logger", + initialize: () => + new Promise(resolve => + setTimeout(() => { + pluginLoaded = true; + resolve(); + }, 1500), + ), + loaded: () => pluginLoaded, + page: ({ payload }) => + addLog(`page "${payload.properties.title ?? payload.properties.path ?? "/"}"`), + track: ({ payload }) => addLog(`track "${payload.event}"`), + identify: ({ payload }) => addLog(`identify "${payload.userId}"`), + }; + + const analytics = createAnalytics([plugin]); + + return ( + + + + + + + + +

+ Plugin resolves after 1.5 s. Events queued before that replay in order — watch{" "} + pendingCount drop and the log populate. +

+ + ); + }, +}); + +export const BatchedDrainStory = meta.story({ + name: "Batched dispatch window", + parameters: { + docs: { + description: { + story: + "Setting `drainInterval` switches the engine to batch mode: events accumulate and flush on a timer rather than immediately. `drainSize` caps the number of events dispatched per cycle — the remainder stays queued for the next tick. Useful for reducing network calls when events fire at high frequency.", + }, + }, + }, + render: () => { + const [log, setLog] = createSignal<{ label: string; time: string }[]>([]); + const addLog = (label: string) => + setLog(prev => [{ label, time: new Date().toLocaleTimeString() }, ...prev].slice(0, 10)); + + const DRAIN_INTERVAL = 3000; + const DRAIN_SIZE = 3; + let batchN = 0; + + const plugin: AnalyticsPlugin = { + name: "batch-logger", + track: ({ payload }) => addLog(`[batch ${++batchN}] ${payload.event}`), + }; + + const analytics = createAnalytics([plugin], { + drainInterval: DRAIN_INTERVAL, + drainSize: DRAIN_SIZE, + }); + + return ( + + + + + + + + + +

+ Events flush up to {DRAIN_SIZE} at a time every {DRAIN_INTERVAL / 1000} s. The queue beyond + that carries forward to the next cycle. +

+
+ ); + }, +}); + +export const ContextSharingStory = meta.story({ + name: "Single provider, many consumers", + parameters: { + docs: { + description: { + story: + "`AnalyticsProvider` creates one shared `createAnalytics` instance and exposes it via context. Any descendant calls `useAnalytics()` to get the same controls — no prop-drilling needed. Both sections below fire to the same log through the shared instance.", + }, + }, + }, + render: () => { + const [log, setLog] = createSignal<{ label: string; time: string }[]>([]); + const addLog = (kind: string, detail: string) => + setLog(prev => + [{ label: `[${kind}] ${detail}`, time: new Date().toLocaleTimeString() }, ...prev].slice( + 0, + 10, + ), + ); + + const plugin: AnalyticsPlugin = { + name: "context-demo", + page: ({ payload }) => addLog("page", payload.properties.path ?? "/"), + track: ({ payload }) => addLog("track", payload.event), + identify: ({ payload }) => addLog("identify", payload.userId), + }; + + const HeroSection = () => { + const analytics = useAnalytics(); + return ( + + + + + ); + }; + + const CartSection = () => { + const analytics = useAnalytics(); + return ( + + + + + ); + }; + + return ( + + +
+ +
+
+ +
+ +
+
+ ); + }, +}); diff --git a/packages/analytics/test/index.test.ts b/packages/analytics/test/index.test.ts index 612a49856..93f4a4ccd 100644 --- a/packages/analytics/test/index.test.ts +++ b/packages/analytics/test/index.test.ts @@ -1,18 +1,461 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it, vi, afterEach } from "vitest"; +import { createRoot, flush } from "solid-js"; +import { makeAnalytics, createAnalytics } from "../src/analytics.js"; +import { makeAnalyticsGuard, createAnalyticsGuard } from "../src/guard.js"; +import type { AnalyticsPlugin, PagePayload, TrackPayload, IdentifyPayload } from "../src/types.js"; +import type { BeforeLeaveEvent } from "../src/guard.js"; -import createAnalytics, { EventType } from "../src/index.js"; +function makeReadyPlugin(overrides: Partial = {}): AnalyticsPlugin { + return { name: "ready", ...overrides }; +} -describe("createPrimitiveTemplate", () => { - it("track function calls all handlers with the event", () => { - const called: any[][] = []; - const handlers = [...new Array(5)].map( - (_, i) => - (...args) => - (called[i] = args), +function delay(ms = 0): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +// ─── makeAnalytics ──────────────────────────────────────────────────────────── + +describe("makeAnalytics", () => { + it("dispatches page events immediately to a ready plugin", async () => { + const pageSpy = vi.fn(); + const [analytics, cleanup] = makeAnalytics([makeReadyPlugin({ page: ({ payload }) => pageSpy(payload) })]); + analytics.page({ title: "Home" }); + await delay(); + expect(pageSpy).toHaveBeenCalledOnce(); + const payload = pageSpy.mock.calls[0]![0] as PagePayload; + expect(payload.type).toBe("page"); + expect(payload.properties.title).toBe("Home"); + expect(payload.meta.rid).toBeTruthy(); + cleanup(); + }); + + it("dispatches track events to a ready plugin", async () => { + const trackSpy = vi.fn(); + const [analytics, cleanup] = makeAnalytics([makeReadyPlugin({ track: ({ payload }) => trackSpy(payload) })]); + analytics.track("button_click", { name: "signup" }); + await delay(); + expect(trackSpy).toHaveBeenCalledOnce(); + const payload = trackSpy.mock.calls[0]![0] as TrackPayload; + expect(payload.type).toBe("track"); + expect(payload.event).toBe("button_click"); + expect(payload.properties.name).toBe("signup"); + cleanup(); + }); + + it("dispatches identify events to a ready plugin", async () => { + const identifySpy = vi.fn(); + const [analytics, cleanup] = makeAnalytics([ + makeReadyPlugin({ identify: ({ payload }) => identifySpy(payload) }), + ]); + analytics.identify("user-1", { email: "alice@example.com" }); + await delay(); + expect(identifySpy).toHaveBeenCalledOnce(); + const payload = identifySpy.mock.calls[0]![0] as IdentifyPayload; + expect(payload.type).toBe("identify"); + expect(payload.userId).toBe("user-1"); + expect(payload.traits.email).toBe("alice@example.com"); + cleanup(); + }); + + it("queues events while a plugin is initializing and flushes when ready", async () => { + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + const pageSpy = vi.fn(); + + const [analytics, cleanup] = makeAnalytics([ + { + name: "async-plugin", + initialize: () => initDone, + page: ({ payload }) => pageSpy(payload), + }, + ]); + + analytics.page({ title: "Queued" }); + await delay(); // init not done yet + expect(pageSpy).not.toHaveBeenCalled(); + + resolveInit(); + await delay(20); // allow init + drain + expect(pageSpy).toHaveBeenCalledOnce(); + cleanup(); + }); + + it("dispatches to multiple plugins sequentially", async () => { + const order: string[] = []; + const pluginA: AnalyticsPlugin = { name: "a", track: async () => { order.push("a"); } }; + const pluginB: AnalyticsPlugin = { name: "b", track: async () => { order.push("b"); } }; + const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); + analytics.track("ev"); + await delay(10); + expect(order).toEqual(["a", "b"]); + cleanup(); + }); + + it("abort() stops subsequent plugins from receiving the event", async () => { + const spyA = vi.fn(); + const spyB = vi.fn(); + const pluginA: AnalyticsPlugin = { name: "a", track: ({ abort }) => { spyA(); abort(); } }; + const pluginB: AnalyticsPlugin = { name: "b", track: () => spyB() }; + const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); + analytics.track("ev"); + await delay(10); + expect(spyA).toHaveBeenCalledOnce(); + expect(spyB).not.toHaveBeenCalled(); + cleanup(); + }); + + it("swallows plugin errors and continues with the next plugin", async () => { + const spyB = vi.fn(); + const pluginA: AnalyticsPlugin = { + name: "broken", + track: () => { throw new Error("boom"); }, + }; + const pluginB: AnalyticsPlugin = { name: "ok", track: () => spyB() }; + const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); + analytics.track("ev"); + await delay(10); + expect(spyB).toHaveBeenCalledOnce(); + cleanup(); + }); + + it("dynamically registers a plugin via use()", async () => { + const spyA = vi.fn(); + const spyB = vi.fn(); + const pluginA: AnalyticsPlugin = { name: "a", track: () => spyA() }; + const pluginB: AnalyticsPlugin = { name: "b", track: () => spyB() }; + const [analytics, cleanup] = makeAnalytics([pluginA]); + analytics.use(pluginB); + analytics.track("ev"); + await delay(10); + expect(spyA).toHaveBeenCalledOnce(); + expect(spyB).toHaveBeenCalledOnce(); + cleanup(); + }); + + it("cleanup stops the poll timer and clears the queue", async () => { + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + const spy = vi.fn(); + const [analytics, cleanup] = makeAnalytics( + [{ name: "async", initialize: () => initDone, page: () => spy() }], + { retryInterval: 50 }, ); - const track = createAnalytics(handlers); - const eventData = {}; - track(EventType.Event, eventData); - expect(called).toEqual(new Array(5).fill([EventType.Event, eventData])); + analytics.page({ title: "Lost" }); + cleanup(); // discard before init resolves + resolveInit(); + await delay(100); + expect(spy).not.toHaveBeenCalled(); + }); + + it("uses loaded() to determine plugin readiness", async () => { + const spy = vi.fn(); + let isLoaded = false; + const plugin: AnalyticsPlugin = { + name: "deferred", + loaded: () => isLoaded, + page: () => spy(), + }; + const [analytics, cleanup] = makeAnalytics([plugin], { retryInterval: 20 }); + analytics.page({ title: "Deferred" }); + await delay(10); + expect(spy).not.toHaveBeenCalled(); + isLoaded = true; + await delay(50); // poll fires, drains queue + expect(spy).toHaveBeenCalledOnce(); + cleanup(); + }); + + it("each event gets a unique rid", async () => { + const rids: string[] = []; + const plugin: AnalyticsPlugin = { name: "p", track: ({ payload }) => rids.push(payload.meta.rid) }; + const [analytics, cleanup] = makeAnalytics([plugin]); + analytics.track("a"); + analytics.track("b"); + await delay(10); + expect(rids).toHaveLength(2); + expect(rids[0]).not.toBe(rids[1]); + cleanup(); + }); +}); + +// ─── createAnalytics ────────────────────────────────────────────────────────── + +describe("createAnalytics", () => { + let dispose: () => void; + + afterEach(() => { + dispose?.(); + }); + + it("pendingCount() starts at 0 with a sync plugin", () => { + createRoot(d => { + dispose = d; + const analytics = createAnalytics([makeReadyPlugin()]); + flush(); + expect(analytics.pendingCount()).toBe(0); + }); + }); + + it("pendingCount() reflects queued event count", () => + new Promise(resolve => { + createRoot(d => { + dispose = d; + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + const analytics = createAnalytics([{ name: "async", initialize: () => initDone, page: () => {} }]); + analytics.page({ title: "A" }); + analytics.page({ title: "B" }); + flush(); + expect(analytics.pendingCount()).toBe(2); + resolveInit(); + delay(20).then(() => { + flush(); + expect(analytics.pendingCount()).toBe(0); + resolve(); + }); + }); + })); + + it("reset() clears the queue and resets pendingCount", () => { + createRoot(d => { + dispose = d; + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + const analytics = createAnalytics([{ name: "async", initialize: () => initDone }]); + analytics.page(); + flush(); + expect(analytics.pendingCount()).toBe(1); + analytics.reset(); + flush(); + expect(analytics.pendingCount()).toBe(0); + resolveInit(); + }); + }); + + it("passes config to plugin handlers", async () => { + const spy = vi.fn(); + await new Promise(resolve => { + createRoot(d => { + dispose = d; + const plugin: AnalyticsPlugin = { + name: "cfg", + config: { apiKey: "abc" }, + track: ({ config }) => { spy(config); resolve(); }, + }; + createAnalytics([plugin]).track("ev"); + }); + }); + expect(spy).toHaveBeenCalledWith(expect.objectContaining({ apiKey: "abc" })); + }); +}); + +// ─── drain ──────────────────────────────────────────────────────────────────── + +describe("drain()", () => { + it("resolves immediately when no dispatches are in flight", async () => { + const [analytics, cleanup] = makeAnalytics([makeReadyPlugin()]); + await expect(analytics.drain()).resolves.toBeUndefined(); + cleanup(); + }); + + it("resolves after in-flight async plugin calls complete", async () => { + let resolveTrack!: () => void; + const trackDone = new Promise(res => (resolveTrack = res)); + const order: string[] = []; + + const plugin: AnalyticsPlugin = { + name: "slow", + track: async () => { + await trackDone; + order.push("plugin"); + }, + }; + const [analytics, cleanup] = makeAnalytics([plugin]); + analytics.track("ev"); + const drained = analytics.drain().then(() => order.push("drained")); + await delay(5); + expect(order).toEqual([]); // neither done yet + resolveTrack(); + await drained; + expect(order).toEqual(["plugin", "drained"]); + cleanup(); + }); + + it("drain() on createAnalytics also works", async () => { + const spy = vi.fn(); + await new Promise(resolve => { + createRoot(async d => { + const analytics = createAnalytics([makeReadyPlugin({ track: async () => { spy(); } })]); + analytics.track("ev"); + await analytics.drain(); + expect(spy).toHaveBeenCalledOnce(); + d(); + resolve(); + }); + }); + }); +}); + +// ─── drainInterval / drainSize ──────────────────────────────────────────────── + +describe("drainInterval / drainSize", () => { + it("batches events and dispatches on the drain interval", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "p", track: ({ payload }) => spy(payload.event) }; + const [analytics, cleanup] = makeAnalytics([plugin], { drainInterval: 30 }); + + analytics.track("a"); + analytics.track("b"); + analytics.track("c"); + + await delay(10); + expect(spy).not.toHaveBeenCalled(); // not dispatched yet + + await delay(30); // drain interval fires + expect(spy).toHaveBeenCalledTimes(3); + expect(spy.mock.calls.map(c => c[0])).toEqual(["a", "b", "c"]); + cleanup(); + }); + + it("drainSize limits events per cycle, leaving the rest for the next tick", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "p", track: ({ payload }) => spy(payload.event) }; + const [analytics, cleanup] = makeAnalytics([plugin], { drainInterval: 30, drainSize: 2 }); + + analytics.track("a"); + analytics.track("b"); + analytics.track("c"); + + await delay(40); // first drain fires + expect(spy).toHaveBeenCalledTimes(2); + expect(spy.mock.calls.map(c => c[0])).toEqual(["a", "b"]); + + await delay(30); // second drain fires + expect(spy).toHaveBeenCalledTimes(3); + expect(spy.mock.calls[2]![0]).toBe("c"); + cleanup(); + }); + + it("pendingCount reflects queued events in batch mode", async () => { + await new Promise(resolve => { + createRoot(d => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "p", track: () => spy() }; + const analytics = createAnalytics([plugin], { drainInterval: 50 }); + analytics.track("a"); + analytics.track("b"); + flush(); + expect(analytics.pendingCount()).toBe(2); + delay(60).then(() => { + flush(); + expect(analytics.pendingCount()).toBe(0); + expect(spy).toHaveBeenCalledTimes(2); + d(); + resolve(); + }); + }); + }); + }); + + it("without drainInterval events dispatch immediately (default behavior unchanged)", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "p", track: ({ payload }) => spy(payload.event) }; + const [analytics, cleanup] = makeAnalytics([plugin]); + analytics.track("immediate"); + await delay(5); + expect(spy).toHaveBeenCalledWith("immediate"); + cleanup(); + }); +}); + +// ─── makeAnalyticsGuard ─────────────────────────────────────────────────────── + +describe("makeAnalyticsGuard", () => { + it("onBeforeLeave prevents default and retries after drain", async () => { + let resolveTrack!: () => void; + const trackDone = new Promise(res => (resolveTrack = res)); + + const plugin: AnalyticsPlugin = { name: "p", track: () => trackDone }; + const [analytics, cleanupAnalytics] = makeAnalytics([plugin]); + analytics.track("ev"); // in-flight + + const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); + + const retried = vi.fn(); + const event: BeforeLeaveEvent = { + defaultPrevented: false, + preventDefault: vi.fn(), + retry: retried, + }; + + onBeforeLeave(event); + expect(event.preventDefault).toHaveBeenCalledOnce(); + expect(retried).not.toHaveBeenCalled(); + + resolveTrack(); + await delay(10); + expect(retried).toHaveBeenCalledWith(true); + + cleanup(); + cleanupAnalytics(); + }); + + it("does not re-guard when already guarding", async () => { + let resolveTrack!: () => void; + const trackDone = new Promise(res => (resolveTrack = res)); + const plugin: AnalyticsPlugin = { name: "slow", track: () => trackDone }; + const [analytics, cleanupAnalytics] = makeAnalytics([plugin]); + analytics.track("ev"); // keep a dispatch in-flight so drain() doesn't resolve immediately + const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); + + const event: BeforeLeaveEvent = { + defaultPrevented: false, + preventDefault: vi.fn(), + retry: vi.fn(), + }; + + onBeforeLeave(event); // first call — sets guarding = true + onBeforeLeave(event); // second call while still guarding — should be ignored + expect(event.preventDefault).toHaveBeenCalledOnce(); + + resolveTrack(); + await delay(10); + cleanup(); + cleanupAnalytics(); + }); + + it("does nothing when event.defaultPrevented is true", () => { + const [analytics, cleanupAnalytics] = makeAnalytics([makeReadyPlugin()]); + const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); + + const event: BeforeLeaveEvent = { + defaultPrevented: true, + preventDefault: vi.fn(), + retry: vi.fn(), + }; + onBeforeLeave(event); + expect(event.preventDefault).not.toHaveBeenCalled(); + + cleanup(); + cleanupAnalytics(); + }); +}); + +// ─── createAnalyticsGuard ───────────────────────────────────────────────────── + +describe("createAnalyticsGuard", () => { + let dispose: () => void; + afterEach(() => dispose?.()); + + it("auto-removes beforeunload listener on owner disposal", () => { + const removeSpy = vi.spyOn(window, "removeEventListener"); + createRoot(d => { + dispose = d; + const analytics = createAnalytics([makeReadyPlugin()]); + createAnalyticsGuard(analytics); + }); + dispose(); + expect(removeSpy).toHaveBeenCalledWith("beforeunload", expect.any(Function), undefined); + removeSpy.mockRestore(); }); }); diff --git a/packages/analytics/test/server.test.ts b/packages/analytics/test/server.test.ts new file mode 100644 index 000000000..0eeea36e1 --- /dev/null +++ b/packages/analytics/test/server.test.ts @@ -0,0 +1,216 @@ +import { describe, it, expect, vi } from "vitest"; +import { createRoot, flush } from "solid-js"; +import { makeAnalytics, createAnalytics } from "../src/analytics.js"; +import type { AnalyticsPlugin, PagePayload, TrackPayload, IdentifyPayload } from "../src/types.js"; + +// These tests run with --mode ssr (isServer = true in @solidjs/web). +// Plugins that don't touch browser APIs work identically on client and server. + +function delay(ms = 0): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +// ─── makeAnalytics (server) ─────────────────────────────────────────────────── + +describe("makeAnalytics (server)", () => { + it("dispatches page events to a synchronous plugin", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "logger", page: ({ payload }) => spy(payload) }; + const [analytics, cleanup] = makeAnalytics([plugin]); + + analytics.page({ title: "SSR Home", path: "/home" }); + await analytics.drain(); + + expect(spy).toHaveBeenCalledOnce(); + const payload = spy.mock.calls[0]![0] as PagePayload; + expect(payload.type).toBe("page"); + expect(payload.properties.title).toBe("SSR Home"); + expect(payload.properties.path).toBe("/home"); + // Browser defaults (window.location etc.) are absent on the server + expect(payload.properties.url).toBeUndefined(); + expect(payload.meta.rid).toBeTruthy(); + cleanup(); + }); + + it("dispatches track events to a synchronous plugin", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "logger", track: ({ payload }) => spy(payload) }; + const [analytics, cleanup] = makeAnalytics([plugin]); + + analytics.track("server_render", { route: "/home", user: "u-1" }); + await analytics.drain(); + + expect(spy).toHaveBeenCalledOnce(); + const payload = spy.mock.calls[0]![0] as TrackPayload; + expect(payload.type).toBe("track"); + expect(payload.event).toBe("server_render"); + expect(payload.properties.route).toBe("/home"); + cleanup(); + }); + + it("dispatches identify events to a synchronous plugin", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "logger", identify: ({ payload }) => spy(payload) }; + const [analytics, cleanup] = makeAnalytics([plugin]); + + analytics.identify("u-42", { role: "admin", plan: "enterprise" }); + await analytics.drain(); + + expect(spy).toHaveBeenCalledOnce(); + const payload = spy.mock.calls[0]![0] as IdentifyPayload; + expect(payload.type).toBe("identify"); + expect(payload.userId).toBe("u-42"); + expect(payload.traits.role).toBe("admin"); + cleanup(); + }); + + it("queues events while a plugin initializes asynchronously", async () => { + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { + name: "async-logger", + initialize: () => initDone, + track: ({ payload }) => spy(payload), + }; + const [analytics, cleanup] = makeAnalytics([plugin]); + + analytics.track("queued_on_server"); + await delay(); // init not yet resolved + expect(spy).not.toHaveBeenCalled(); + + resolveInit(); + await delay(20); + expect(spy).toHaveBeenCalledOnce(); + cleanup(); + }); + + it("dispatches to multiple server plugins sequentially", async () => { + const order: string[] = []; + const pluginA: AnalyticsPlugin = { name: "a", track: async () => { order.push("a"); } }; + const pluginB: AnalyticsPlugin = { name: "b", track: async () => { order.push("b"); } }; + const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); + + analytics.track("ev"); + await analytics.drain(); + + expect(order).toEqual(["a", "b"]); + cleanup(); + }); + + it("abort() works on the server", async () => { + const spyA = vi.fn(); + const spyB = vi.fn(); + const pluginA: AnalyticsPlugin = { name: "a", track: ({ abort }) => { spyA(); abort(); } }; + const pluginB: AnalyticsPlugin = { name: "b", track: () => spyB() }; + const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); + + analytics.track("ev"); + await analytics.drain(); + + expect(spyA).toHaveBeenCalledOnce(); + expect(spyB).not.toHaveBeenCalled(); + cleanup(); + }); + + it("drain() resolves after all server dispatches settle", async () => { + let resolveTrack!: () => void; + const trackDone = new Promise(res => (resolveTrack = res)); + const order: string[] = []; + const plugin: AnalyticsPlugin = { + name: "slow", + track: async () => { await trackDone; order.push("plugin"); }, + }; + const [analytics, cleanup] = makeAnalytics([plugin]); + + analytics.track("ev"); + const drained = analytics.drain().then(() => order.push("drained")); + + expect(order).toEqual([]); + resolveTrack(); + await flushed; + + expect(order).toEqual(["plugin", "flushed"]); + cleanup(); + }); +}); + +// ─── createAnalytics (server) ───────────────────────────────────────────────── + +describe("createAnalytics (server)", () => { + it("dispatches events inside a createRoot scope on the server", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "logger", track: ({ payload }) => spy(payload) }; + + await new Promise(resolve => { + createRoot(async dispose => { + const analytics = createAnalytics([plugin]); + flush(); + expect(analytics.pendingCount()).toBe(0); + + analytics.track("ssr_event", { ctx: "server" }); + await analytics.drain(); + + expect(spy).toHaveBeenCalledOnce(); + const payload = spy.mock.calls[0]![0] as TrackPayload; + expect(payload.event).toBe("ssr_event"); + dispose(); + resolve(); + }); + }); + }); + + it("pendingCount() is 0 immediately for synchronous plugins on the server", () => { + createRoot(dispose => { + const plugin: AnalyticsPlugin = { name: "sync" }; + const analytics = createAnalytics([plugin]); + flush(); + expect(analytics.pendingCount()).toBe(0); + dispose(); + }); + }); + + it("pendingCount() tracks queued events on the server", () => + new Promise(resolve => { + createRoot(d => { + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + const plugin: AnalyticsPlugin = { + name: "async", + initialize: () => initDone, + track: () => {}, + }; + const analytics = createAnalytics([plugin]); + analytics.track("a"); + analytics.track("b"); + flush(); + expect(analytics.pendingCount()).toBe(2); + + resolveInit(); + delay(20).then(() => { + flush(); + expect(analytics.pendingCount()).toBe(0); + d(); + resolve(); + }); + }); + })); + + it("page() omits browser-only defaults on the server", async () => { + const spy = vi.fn(); + const plugin: AnalyticsPlugin = { name: "logger", page: ({ payload }) => spy(payload) }; + + await new Promise(resolve => { + createRoot(async dispose => { + const analytics = createAnalytics([plugin]); + analytics.page({ title: "SSR Page" }); + await analytics.drain(); + const payload = spy.mock.calls[0]![0] as PagePayload; + expect(payload.properties.title).toBe("SSR Page"); + expect(payload.properties.url).toBeUndefined(); + dispose(); + resolve(); + }); + }); + }); +}); diff --git a/packages/analytics/tsconfig.json b/packages/analytics/tsconfig.json index 38c71ce71..b9b2b6782 100644 --- a/packages/analytics/tsconfig.json +++ b/packages/analytics/tsconfig.json @@ -5,7 +5,14 @@ "outDir": "dist", "rootDir": "src" }, - "references": [], + "references": [ + { + "path": "../event-listener" + }, + { + "path": "../utils" + } + ], "include": [ "src" ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed77c10ff..ca8252453 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,10 +122,20 @@ importers: version: 1.9.7 packages/analytics: + dependencies: + '@solid-primitives/event-listener': + specifier: workspace:^ + version: link:../event-listener + '@solid-primitives/utils': + specifier: workspace:^ + version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 packages/audio: dependencies: From df4b4dcb36a045a7c1a207a45d16d84eebbb2ade Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Mon, 1 Jun 2026 09:18:42 -0400 Subject: [PATCH 2/5] Replaced the internal queue with queue package --- packages/analytics/package.json | 1 + packages/analytics/src/analytics.ts | 101 +++++++++++++------------ packages/analytics/src/index.ts | 2 - packages/analytics/src/queue.ts | 40 ---------- packages/analytics/test/server.test.ts | 4 +- packages/analytics/tsconfig.json | 3 + packages/queue/src/task-queue.ts | 4 +- pnpm-lock.yaml | 3 + 8 files changed, 65 insertions(+), 93 deletions(-) delete mode 100644 packages/analytics/src/queue.ts diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 00c9e6e41..b9c7a6de5 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -56,6 +56,7 @@ }, "dependencies": { "@solid-primitives/event-listener": "workspace:^", + "@solid-primitives/queue": "workspace:^", "@solid-primitives/utils": "workspace:^" }, "devDependencies": { diff --git a/packages/analytics/src/analytics.ts b/packages/analytics/src/analytics.ts index 0792f9cef..5aacd3341 100644 --- a/packages/analytics/src/analytics.ts +++ b/packages/analytics/src/analytics.ts @@ -1,5 +1,6 @@ import { createSignal } from "solid-js"; import { tryOnCleanup, INTERNAL_OPTIONS } from "@solid-primitives/utils"; +import { makeQueue, type Queue } from "@solid-primitives/queue"; import type { AnyPayload, AnalyticsPlugin, @@ -13,7 +14,6 @@ import type { TrackPayload, IdentifyPayload, } from "./types.js"; -import { EventQueue } from "./queue.js"; let _seq = 0; function generateId(): string { @@ -90,13 +90,10 @@ async function dispatchSequential(plugins: AnalyticsPlugin[], payload: AnyPayloa } } -type StateSnapshot = { queueSize: number }; - -/** Internal engine — shared by makeAnalytics and (via makeAnalytics) createAnalytics. */ -function buildCore(options: AnalyticsOptions, onStateChange?: (snap: StateSnapshot) => void) { +/** Internal engine — shared by makeAnalytics and createAnalytics. */ +function buildCore(queue: Queue, options: AnalyticsOptions) { const { queueLimit = 100, retryInterval = 500, drainInterval, drainSize } = options; const batching = drainInterval != null; - const queue = new EventQueue(queueLimit); const plugins: AnalyticsPlugin[] = []; const initialized = new Set(); const inflight = new Set>(); @@ -116,14 +113,18 @@ function buildCore(options: AnalyticsOptions, onStateChange?: (snap: StateSnapsh return plugins.length > 0 && plugins.every(isReady); } - function notify(): void { - onStateChange?.({ queueSize: queue.size }); + function drainBatch(): AnyPayload[] { + const events: AnyPayload[] = []; + const max = drainSize ?? Infinity; + let item: AnyPayload | undefined; + while (events.length < max && (item = queue.remove()) !== undefined) { + events.push(item); + } + return events; } async function drainQueue(): Promise { - const events = queue.drain(drainSize); - notify(); - for (const { payload } of events) { + for (const payload of drainBatch()) { trackInflight(dispatchSequential(plugins, payload)); } await Promise.all([...inflight]); @@ -141,7 +142,7 @@ function buildCore(options: AnalyticsOptions, onStateChange?: (snap: StateSnapsh pollTimer = setInterval(() => { if (allReady()) { stopPoll(); - if (!batching) void drainQueue().then(() => notify()); + if (!batching) void drainQueue(); else startDrainTimer(); } }, retryInterval); @@ -157,7 +158,7 @@ function buildCore(options: AnalyticsOptions, onStateChange?: (snap: StateSnapsh function startDrainTimer(): void { if (!batching || drainTimer != null) return; drainTimer = setInterval(() => { - if (queue.size > 0) void drainQueue().then(() => notify()); + if (queue.size > 0) void drainQueue(); }, drainInterval); } @@ -177,90 +178,96 @@ function buildCore(options: AnalyticsOptions, onStateChange?: (snap: StateSnapsh } else { startPoll(); } - notify(); } function addPlugin(plugin: AnalyticsPlugin): void { plugins.push(plugin); void initPlugin(plugin); if (!allReady()) startPoll(); - notify(); } function dispatch(payload: AnyPayload): void { if (batching && allReady()) { - // Batching mode: accumulate in queue, drain on schedule. - queue.enqueue(payload); - notify(); + if (queue.size < queueLimit) queue.add(payload); } else if (allReady()) { trackInflight(dispatchSequential(plugins, payload)); } else { - queue.enqueue(payload); - notify(); + if (queue.size < queueLimit) queue.add(payload); } } - function drain(): Promise { - return Promise.all([...inflight]).then(() => {}); + async function drain(): Promise { + await Promise.all([...inflight]); } function stop(): void { stopPoll(); stopDrainTimer(); queue.clear(); - notify(); } return { addPlugin, dispatch, drain, stop }; } +function buildControls(core: ReturnType): AnalyticsControls { + return { + page: (properties = {}) => core.dispatch(buildPagePayload(properties)), + track: (event, properties = {}) => core.dispatch(buildTrackPayload(event, properties)), + identify: (userId, traits = {}) => core.dispatch(buildIdentifyPayload(userId, traits)), + use: plugin => core.addPlugin(plugin), + reset: () => core.stop(), + drain: () => core.drain(), + }; +} + /** * Non-reactive analytics primitive. Returns controls and a cleanup function. * Works on both server and client — plugins without DOM dependencies run identically * in SSR. Page property defaults (path, url, title, referrer) are omitted on the server. * - * @param onStateChange - Internal hook used by createAnalytics to observe state changes. - * @internal + * @param onQueueChange - Optional callback fired after every queue mutation with the + * new size. Used internally by `createAnalytics` to keep a reactive signal in sync. */ export function makeAnalytics( plugins: AnalyticsPlugin[], options: AnalyticsOptions = {}, - onStateChange?: (snap: StateSnapshot) => void, + onQueueChange?: (size: number) => void, ): [AnalyticsControls, () => void] { - const core = buildCore(options, onStateChange); + const q = makeQueue(); - for (const plugin of plugins) { - core.addPlugin(plugin); - } - - const controls: AnalyticsControls = { - page: (properties = {}) => core.dispatch(buildPagePayload(properties)), - track: (event, properties = {}) => core.dispatch(buildTrackPayload(event, properties)), - identify: (userId, traits = {}) => core.dispatch(buildIdentifyPayload(userId, traits)), - use: plugin => core.addPlugin(plugin), - reset: () => core.stop(), - drain: () => core.drain(), - }; + // When an observer is provided, wrap the plain queue so every mutation also + // fires the callback. Synchronous reads (isEmpty, size) go directly to the + // underlying queue — no batching involved — which is what the drain loop needs. + const queue: Queue = onQueueChange + ? { + get first() { return q.first; }, + get last() { return q.last; }, + get size() { return q.size; }, + get isEmpty() { return q.isEmpty; }, + add(...items) { q.add(...items); onQueueChange(q.size); }, + push(cmp, ...items) { q.push(cmp, ...items); onQueueChange(q.size); }, + remove() { const r = q.remove(); onQueueChange(q.size); return r; }, + clear() { q.clear(); onQueueChange(0); }, + } + : q; - return [controls, () => core.stop()]; + const core = buildCore(queue, options); + for (const plugin of plugins) core.addPlugin(plugin); + return [buildControls(core), () => core.stop()]; } /** * Reactive analytics primitive built on top of `makeAnalytics`. * Integrates with Solid's owner tree — auto-disposes on cleanup. - * Exposes `initialized` and `pendingCount` signals for reactive UI. + * Exposes `pendingCount` as a reactive signal driven by `makeAnalytics`'s queue. */ export function createAnalytics( plugins: AnalyticsPlugin[], options: AnalyticsOptions = {}, ): ReactiveAnalyticsControls { + // ownedWrite: true because dispatch() may be called inside createRoot scope in tests. const [pendingCount, setPendingCount] = createSignal(0, INTERNAL_OPTIONS); - - const [controls, cleanup] = makeAnalytics(plugins, options, ({ queueSize }) => { - setPendingCount(queueSize); - }); - + const [controls, cleanup] = makeAnalytics(plugins, options, setPendingCount); tryOnCleanup(cleanup); - return { ...controls, pendingCount }; } diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts index 38afd6df2..24d67387b 100644 --- a/packages/analytics/src/index.ts +++ b/packages/analytics/src/index.ts @@ -14,8 +14,6 @@ export type { ReactiveAnalyticsControls, } from "./types.js"; -export type { QueuedEvent } from "./queue.js"; - export { makeAnalytics, createAnalytics } from "./analytics.js"; export { AnalyticsProvider, useAnalytics } from "./context.js"; diff --git a/packages/analytics/src/queue.ts b/packages/analytics/src/queue.ts deleted file mode 100644 index 70040ff04..000000000 --- a/packages/analytics/src/queue.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { AnyPayload } from "./types.js"; - -export type QueuedEvent = { - payload: AnyPayload; -}; - -/** Bounded FIFO queue for analytics events pending plugin initialization. */ -export class EventQueue { - private readonly _limit: number; - private _items: QueuedEvent[] = []; - - constructor(limit = 100) { - this._limit = limit; - } - - /** - * Add an event to the queue. - * @returns `true` if enqueued, `false` if the queue is full. - */ - enqueue(payload: AnyPayload): boolean { - if (this._items.length >= this._limit) return false; - this._items.push({ payload }); - return true; - } - - /** Remove and return up to `limit` queued events (or all if limit is omitted). */ - drain(limit?: number): QueuedEvent[] { - return limit != null ? this._items.splice(0, limit) : this._items.splice(0); - } - - /** Number of events currently in the queue. */ - get size(): number { - return this._items.length; - } - - /** Discard all queued events without dispatching them. */ - clear(): void { - this._items = []; - } -} diff --git a/packages/analytics/test/server.test.ts b/packages/analytics/test/server.test.ts index 0eeea36e1..05d5e32e4 100644 --- a/packages/analytics/test/server.test.ts +++ b/packages/analytics/test/server.test.ts @@ -128,9 +128,9 @@ describe("makeAnalytics (server)", () => { expect(order).toEqual([]); resolveTrack(); - await flushed; + await drained; - expect(order).toEqual(["plugin", "flushed"]); + expect(order).toEqual(["plugin", "drained"]); cleanup(); }); }); diff --git a/packages/analytics/tsconfig.json b/packages/analytics/tsconfig.json index b9b2b6782..e950c5c9d 100644 --- a/packages/analytics/tsconfig.json +++ b/packages/analytics/tsconfig.json @@ -9,6 +9,9 @@ { "path": "../event-listener" }, + { + "path": "../queue" + }, { "path": "../utils" } diff --git a/packages/queue/src/task-queue.ts b/packages/queue/src/task-queue.ts index 8a2583075..2d188f956 100644 --- a/packages/queue/src/task-queue.ts +++ b/packages/queue/src/task-queue.ts @@ -94,7 +94,7 @@ export function createTaskQueue(): ReactiveTaskQueue { const entry = tasks.shift()!; setSize(tasks.length); try { - entry.resolve((await entry.fn()) as T); + entry.resolve(await entry.fn()); } catch (err) { entry.reject(err); } @@ -166,7 +166,7 @@ export function createConcurrentTaskQueue(concurrency: number): ReactiveConcu (async () => { try { - entry.resolve((await entry.fn()) as T); + entry.resolve(await entry.fn()); } catch (err) { entry.reject(err); } finally { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6cab3447e..2cfe4d330 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,6 +126,9 @@ importers: '@solid-primitives/event-listener': specifier: workspace:^ version: link:../event-listener + '@solid-primitives/queue': + specifier: workspace:^ + version: link:../queue '@solid-primitives/utils': specifier: workspace:^ version: link:../utils From 22a571904764fc3757f8ead856f16a3561f71239 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Mon, 1 Jun 2026 09:46:45 -0400 Subject: [PATCH 3/5] Optimizations to package --- packages/analytics/src/analytics.ts | 89 +++++++++++------------------ packages/utils/src/index.ts | 6 ++ 2 files changed, 40 insertions(+), 55 deletions(-) diff --git a/packages/analytics/src/analytics.ts b/packages/analytics/src/analytics.ts index 5aacd3341..c08476daf 100644 --- a/packages/analytics/src/analytics.ts +++ b/packages/analytics/src/analytics.ts @@ -1,6 +1,6 @@ import { createSignal } from "solid-js"; -import { tryOnCleanup, INTERNAL_OPTIONS } from "@solid-primitives/utils"; -import { makeQueue, type Queue } from "@solid-primitives/queue"; +import { tryOnCleanup, INTERNAL_OPTIONS, isServer, createIdGenerator } from "@solid-primitives/utils"; +import { makeQueue } from "@solid-primitives/queue"; import type { AnyPayload, AnalyticsPlugin, @@ -15,21 +15,14 @@ import type { IdentifyPayload, } from "./types.js"; -let _seq = 0; -function generateId(): string { - return `${Date.now().toString(36)}-${(++_seq).toString(36)}`; -} + + +const generateId = createIdGenerator(); function buildPagePayload(properties: PageProperties): PagePayload { - const defaults: PageProperties = - typeof window !== "undefined" - ? { - path: window.location.pathname, - url: window.location.href, - title: document.title, - referrer: document.referrer, - } - : {}; + const defaults: PageProperties = !isServer + ? { path: window.location.pathname, url: window.location.href, title: document.title, referrer: document.referrer } + : {}; return { type: "page", properties: { ...defaults, ...properties }, @@ -38,21 +31,11 @@ function buildPagePayload(properties: PageProperties): PagePayload { } function buildTrackPayload(event: string, properties: TrackProperties): TrackPayload { - return { - type: "track", - event, - properties, - meta: { rid: generateId(), ts: Date.now() }, - }; + return { type: "track", event, properties, meta: { rid: generateId(), ts: Date.now() } }; } function buildIdentifyPayload(userId: string, traits: IdentifyTraits): IdentifyPayload { - return { - type: "identify", - userId, - traits, - meta: { rid: generateId(), ts: Date.now() }, - }; + return { type: "identify", userId, traits, meta: { rid: generateId(), ts: Date.now() } }; } /** @@ -62,9 +45,7 @@ function buildIdentifyPayload(userId: string, traits: IdentifyTraits): IdentifyP async function invokePlugin(plugin: AnalyticsPlugin, payload: AnyPayload): Promise { const config = plugin.config ?? {}; let aborted = false; - const abort = (): void => { - aborted = true; - }; + const abort = (): void => { aborted = true; }; try { if (payload.type === "page" && plugin.page) { await plugin.page({ payload, config, abort }); @@ -85,13 +66,21 @@ async function invokePlugin(plugin: AnalyticsPlugin, payload: AnyPayload): Promi */ async function dispatchSequential(plugins: AnalyticsPlugin[], payload: AnyPayload): Promise { for (const plugin of plugins) { - const continued = await invokePlugin(plugin, payload); - if (!continued) break; + if (!await invokePlugin(plugin, payload)) break; } } +/** Minimal queue interface used by buildCore — a subset of Queue. */ +type EventBuffer = { + readonly size: number; + readonly isEmpty: boolean; + add(item: AnyPayload): void; + remove(): AnyPayload | undefined; + clear(): void; +}; + /** Internal engine — shared by makeAnalytics and createAnalytics. */ -function buildCore(queue: Queue, options: AnalyticsOptions) { +function buildCore(queue: EventBuffer, options: AnalyticsOptions) { const { queueLimit = 100, retryInterval = 500, drainInterval, drainSize } = options; const batching = drainInterval != null; const plugins: AnalyticsPlugin[] = []; @@ -164,17 +153,12 @@ function buildCore(queue: Queue, options: AnalyticsOptions) { async function initPlugin(plugin: AnalyticsPlugin): Promise { const config = plugin.config ?? {}; - if (plugin.initialize) { - await plugin.initialize({ config }); - } + if (plugin.initialize) await plugin.initialize({ config }); initialized.add(plugin.name); if (allReady()) { stopPoll(); - if (batching) { - startDrainTimer(); - } else { - await drainQueue(); - } + if (batching) startDrainTimer(); + else await drainQueue(); } else { startPoll(); } @@ -187,12 +171,10 @@ function buildCore(queue: Queue, options: AnalyticsOptions) { } function dispatch(payload: AnyPayload): void { - if (batching && allReady()) { - if (queue.size < queueLimit) queue.add(payload); - } else if (allReady()) { + if (!batching && allReady()) { trackInflight(dispatchSequential(plugins, payload)); - } else { - if (queue.size < queueLimit) queue.add(payload); + } else if (queue.size < queueLimit) { + queue.add(payload); } } @@ -214,9 +196,9 @@ function buildControls(core: ReturnType): AnalyticsControls { page: (properties = {}) => core.dispatch(buildPagePayload(properties)), track: (event, properties = {}) => core.dispatch(buildTrackPayload(event, properties)), identify: (userId, traits = {}) => core.dispatch(buildIdentifyPayload(userId, traits)), - use: plugin => core.addPlugin(plugin), - reset: () => core.stop(), - drain: () => core.drain(), + use: core.addPlugin, + reset: core.stop, + drain: core.drain, }; } @@ -238,14 +220,11 @@ export function makeAnalytics( // When an observer is provided, wrap the plain queue so every mutation also // fires the callback. Synchronous reads (isEmpty, size) go directly to the // underlying queue — no batching involved — which is what the drain loop needs. - const queue: Queue = onQueueChange + const queue: EventBuffer = onQueueChange ? { - get first() { return q.first; }, - get last() { return q.last; }, get size() { return q.size; }, get isEmpty() { return q.isEmpty; }, - add(...items) { q.add(...items); onQueueChange(q.size); }, - push(cmp, ...items) { q.push(cmp, ...items); onQueueChange(q.size); }, + add(item) { q.add(item); onQueueChange(q.size); }, remove() { const r = q.remove(); onQueueChange(q.size); return r; }, clear() { q.clear(); onQueueChange(0); }, } @@ -253,7 +232,7 @@ export function makeAnalytics( const core = buildCore(queue, options); for (const plugin of plugins) core.addPlugin(plugin); - return [buildControls(core), () => core.stop()]; + return [buildControls(core), core.stop]; } /** diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index c13ddf0ca..cf4fc82f8 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -102,6 +102,12 @@ export function reverseChain( export const clamp = (n: number, min: number, max: number) => Math.min(Math.max(n, min), max); +/** Creates an ID generator with its own isolated counter. Each call to the returned function produces a unique `timestamp-sequence` string. */ +export const createIdGenerator = (): (() => string) => { + let seq = 0; + return () => `${Date.now().toString(36)}-${(++seq).toString(36)}`; +}; + /** * Accesses the value of a MaybeAccessor * @example From 018be5222fe09fa8c0e5e1a4586e3813e98dc7ed Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:18:19 -0400 Subject: [PATCH 4/5] Added server proxy helper --- packages/analytics/DESIGN.md | 167 - packages/analytics/README.md | 140 +- packages/analytics/package.json | 41 +- packages/analytics/src/index.ts | 2 + packages/analytics/src/relay.ts | 32 + packages/analytics/src/relay/solidstart.ts | 36 + packages/analytics/src/relay/tanstack.ts | 37 + pnpm-lock.yaml | 4518 +++++++++++++++++++- 8 files changed, 4655 insertions(+), 318 deletions(-) delete mode 100644 packages/analytics/DESIGN.md create mode 100644 packages/analytics/src/relay.ts create mode 100644 packages/analytics/src/relay/solidstart.ts create mode 100644 packages/analytics/src/relay/tanstack.ts diff --git a/packages/analytics/DESIGN.md b/packages/analytics/DESIGN.md deleted file mode 100644 index 6cf009913..000000000 --- a/packages/analytics/DESIGN.md +++ /dev/null @@ -1,167 +0,0 @@ -# Analytics Primitive — Design Document - -## Goals - -1. Provide idiomatic Solid 2.0 `make*` / `create*` primitives for analytics tracking. -2. Be **plugin-compatible** with the [`analytics`](https://www.npmjs.com/package/analytics) npm package so that any existing plugin (GA4, Segment, Amplitude, Mixpanel, etc.) from the [plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) can be dropped in without modification. **No first-party plugins are maintained here.** -3. Expose a simple **event queue** that buffers events while plugins are still initializing, then drains automatically once all plugins are ready. -4. Stay **isomorphic** — no-ops on the server, full functionality in the browser. - ---- - -## Plugin Interface - -Plugins follow the same contract as the `analytics` npm package: - -```ts -interface AnalyticsPlugin { - name: string; - config?: Record; - - // Called once when the plugin is registered. - initialize?: (args: { config: Record }) => void | Promise; - - // Polled to determine whether an async script has finished loading. - loaded?: () => boolean; - - // Event handlers — each receives payload + config + an abort() fn. - page?: (args: PluginArgs) => void | Promise; - track?: (args: PluginArgs) => void | Promise; - identify?: (args: PluginArgs) => void | Promise; -} -``` - -Calling `abort()` inside a plugin handler stops further plugins from receiving that event (sequential dispatch model). - -Existing community plugins for the `analytics` npm package implement the same interface and are therefore directly compatible. - ---- - -## Event Payloads - -``` -PagePayload → { type: "page", properties: PageProperties, meta: EventMeta } -TrackPayload → { type: "track", event: string, properties, meta } -IdentifyPayload → { type: "identify", userId: string, traits, meta } - -EventMeta → { rid: string, ts: number } (request ID + timestamp) -``` - ---- - -## Architecture - -``` -┌─────────────────────────────────────────────────────────┐ -│ createAnalytics / makeAnalytics │ -│ │ -│ ┌──────────────┐ dispatch() ┌──────────────────┐ │ -│ │ page() │──────────────▶ │ │ │ -│ │ track() │ │ Plugin │ │ -│ │ identify() │ │ Registry │ │ -│ └──────────────┘ │ │ │ -│ │ isReady(plugin) │ │ -│ └────────┬─────────┘ │ -│ │ │ -│ ready? │ │ -│ ┌────yes─────────┤ │ -│ │ │ no │ -│ ▼ ▼ │ -│ send sequential EventQueue │ -│ to each plugin (FIFO, bounded) │ -│ │ │ -│ poll timer │ -│ (500 ms default) │ -│ │ │ -│ allReady? → drain │ -└─────────────────────────────────────────────────────────┘ -``` - -### Dispatch pipeline - -Events are dispatched **sequentially** through the plugin list. Each plugin can call `abort()` to prevent subsequent plugins from receiving the event. This mirrors the analytics npm package middleware model. - -### Queue - -A bounded FIFO `EventQueue` (default limit: 100 events) stores events when one or more plugins are not yet ready. The queue is drained automatically: - -- When `initialize()` resolves for a plugin and `allReady()` becomes true. -- On each poll-timer tick (default 500 ms) that observes `allReady()`. -- When a plugin added via `use()` causes `allReady()` to flip to true. - ---- - -## API - -### `makeAnalytics(plugins, options?)` - -Non-reactive base primitive. Returns `[AnalyticsControls, cleanup]`. The consumer is responsible for calling `cleanup()` to stop the poll timer. - -```ts -import googleAnalytics from "@analytics/google-analytics"; -const [analytics, cleanup] = makeAnalytics([googleAnalytics({ measurementId: "G-xxx" })]); -analytics.page({ title: "Home" }); -analytics.track("signup", { plan: "pro" }); -analytics.identify("u-1", { email: "alice@example.com" }); -analytics.use(anotherPlugin); -cleanup(); -``` - -### `createAnalytics(plugins, options?)` - -Reactive primitive that integrates with Solid's owner tree. Auto-cleans up on disposal. Adds two reactive signals: - -- `initialized: Accessor` — true when all plugins have initialized and `loaded()` returns true. -- `pendingCount: Accessor` — number of events currently queued. - -```ts -import googleAnalytics from "@analytics/google-analytics"; -const analytics = createAnalytics([googleAnalytics({ measurementId: "G-xxx" })]); - -// Use in JSX: - - - -

Pending events: {analytics.pendingCount()}

-``` - -## Options - -```ts -type AnalyticsOptions = { - queueLimit?: number; // max queued events, default 100 - retryInterval?: number; // ms between plugin-readiness checks, default 500 -}; -``` - ---- - -## Solid 2.0 Patterns Used - -| Concern | Pattern | -|---|---| -| Server detection | `isServer` from `@solidjs/web` | -| Reactive state | `createSignal` (plain, no ownedWrite needed — writes from async callbacks) | -| Lifecycle cleanup | `tryOnCleanup` from `@solid-primitives/utils` | -| No reactive scope required | All dispatches are imperative (event handlers, timers) | - -No `createEffect`, `createMemo`, or `createResource` are needed — analytics tracking is inherently imperative. Signals are used only to expose observable state (`initialized`, `pendingCount`) to consumers. - ---- - -## Non-Goals - -- **First-party plugins** — use the [analytics plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) directly. No plugins are maintained in this package. -- Middleware/transform pipeline on payload values (plugins handle their own transformations). -- Persistent event log / replay across page loads. -- Built-in retry logic for failed plugin calls (plugins are responsible for their own error handling). -- Replacing the full `analytics` npm package — this primitive is intentionally simpler. - ---- - -## Future Improvements - -- `withMiddleware(fn)` — a payload transformer before dispatch. -- Per-plugin event filtering (route-based, user-segment-based). -- Offline/service-worker queue persistence. -- Additional first-party plugins (Segment, Mixpanel, Plausible). diff --git a/packages/analytics/README.md b/packages/analytics/README.md index 5cafcee1c..73695782e 100644 --- a/packages/analytics/README.md +++ b/packages/analytics/README.md @@ -9,6 +9,9 @@ Primitives: - useAnalytics - makeAnalyticsGuard - createAnalyticsGuard + - createServerPlugin + - createSolidStartRelayPlugin + - createTanStackRelayPlugin Category: Utilities --- @@ -20,9 +23,7 @@ Category: Utilities [![stage](https://img.shields.io/endpoint?style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-0.json)](https://github.com/solidjs-community/solid-primitives#contribution-process) -- [**Docs**](https://primitives.solidjs.community/docs/analytics) - -Analytics tracking primitives for Solid.js with a queue-based dispatch pipeline, reactive signals, context sharing, and navigation guards. +Analytics tracking primitives for Solid.js with a queue-based dispatch pipeline, reactive signals, context sharing, navigation guards, and server relay support. Plugins are **not bundled** — install any plugin from the [analytics plugin catalogue](https://www.npmjs.com/package/analytics#analytic-plugins) (Google Analytics, Segment, Amplitude, Mixpanel, …) and pass it straight in. @@ -75,7 +76,6 @@ analytics.track("signup", { plan: "pro" }); analytics.identify("user-1", { email: "alice@example.com" }); analytics.use(anotherPlugin); // register a plugin at any time -// call when done cleanup(); ``` @@ -136,13 +136,13 @@ function BuyButton() { } ``` -`AnalyticsProvider` creates and owns the `createAnalytics` instance. It disposes automatically when the provider unmounts. `useAnalytics()` throws `ContextNotFoundError` if called outside a provider. +`AnalyticsProvider` creates and owns the `createAnalytics` instance, disposing automatically when the provider unmounts. `useAnalytics()` throws `ContextNotFoundError` if called outside a provider. --- ## Navigation guard -`makeAnalyticsGuard` / `createAnalyticsGuard` pause navigation until all in-flight plugin dispatches complete, preventing conversion events from being lost when users navigate away before async network calls finish. +`makeAnalyticsGuard` / `createAnalyticsGuard` pause navigation until all in-flight plugin dispatches complete, preventing events from being lost when users navigate away before async network calls finish. Both guards: - Return an `onBeforeLeave` handler compatible with SolidJS Router's `useBeforeLeave` @@ -170,7 +170,7 @@ const [analytics, cleanupAnalytics] = makeAnalytics([...]); const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); // wire onBeforeLeave into your routing solution -// call cleanup() when tearing down +cleanup(); // call when tearing down ``` ### How it works @@ -182,6 +182,115 @@ When `onBeforeLeave` fires: --- +## Server relay + +Route analytics events through your own server function instead of calling providers directly from the browser. This keeps API keys off the client and lets you enrich events with server-side context (session data, IP-based geo, etc.) before forwarding to the provider. + +``` +browser → createServerPlugin → your server function → GA / Mixpanel / Segment +``` + +### `createServerPlugin` + +```ts +import { createServerPlugin } from "@solid-primitives/analytics/relay"; +``` + +Creates a client-side plugin that forwards every event to a server function. The server function receives the full `AnyPayload` (including the original `rid` and `ts`) and is responsible for calling the actual provider. + +```ts +// client +import { createAnalytics } from "@solid-primitives/analytics"; +import { createServerPlugin } from "@solid-primitives/analytics/relay"; +import { relayEvent } from "./analytics.server"; + +const analytics = createAnalytics([ + createServerPlugin(relayEvent, { events: ["track", "identify"] }), +]); + +analytics.track("purchase", { orderId: "123" }); // → server → GA +``` + +**Options:** + +| Option | Type | Description | +|---|---|---| +| `name` | `string` | Plugin name. Default: `"server"` | +| `events` | `Array<"page" \| "track" \| "identify">` | Limit which event types are relayed. Omit to relay all. | + +--- + +### SolidStart + +```ts +import { createSolidStartRelayPlugin } from "@solid-primitives/analytics/relay/solidstart"; +``` + +Because SolidStart requires `"use server"` as a literal in your source code, define the action yourself and pass it to `createSolidStartRelayPlugin`: + +```ts +// analytics.server.ts +import { action } from "@solidjs/router"; +import googleAnalytics from "@analytics/google-analytics"; +import type { AnyPayload } from "@solid-primitives/analytics"; + +const ga = googleAnalytics({ measurementId: import.meta.env.VITE_GA_ID }); + +export const relayEvent = action(async (payload: AnyPayload) => { + "use server"; + await ga.track?.({ payload, config: {}, abort: () => {} }); +}); +``` + +```ts +// app.tsx +import { createAnalytics } from "@solid-primitives/analytics"; +import { createSolidStartRelayPlugin } from "@solid-primitives/analytics/relay/solidstart"; +import { relayEvent } from "./analytics.server"; + +const analytics = createAnalytics([ + createSolidStartRelayPlugin(relayEvent, { events: ["track", "identify"] }), +]); +``` + +--- + +### TanStack Start + +```ts +import { createTanStackRelayPlugin } from "@solid-primitives/analytics/relay/tanstack"; +``` + +`createTanStackRelayPlugin` wraps your TanStack Start server function and handles the `{ data }` call-site signature automatically: + +```ts +// analytics.server.ts +import { createServerFn } from "@tanstack/start"; +import googleAnalytics from "@analytics/google-analytics"; +import type { AnyPayload } from "@solid-primitives/analytics"; + +const ga = googleAnalytics({ measurementId: process.env.GA_ID }); + +export const relayEvent = createServerFn({ method: "POST" }) + .validator((d: unknown) => d as AnyPayload) + .handler(async ({ data: payload }) => { + await ga.track?.({ payload, config: {}, abort: () => {} }); + }); +``` + +```ts +// app.tsx +import { createAnalytics } from "@solid-primitives/analytics"; +import { createTanStackRelayPlugin } from "@solid-primitives/analytics/relay/tanstack"; +import { relayEvent } from "./analytics.server"; + +const analytics = createAnalytics([ + createTanStackRelayPlugin(relayEvent, { events: ["track", "identify"] }), +]); +``` + +--- + ## `drain()` All controls expose `drain(): Promise`, which resolves once every currently in-flight plugin call has settled. Useful for imperative navigation: @@ -191,7 +300,7 @@ await analytics.drain(); router.navigate("/checkout"); ``` -> Events still in the queue (waiting for a plugin to initialize) are not awaited by `drain()`. In practice, plugins are ready long before a user navigates, so this edge case rarely applies. +> Events still in the queue (waiting for a plugin to initialize) are not awaited by `drain()`. In practice, plugins are ready long before a user navigates. --- @@ -243,13 +352,13 @@ const myPlugin: AnalyticsPlugin = { // polled until true before queued events are flushed loaded: () => typeof window.myService !== "undefined", - page: ({ payload, abort }) => { window.myService.page(payload.properties); }, - track: ({ payload, abort }) => { window.myService.track(payload.event, payload.properties); }, - identify: ({ payload }) => { window.myService.identify(payload.userId, payload.traits); }, + page: ({ payload }) => { window.myService.page(payload.properties); }, + track: ({ payload }) => { window.myService.track(payload.event, payload.properties); }, + identify: ({ payload }) => { window.myService.identify(payload.userId, payload.traits); }, }; ``` -All event payloads carry a `meta` object with a unique request ID (`rid`) and a timestamp (`ts`). +All event payloads carry a `meta` object with a unique request ID (`rid`) and a Unix timestamp (`ts`). --- @@ -263,8 +372,7 @@ type AnalyticsOptions = { retryInterval?: number; /** * When set, switches to batch mode: events accumulate and flush on this - * interval (ms) rather than immediately. Without this option events fire - * as soon as plugins are ready. + * interval (ms) rather than immediately. */ drainInterval?: number; /** @@ -279,9 +387,9 @@ type AnalyticsOptions = { ## SSR -Both `makeAnalytics` and `createAnalytics` are isomorphic. On the server, `page()` omits browser-only defaults (`url`, `referrer`, `title`) since `window` is not available, but all other behaviour — plugin dispatch, queuing, `drain()` — works identically. Plugins that perform HTTP requests run on both sides without modification. +Both `makeAnalytics` and `createAnalytics` are isomorphic. On the server, `page()` omits browser-only defaults (`url`, `referrer`, `title`) since `window` is unavailable, but all other behaviour — plugin dispatch, queuing, `drain()` — works identically. -`makeAnalyticsGuard` / `createAnalyticsGuard` are no-ops on the server (no `window.addEventListener`). +`makeAnalyticsGuard` / `createAnalyticsGuard` are no-ops on the server. --- diff --git a/packages/analytics/package.json b/packages/analytics/package.json index b9c7a6de5..abe26cbb8 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -14,9 +14,29 @@ "browser": {}, "types": "./dist/index.d.ts", "exports": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./relay": { + "import": { + "types": "./dist/relay.d.ts", + "default": "./dist/relay.js" + } + }, + "./relay/solidstart": { + "import": { + "types": "./dist/relay/solidstart.d.ts", + "default": "./dist/relay/solidstart.js" + } + }, + "./relay/tanstack": { + "import": { + "types": "./dist/relay/tanstack.d.ts", + "default": "./dist/relay/tanstack.js" + } } }, "files": [ @@ -37,23 +57,30 @@ "AnalyticsProvider", "useAnalytics", "makeAnalyticsGuard", - "createAnalyticsGuard" + "createAnalyticsGuard", + "createServerPlugin", + "createEventHandler" ], "category": "Utilities" }, "keywords": [ "analytics", - "google", - "gtag", - "ga4", "tracking", "solid", + "solidstart", + "tanstack", "primitives" ], "peerDependencies": { "@solidjs/web": "^2.0.0-beta.14", + "@tanstack/start": "*", "solid-js": "^2.0.0-beta.14" }, + "peerDependenciesMeta": { + "@tanstack/start": { + "optional": true + } + }, "dependencies": { "@solid-primitives/event-listener": "workspace:^", "@solid-primitives/queue": "workspace:^", diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts index 24d67387b..a5b697b93 100644 --- a/packages/analytics/src/index.ts +++ b/packages/analytics/src/index.ts @@ -16,6 +16,8 @@ export type { export { makeAnalytics, createAnalytics } from "./analytics.js"; +export { createServerPlugin } from "./relay.js"; + export { AnalyticsProvider, useAnalytics } from "./context.js"; export { makeAnalyticsGuard, createAnalyticsGuard } from "./guard.js"; diff --git a/packages/analytics/src/relay.ts b/packages/analytics/src/relay.ts new file mode 100644 index 000000000..c683dc3ad --- /dev/null +++ b/packages/analytics/src/relay.ts @@ -0,0 +1,32 @@ +import type { AnalyticsPlugin, AnyPayload } from "./types.js"; + +/** + * Creates a client-side plugin that forwards every analytics event to a server + * function, which relays it to the actual provider (GA, Mixpanel, Segment, etc.) + * via its server-side SDK or HTTP API. + * + * This keeps API keys off the client and lets you enrich events with server-side + * context (session data, IP geo, etc.) before forwarding. + * + * ```ts + * // client + * const analytics = createAnalytics([ + * createServerPlugin(relayEvent, { events: ["track", "identify"] }), + * ]); + * + * analytics.track("purchase", { orderId: "123" }); // → server → GA + * ``` + */ +export function createServerPlugin( + fn: (payload: AnyPayload) => Promise, + options: { name?: string; events?: Array } = {}, +): AnalyticsPlugin { + const { name = "server", events } = options; + const handles = (type: AnyPayload["type"]) => !events || events.includes(type); + return { + name, + page: handles("page") ? ({ payload }) => fn(payload) : undefined, + track: handles("track") ? ({ payload }) => fn(payload) : undefined, + identify: handles("identify") ? ({ payload }) => fn(payload) : undefined, + }; +} diff --git a/packages/analytics/src/relay/solidstart.ts b/packages/analytics/src/relay/solidstart.ts new file mode 100644 index 000000000..6f3159b41 --- /dev/null +++ b/packages/analytics/src/relay/solidstart.ts @@ -0,0 +1,36 @@ +import type { AnyPayload, AnalyticsPlugin } from "../types.js"; +import { createServerPlugin } from "../relay.js"; + +/** + * Creates an analytics plugin that relays client events to a SolidStart server + * action, which dispatches them to your provider (GA, Mixpanel, etc.) server-side. + * + * Because SolidStart requires `"use server"` as a source literal, define the action + * yourself and pass it here: + * + * ```ts + * // analytics.server.ts + * import { action } from "@solidjs/router"; + * import googleAnalytics from "@analytics/google-analytics"; + * + * export const relayEvent = action(async (payload: AnyPayload) => { + * "use server"; + * const ga = googleAnalytics({ measurementId: import.meta.env.GA_ID }); + * await ga.track?.({ payload, config: {}, abort: () => {} }); + * }); + * + * // app.tsx + * import { createSolidStartRelayPlugin } from "@solid-primitives/analytics/relay/solidstart"; + * import { relayEvent } from "./analytics.server"; + * + * const analytics = createAnalytics([ + * createSolidStartRelayPlugin(relayEvent, { events: ["track", "identify"] }), + * ]); + * ``` + */ +export function createSolidStartRelayPlugin( + action: (payload: AnyPayload) => Promise, + options?: { name?: string; events?: Array }, +): AnalyticsPlugin { + return createServerPlugin(action, { name: "solidstart", ...options }); +} diff --git a/packages/analytics/src/relay/tanstack.ts b/packages/analytics/src/relay/tanstack.ts new file mode 100644 index 000000000..8b32daf77 --- /dev/null +++ b/packages/analytics/src/relay/tanstack.ts @@ -0,0 +1,37 @@ +import type { AnyPayload, AnalyticsPlugin } from "../types.js"; +import { createServerPlugin } from "../relay.js"; + +/** + * Creates an analytics plugin that relays client events to a TanStack Start server + * function, which dispatches them to your provider (GA, Mixpanel, etc.) server-side. + * + * Pass the already-created server function — `createTanStackRelayPlugin` handles + * the `{ data }` call signature so you don't have to: + * + * ```ts + * // analytics.server.ts + * import { createServerFn } from "@tanstack/start"; + * import googleAnalytics from "@analytics/google-analytics"; + * + * export const relayEvent = createServerFn({ method: "POST" }) + * .validator((d: unknown) => d as AnyPayload) + * .handler(async ({ data: payload }) => { + * const ga = googleAnalytics({ measurementId: process.env.GA_ID }); + * await ga.track?.({ payload, config: {}, abort: () => {} }); + * }); + * + * // app.tsx + * import { createTanStackRelayPlugin } from "@solid-primitives/analytics/relay/tanstack"; + * import { relayEvent } from "./analytics.server"; + * + * const analytics = createAnalytics([ + * createTanStackRelayPlugin(relayEvent, { events: ["track", "identify"] }), + * ]); + * ``` + */ +export function createTanStackRelayPlugin( + fn: (input: { data: AnyPayload }) => Promise, + options?: { name?: string; events?: Array }, +): AnalyticsPlugin { + return createServerPlugin(payload => fn({ data: payload }), { name: "tanstack", ...options }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2cfe4d330..000c8bfd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) '@storybook/addon-docs': specifier: ^10.4.1 - version: 10.4.1(@types/react@19.2.15)(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 10.4.1(@types/react@19.2.15)(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -37,10 +37,10 @@ importers: version: 22.15.31 '@typescript-eslint/eslint-plugin': specifier: ^8.34.0 - version: 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.34.0 - version: 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) + version: 8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3) babel-preset-solid: specifier: 2.0.0-beta.14 version: 2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) @@ -52,10 +52,10 @@ importers: version: 0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.14) eslint: specifier: ^9.28.0 - version: 9.28.0(jiti@1.21.7) + version: 9.28.0(jiti@2.7.0) eslint-plugin-eslint-comments: specifier: ^3.2.0 - version: 3.2.0(eslint@9.28.0(jiti@1.21.7)) + version: 3.2.0(eslint@9.28.0(jiti@2.7.0)) eslint-plugin-no-only-tests: specifier: ^3.3.0 version: 3.3.0 @@ -94,19 +94,19 @@ importers: version: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) storybook-solidjs-vite: specifier: ^10.1.0 - version: 10.1.1(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(esbuild@0.25.5)(rollup@4.43.0)(solid-js@2.0.0-beta.14)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 10.1.1(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(esbuild@0.25.5)(rollup@4.60.4)(solid-js@2.0.0-beta.14)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + version: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) vite-plugin-solid: specifier: 3.0.0-next.5 - version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) vitest: specifier: ^2.1.9 - version: 2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8) + version: 2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0) packages/active-element: dependencies: @@ -132,6 +132,9 @@ importers: '@solid-primitives/utils': specifier: workspace:^ version: link:../utils + '@tanstack/start': + specifier: '*' + version: 1.120.20(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))(yaml@2.5.0) devDependencies: '@solidjs/web': specifier: 2.0.0-beta.14 @@ -453,7 +456,7 @@ importers: devDependencies: '@graphql-codegen/cli': specifier: ^5.0.0 - version: 5.0.2(@types/node@22.15.31)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3) + version: 5.0.2(@parcel/watcher@2.5.6)(@types/node@22.15.31)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3) '@graphql-codegen/typed-document-node': specifier: ^5.0.1 version: 5.0.9(graphql@16.9.0) @@ -1311,7 +1314,7 @@ importers: version: 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start': specifier: ^2.0.0-beta.17 - version: 2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1369,10 +1372,10 @@ importers: version: 4.0.0 vite: specifier: ^8.0.8 - version: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + version: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) vite-plugin-solid: specifier: 3.0.0-next.5 - version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) packages: @@ -1400,6 +1403,10 @@ packages: '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1494,6 +1501,10 @@ packages: resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.27.1': resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} @@ -1688,6 +1699,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.25.2': resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} @@ -1807,6 +1830,10 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@cloudflare/kv-asset-handler@0.4.2': + resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} + engines: {node: '>=18.0.0'} + '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -1835,6 +1862,12 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@deno/shim-deno-test@0.5.0': + resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} + + '@deno/shim-deno@0.19.2': + resolution: {integrity: sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q==} + '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -1850,6 +1883,12 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1862,6 +1901,18 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1874,6 +1925,18 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1886,6 +1949,18 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1898,6 +1973,18 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1910,6 +1997,18 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1922,6 +2021,18 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1934,6 +2045,18 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1946,6 +2069,18 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1958,6 +2093,18 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1970,6 +2117,18 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1982,6 +2141,18 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -1994,6 +2165,18 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -2006,6 +2189,18 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -2018,6 +2213,18 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -2030,6 +2237,18 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -2042,6 +2261,18 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -2054,12 +2285,30 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.5': resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -2072,12 +2321,30 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -2090,6 +2357,24 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -2102,6 +2387,18 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -2114,6 +2411,18 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -2126,6 +2435,18 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -2138,6 +2459,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2579,10 +2906,17 @@ packages: cpu: [x64] os: [win32] + '@ioredis/commands@1.10.0': + resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0': resolution: {integrity: sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==} peerDependencies: @@ -2610,9 +2944,15 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2628,6 +2968,11 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + '@mdx-js/react@3.1.1': resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: @@ -2714,14 +3059,26 @@ packages: '@nothing-but/utils@0.17.0': resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + '@oozcitak/dom@2.0.2': resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} engines: {node: '>=20.0'} + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + '@oozcitak/infra@2.0.2': resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} engines: {node: '>=20.0'} + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + '@oozcitak/url@3.0.0': resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} engines: {node: '>=20.0'} @@ -2730,6 +3087,10 @@ packages: resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} engines: {node: '>=20.0'} + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + '@oxc-parser/binding-android-arm-eabi@0.127.0': resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2971,29 +3332,138 @@ packages: cpu: [x64] os: [win32] - '@peculiar/asn1-schema@2.3.13': - resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] - '@peculiar/json-schema@1.1.12': - resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} - engines: {node: '>=8.0.0'} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] - '@peculiar/webcrypto@1.5.0': - resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} - engines: {node: '>=10.12.0'} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] - '@reduxjs/toolkit@1.9.7': - resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} - peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 - react-redux: ^7.2.1 || ^8.0.2 - peerDependenciesMeta: - react: - optional: true + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-wasm@2.3.0': + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-wasm@2.5.6': + resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@peculiar/asn1-schema@2.3.13': + resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==} + + '@peculiar/json-schema@1.1.12': + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + + '@peculiar/webcrypto@1.5.0': + resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} + engines: {node: '>=10.12.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.7.0': + resolution: {integrity: sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + + '@reduxjs/toolkit@1.9.7': + resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true react-redux: optional: true @@ -3095,66 +3565,207 @@ packages: cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/plugin-alias@6.0.0': + resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} + engines: {node: '>=20.19.0'} + peerDependencies: + rollup: '>=4.0.0' + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@29.0.3': + resolution: {integrity: sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@6.0.3': + resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@1.0.0': + resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.43.0': resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.60.4': + resolution: {integrity: sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.43.0': resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.60.4': + resolution: {integrity: sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.43.0': resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.60.4': + resolution: {integrity: sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.43.0': resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.60.4': + resolution: {integrity: sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.43.0': resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.60.4': + resolution: {integrity: sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.43.0': resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.60.4': + resolution: {integrity: sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} cpu: [arm] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} + cpu: [arm] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm-musleabihf@4.43.0': resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} + cpu: [arm] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-arm64-gnu@4.43.0': resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm64-gnu@4.60.4': + resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm64-musl@4.43.0': resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} cpu: [arm64] os: [linux] libc: [musl] + '@rollup/rollup-linux-arm64-musl@4.60.4': + resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.4': + resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} + cpu: [loong64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] @@ -3167,55 +3778,135 @@ packages: os: [linux] libc: [glibc] + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} + cpu: [ppc64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-riscv64-gnu@4.43.0': resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} cpu: [riscv64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-riscv64-musl@4.43.0': resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] libc: [musl] + '@rollup/rollup-linux-riscv64-musl@4.60.4': + resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-s390x-gnu@4.43.0': resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} cpu: [s390x] os: [linux] libc: [glibc] + '@rollup/rollup-linux-s390x-gnu@4.60.4': + resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.43.0': resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.60.4': + resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-musl@4.43.0': resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} cpu: [x64] os: [linux] libc: [musl] + '@rollup/rollup-linux-x64-musl@4.60.4': + resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.4': + resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.4': + resolution: {integrity: sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.43.0': resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.60.4': + resolution: {integrity: sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.43.0': resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.60.4': + resolution: {integrity: sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.4': + resolution: {integrity: sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.43.0': resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.60.4': + resolution: {integrity: sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==} + cpu: [x64] + os: [win32] + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@solid-devtools/debugger@0.28.1': resolution: {integrity: sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==} peerDependencies: @@ -3324,6 +4015,9 @@ packages: peerDependencies: solid-js: ^2.0.0-beta.14 + '@speed-highlight/core@1.2.15': + resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} + '@storybook/addon-docs@10.4.1': resolution: {integrity: sha512-IYqUdjoZe4VO2LFZlKL/gwy7DsQSWCq6hX+zc1MBmZo04yycDASk1tte57n9pdlW3ajw9yYMF/+lVBi+xQjyvw==} peerDependencies: @@ -3415,19 +4109,110 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' + '@tanstack/directive-functions-plugin@1.131.2': + resolution: {integrity: sha512-5Pz6aVPS0BW+0bLvMzWsoajfjI6ZeWqkbVBaQfIbSTm4DOBO05JuQ/pb7W7m3GbCb5TK1a/SKDhuTX6Ag5I7UQ==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + + '@tanstack/directive-functions-plugin@1.142.1': + resolution: {integrity: sha512-k4HhAaitobp+z2pXBkmoWgE8Ollhx7fQXpVL+PQ7HeHZc2PilrQtC3ysxvoPunufrztIxweSE9HAWkZ2AFNaLw==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0 || >=7.0.0' + + '@tanstack/history@1.131.2': + resolution: {integrity: sha512-cs1WKawpXIe+vSTeiZUuSBy8JFjEuDgdMKZFRLKwQysKo8y2q6Q1HvS74Yw+m5IhOW1nTZooa6rlgdfXcgFAaw==} + engines: {node: '>=12'} + '@tanstack/history@1.161.6': resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} engines: {node: '>=20.19'} + '@tanstack/history@1.162.0': + resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + engines: {node: '>=20.19'} + + '@tanstack/react-router@1.170.10': + resolution: {integrity: sha512-gVmWYq0ucWr+OB97Nud0YhKa9NOipB7/QrWI7wRZJJWEL0qUS8WPqAs0vA1f3IBXZpXmf8xxzf/tl5cmo4tlmA==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.168.7': + resolution: {integrity: sha512-ldvWrNvXb/EXAY+8uj0XbkVlP0Uh6Ddm63NNNKWf5V2BcQ6KRxiZgANXLWlKRczmnklZiwN2eWFexEJFEzetLQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-plugin@1.131.50': + resolution: {integrity: sha512-ys+sGvnnE8BUNjGsngg+MGn3F5lV4okL5CWEKFzjBSjQsrTN7apGfmqvBP3O6PkRPHpXZ8X3Z5QsFvSc0CaDRQ==} + engines: {node: '>=12'} + peerDependencies: + '@vitejs/plugin-react': '>=4.3.4' + vite: '>=6.0.0' + + '@tanstack/react-start-router-manifest@1.120.19': + resolution: {integrity: sha512-z+4YL6shTtsHjk32yaIemQwgkx6FcqwPBYfeNt7Co2eOpWrvsoo/Fe9869/oIY2sPyhiWDs1rDb3e0qnAy8Cag==} + engines: {node: '>=12'} + + '@tanstack/react-start-server@1.167.13': + resolution: {integrity: sha512-u/nfkW9M79HRx45uJipEi6txjfTJhYTFUirBSm7jqZfId7RRDfV+j38fipGhbIbCjCkHd6hPbUzJAnQFoM0uqg==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.131.50': + resolution: {integrity: sha512-eojd4JZ5ziUhGEmXZ4CaVX5mQdiTMiz56Sp8ZQ6r7deb55Q+5G4JQDkeuXpI7HMAvzr+4qlsFeLaDRXXjXyOqQ==} + engines: {node: '>=12'} + '@tanstack/router-core@1.168.9': resolution: {integrity: sha512-18oeEwEDyXOIuO1VBP9ACaK7tYHZUjynGDCoUh/5c/BNhia9vCJCp9O0LfhZXOorDc/PmLSgvmweFhVmIxF10g==} engines: {node: '>=20.19'} hasBin: true + '@tanstack/router-core@1.171.8': + resolution: {integrity: sha512-PbrTBbofFcacrH3RLgHYILRqTFnAGq+gXrXoA/vo7qUSkJpSO4GWfLtrtCahD4VayzRm19IPwcjPPLEugag6pw==} + engines: {node: '>=20.19'} + + '@tanstack/router-generator@1.131.50': + resolution: {integrity: sha512-zlMBw5l88GIg3v+378JsfDYq3ejEaJmD3P1R+m0yEPxh0N//Id1FjKNSS7yJbejlK2WGVm9DUG46iBdTDMQM+Q==} + engines: {node: '>=12'} + '@tanstack/router-generator@1.166.24': resolution: {integrity: sha512-vdaGKwuH+r+DPe6R1mjk+TDDmDH6NTG7QqwxHqGEvOH4aGf9sPjhmRKNJZqQr8cPIbfp6u5lXyZ1TeDcSNMVEA==} engines: {node: '>=20.19'} + '@tanstack/router-plugin@1.131.50': + resolution: {integrity: sha512-gdEBPGzx7llQNRnaqfPJ1iaPS3oqB8SlvKRG5l7Fxp4q4yINgkeowFYSKEhPOc9bjoNhGrIHOlvPTPXEzAQXzQ==} + engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.131.50 + vite: '>=5.0.0 || >=6.0.0' + vite-plugin-solid: ^2.11.2 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + '@tanstack/router-plugin@1.167.12': resolution: {integrity: sha512-StEHcctCuFI5taSjO+lhR/yQ+EK63BdyYa+ne6FoNQPB3MMrOUrz2ZVnbqILRLkh2b+p2EfBKt65sgAKdKygPQ==} engines: {node: '>=20.19'} @@ -3450,13 +4235,29 @@ packages: webpack: optional: true + '@tanstack/router-utils@1.131.2': + resolution: {integrity: sha512-sr3x0d2sx9YIJoVth0QnfEcAcl+39sQYaNQxThtHmRpyeFYNyM2TTH+Ud3TNEnI3bbzmLYEUD+7YqB987GzhDA==} + engines: {node: '>=12'} + + '@tanstack/router-utils@1.141.0': + resolution: {integrity: sha512-/eFGKCiix1SvjxwgzrmH4pHjMiMxc+GA4nIbgEkG2RdAJqyxLcRhd7RPLG0/LZaJ7d0ad3jrtRqsHLv2152Vbw==} + engines: {node: '>=12'} + '@tanstack/router-utils@1.161.6': resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} engines: {node: '>=20.19'} - '@tanstack/solid-router@2.0.0-beta.17': - resolution: {integrity: sha512-NJyYMv/NNnsm4N93wi1E7WMHtf+194fpQAQzFlguyK66fHQQ9gbif0stFh2WK9tOAtD5uZjRUGTlRPrnTLzd1w==} - engines: {node: '>=20.19'} + '@tanstack/server-functions-plugin@1.131.2': + resolution: {integrity: sha512-hWsaSgEZAVyzHg8+IcJWCEtfI9ZSlNELErfLiGHG9XCHEXMegFWsrESsKHlASzJqef9RsuOLDl+1IMPIskwdDw==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.142.1': + resolution: {integrity: sha512-ltTOj6dIDlRV3M8+PzontDYFMnIQ+icUnD+OKzIRfKo6bbvC0qvy8ttuWmVJxmqHy9xsWgkNt4gZrKVjtWXIhQ==} + engines: {node: '>=12'} + + '@tanstack/solid-router@2.0.0-beta.17': + resolution: {integrity: sha512-NJyYMv/NNnsm4N93wi1E7WMHtf+194fpQAQzFlguyK66fHQQ9gbif0stFh2WK9tOAtD5uZjRUGTlRPrnTLzd1w==} + engines: {node: '>=20.19'} hasBin: true peerDependencies: '@solidjs/web': '>=2.0.0-0 <3.0.0' @@ -3485,30 +4286,110 @@ packages: solid-js: '>=2.0.0-0 <3.0.0' vite: '>=7.0.0' + '@tanstack/start-api-routes@1.120.19': + resolution: {integrity: sha512-zvMI9Rfwsm3CCLTLqdvUfteDRMdPKTOO05O3L8vp49BrYYsLrT0OplhounzdRMgGMnKd4qCXUC9Pj4UOUOodTw==} + engines: {node: '>=12'} + + '@tanstack/start-client-core@1.131.50': + resolution: {integrity: sha512-8fbwYca1NAu/5WyGvO3e341/FPpsiqdPrrzkoc0cXQimMN1DligoRjvHgP13q3n5w1tFMSqChGzXfOVJP9ndSw==} + engines: {node: '>=12'} + '@tanstack/start-client-core@1.167.9': resolution: {integrity: sha512-2ETQO/bxiZGsoTdPxZb7xR8YqCy5l4kv/QPkwIXuvx/A4BjufngXfgISjXUicXsFRIBZeiFnBzp9A38UMsS2iA==} engines: {node: '>=22.12.0'} hasBin: true + '@tanstack/start-client-core@1.170.6': + resolution: {integrity: sha512-Zh4JY3bWiM8K807CnyRE/+53YiUx/R6nRhQr1BSxaXM3iFh9/FxoN4peK+yhkG7Hq/O2AGBWHt9yscxrsFD5+g==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-config@1.120.20': + resolution: {integrity: sha512-oH/mfTSHV8Qbil74tWicPLW6+kKmT3esXCnDzvrkhi3+N8ZuVUDr01Qpil0Wxf9lLPfM5L6VX03nF4hSU8vljg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: ^6.0.0 + '@tanstack/start-fn-stubs@1.161.6': resolution: {integrity: sha512-Y6QSlGiLga8cHfvxGGaonXIlt2bIUTVdH6AMjmpMp7+ANNCp+N96GQbjjhLye3JkaxDfP68x5iZA8NK4imgRig==} engines: {node: '>=22.12.0'} + '@tanstack/start-fn-stubs@1.162.0': + resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-plugin-core@1.131.50': + resolution: {integrity: sha512-eFvMA0chqLtHbq+8ojp1fXN7AQjhmeoOpQaZaU1d51wb7ugetrn0k3OuHblxtE/O0L4HEC9s4X5zmFJt0vLh0w==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + '@tanstack/start-plugin-core@1.167.17': resolution: {integrity: sha512-OkorpOobGOEDVr72QUmkzKjbawKC05CSz+1B3OObB/AxBIIw+lLLhTXbV45QkX2LZA7dcRvPJYZGOH1pkFqA1g==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' + '@tanstack/start-server-core@1.131.50': + resolution: {integrity: sha512-3SWwwhW2GKMhPSaqWRal6Jj1Y9ObfdWEXKFQid1LBuk5xk/Es4bmW68o++MbVgs/GxUxyeZ3TRVqb0c7RG1sog==} + engines: {node: '>=12'} + '@tanstack/start-server-core@1.167.9': resolution: {integrity: sha512-vKkslQIihoDDVumF73VXT7PVFmN7Nea0nKhZx7gMbc0m09yPQYYR1dn86/dz14k6/7cDkJ+qKXa09rlVlN/i9Q==} engines: {node: '>=22.12.0'} hasBin: true + '@tanstack/start-server-core@1.169.8': + resolution: {integrity: sha512-yVhdg9QLNUrXdXDn5kN76u0YFKraR7bgb6ZFqHCbX63sTPabD4Z1fBr68PnzqKWB2gXfJmP9JN1puvcdChKeYA==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-server-functions-client@1.131.50': + resolution: {integrity: sha512-4aM17fFdVAFH6uLPswKJxzrhhIjcCwKqzfTcgY3OnhUKnaZBTQwJA+nUHQCI6IWvEvrcrNVtFTtv13TkDk3YMw==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-fetcher@1.131.50': + resolution: {integrity: sha512-yeZekr84BkyLaNaZ4llKbDBb+CJPVESP881iJijP++SuRmvetivUs75KiV9VFIf7MhdefICmRcCdff/KbK5QnQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-handler@1.120.19': + resolution: {integrity: sha512-Ow8HkNieoqHumD3QK4YUDIhzBtFX9mMEDrxFYtbVBgxP1C9Rm/YDuwnUNP49q1tTOZ22Bs4wSDjBXvu+OgSSfA==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-server@1.131.2': + resolution: {integrity: sha512-u67d6XspczlC/dYki/Id28oWsTjkZMJhDqO4E23U3rHs8eYgxvMBHKqdeqWgOyC+QWT9k6ze1pJmbv+rmc3wOQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-ssr@1.120.19': + resolution: {integrity: sha512-D4HGvJXWvVUssgkLDtdSJTFfWuT+nVv9GauPfVQTtMUUy+NbExNkFWKvF+XvCS81lBqnCKL7VrWqZMXiod0gTA==} + engines: {node: '>=12'} + + '@tanstack/start-storage-context@1.131.50': + resolution: {integrity: sha512-qbVFdx/B5URJXzWjguaiCcQhJw2NL8qFGtSzLSGilxQnvtJdM+V9VBMizKIxhm9oiYnfqGsVfyMOBD7q9f8Y1Q==} + engines: {node: '>=12'} + '@tanstack/start-storage-context@1.166.23': resolution: {integrity: sha512-3vEdiYRMx+r+Q7Xqxj3YmADPIpMm7fkKxDa8ITwodGXiw+SBJCGkpBXGUWjOXyXkIyqGHKM5UrReTcVUTkmaug==} engines: {node: '>=22.12.0'} + '@tanstack/start-storage-context@1.167.10': + resolution: {integrity: sha512-geCsFpgCt+S2gQjzXILdPZ9obIxtzuN8C0Esc1fcyWZhwYyqo4C8G2o/dIck8xGixCMSvOsxL5NkCXDdOm2KOQ==} + engines: {node: '>=22.12.0'} + + '@tanstack/start@1.120.20': + resolution: {integrity: sha512-fQO+O/5xJpli5KlV6pwDz6DtpbqO/0atdVSyVnkemzk0Mej9azm4HXtw+cKkIPtsSplWs4B1EbMtgGMb9ADhSA==} + engines: {node: '>=12'} + + '@tanstack/store@0.7.7': + resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@tanstack/virtual-file-routes@1.131.2': + resolution: {integrity: sha512-VEEOxc4mvyu67O+Bl0APtYjwcNRcL9it9B4HKbNgcBTIOEalhk+ufBl4kiqc8WP1sx1+NAaiS+3CcJBhrqaSRg==} + engines: {node: '>=12'} + '@tanstack/virtual-file-routes@1.161.7': resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} engines: {node: '>=20.19'} @@ -3544,6 +4425,9 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__code-frame@7.27.0': + resolution: {integrity: sha512-Dwlo+LrxDx/0SpfmJ/BKveHf7QXWvLBLc+x03l5sbzykj3oB9nHygCpSECF1a+s+QIxbghe+KHqC90vGtxLRAA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3556,6 +4440,9 @@ packages: '@types/babel__traverse@7.20.7': resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/braces@3.0.5': + resolution: {integrity: sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -3601,6 +4488,9 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/micromatch@4.0.10': + resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -3616,6 +4506,9 @@ packages: '@types/react@19.2.15': resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/sizzle@2.3.8': resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==} @@ -3693,6 +4586,21 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vercel/nft@1.10.2': + resolution: {integrity: sha512-w+WyX5Ulmj4dtTZrxaulqrjaLZHSbnPzx75SJsTNYmotKsqn1JlLnDJa+lz5hn90HJofhl/2MAtw0mCrgM3qYw==} + engines: {node: '>=20'} + hasBin: true + + '@vinxi/listhen@1.5.6': + resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} + hasBin: true + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@2.1.9': resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} @@ -3754,6 +4662,19 @@ packages: resolution: {integrity: sha512-oOknAo8NvDnvj7P0N2ZHq/n3iK3wVtJHXwLVUsBBlc+u3UaNiL+bwXmS2OKu/pH+rIWMtOsXsTABrPjcCgEByg==} engines: {node: '>=18.0.0'} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3776,6 +4697,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -3787,6 +4713,9 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -3830,6 +4759,14 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -3869,6 +4806,12 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -3887,6 +4830,14 @@ packages: resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} hasBin: true + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} @@ -3950,6 +4901,47 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.8.3: + resolution: {integrity: sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.1: + resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.9.1: + resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.13.1: + resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.3: + resolution: {integrity: sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3966,12 +4958,19 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -3994,9 +4993,19 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -4009,6 +5018,14 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -4032,6 +5049,10 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + caniuse-lite@1.0.30001722: resolution: {integrity: sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==} @@ -4053,6 +5074,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case-all@1.0.15: resolution: {integrity: sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==} @@ -4090,14 +5115,32 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -4117,6 +5160,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -4124,6 +5171,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -4132,6 +5183,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cluster-key-slot@1.1.1: + resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} + engines: {node: '>=0.10.0'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -4161,6 +5216,9 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -4173,18 +5231,50 @@ packages: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compatx@0.2.0: + resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-es@2.0.1: + resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} + + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -4194,6 +5284,19 @@ packages: typescript: optional: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} @@ -4205,6 +5308,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -4248,9 +5354,44 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + dax-sh@0.39.2: + resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} + deprecated: This package has moved to simply be 'dax' instead of 'dax-sh' + + db0@0.3.4: + resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + sqlite3: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true + mysql2: + optional: true + sqlite3: + optional: true + debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -4260,6 +5401,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -4277,6 +5427,10 @@ packages: 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'} @@ -4295,10 +5449,21 @@ packages: defined@1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} @@ -4307,6 +5472,13 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -4363,10 +5535,18 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} + dotenv@16.5.0: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} @@ -4375,12 +5555,21 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.166: resolution: {integrity: sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4393,6 +5582,10 @@ packages: emoticon@4.1.0: resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + encoding-sniffer@0.2.1: resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} @@ -4415,6 +5608,9 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -4440,6 +5636,11 @@ packages: esbuild: '>=0.20' solid-js: '>= 1.0' + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -4450,10 +5651,18 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -4519,6 +5728,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -4526,6 +5738,28 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + expect-type@1.2.1: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} @@ -4553,6 +5787,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -4602,6 +5839,9 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + fetchdts@0.1.7: + resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -4610,6 +5850,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4629,6 +5872,15 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -4644,6 +5896,14 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4680,17 +5940,32 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + giget@3.2.0: + resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==} + hasBin: true + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -4727,6 +6002,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@16.2.0: + resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==} + engines: {node: '>=20'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4768,6 +6047,16 @@ packages: resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + h3@1.13.0: + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + h3@2.0.1-rc.16: resolution: {integrity: sha512-h+pjvyujdo9way8qj6FUbhaQcHlR8FEq65EhTX9ViT5pK8aLj68uFl4hBkF+hsTJAH+H1END2Yv6hTIsabGfag==} engines: {node: '>=20.11.1'} @@ -4778,6 +6067,16 @@ packages: crossws: optional: true + h3@2.0.1-rc.20: + resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -4826,6 +6125,9 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -4843,18 +6145,37 @@ packages: htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + httpxy@0.5.3: + resolution: {integrity: sha512-SMS9V6Sn7VWaS11lYhoAr0ceoaiolTWf4jYdJn0NJhCdKMu9R2H9Fh0LBDWBHQF6HRLI1PmaePYsjanSpE5PEw==} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4892,6 +6213,9 @@ packages: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} engines: {node: '>=12.2'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4914,6 +6238,13 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ioredis@5.11.0: + resolution: {integrity: sha512-EZBErytyVovD8f6pDfG3Kb37N6Y3lmDA9NNj+4+IP13CzzHGeX+OyeRM2Um13khRzoBSzzL+5lVnCX8V2RLeMg==} + engines: {node: '>=12.22.0'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-absolute@1.0.0: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} @@ -4949,6 +6280,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -4961,10 +6296,17 @@ packages: is-lower-case@2.0.2: resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4972,10 +6314,21 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-relative@1.0.0: resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} engines: {node: '>=0.10.0'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -5003,6 +6356,13 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isbot@5.1.40: resolution: {integrity: sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==} engines: {node: '>=18'} @@ -5010,6 +6370,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -5022,12 +6386,19 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + jose@5.6.3: resolution: {integrity: sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -5084,10 +6455,25 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - leaflet@1.9.4: - resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} - levn@0.4.1: + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.3.0: + resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + leaflet@1.9.4: + resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5176,6 +6562,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + listhen@1.10.0: + resolution: {integrity: sha512-kfz4C0OrC6IpaVMtYDJtf6PFjurxe9NBBoDAh/o2p587INryFOO4DQ9OetbCdDrWFt1m1CJKvYrzkGsuPHw8nQ==} + hasBin: true + listr2@4.0.5: resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} engines: {node: '>=12'} @@ -5185,6 +6575,10 @@ packages: enquirer: optional: true + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -5258,6 +6652,12 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} @@ -5309,6 +6709,9 @@ packages: 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'} @@ -5414,14 +6817,41 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -5437,6 +6867,10 @@ packages: resolution: {integrity: sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -5452,10 +6886,20 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5494,9 +6938,22 @@ packages: sass: optional: true + nitropack@2.13.4: + resolution: {integrity: sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -5509,6 +6966,9 @@ packages: resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} engines: {node: '>=18'} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -5522,12 +6982,28 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.4.0: + resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -5543,6 +7019,10 @@ packages: normalize.css@8.0.1: resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -5567,6 +7047,19 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@1.1.6: + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5574,10 +7067,18 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -5662,6 +7163,10 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -5680,6 +7185,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -5699,6 +7208,9 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5713,6 +7225,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} @@ -5743,6 +7258,12 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + postcss-functions@3.0.0: resolution: {integrity: sha512-N5yWXWKA+uhpLQ9ZhBRl2bIAdM6oVJYpDojuI1nF2SzXBimJcdjFwiAouBVbO5VuOF3qA6BSFWFc3wXbbj72XQ==} @@ -5820,6 +7341,10 @@ packages: resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5889,6 +7414,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@7.1.0: + resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} + engines: {node: '>=20'} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -5897,6 +7426,13 @@ packages: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -5924,9 +7460,22 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: @@ -5940,6 +7489,10 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + react@19.2.6: resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} @@ -5951,14 +7504,28 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -5967,6 +7534,14 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + reduce-css-calc@2.1.8: resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} @@ -6028,6 +7603,9 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@4.1.8: resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} @@ -6063,11 +7641,29 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rollup-plugin-visualizer@7.0.1: + resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} + engines: {node: '>=22'} + hasBin: true + peerDependencies: + rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + rollup@4.43.0: resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.60.4: + resolution: {integrity: sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rou3@0.8.1: resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} @@ -6091,6 +7687,9 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -6112,6 +7711,9 @@ packages: scuid@1.1.0: resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -6126,9 +7728,21 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + serialize-javascript@7.0.5: + resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} + engines: {node: '>=20.0.0'} + seroval-plugins@1.3.2: resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} engines: {node: '>=10'} @@ -6149,12 +7763,26 @@ packages: resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} + serve-placeholder@2.0.2: + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6194,6 +7822,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} @@ -6202,6 +7834,10 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smob@1.6.2: + resolution: {integrity: sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==} + engines: {node: '>=20.0.0'} + snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -6232,6 +7868,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -6260,9 +7899,19 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + storybook-solidjs-vite@10.1.1: resolution: {integrity: sha512-4acj1yxVPM3PieEGFPJukPeIXmpboJprewiX0KMrdYvtAZy8zbkZ7QBf8iENyKNJOayeXWzMm+z7hWBQDUirYg==} peerDependencies: @@ -6297,6 +7946,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + streamx@2.26.0: + resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} + string-env-interpolation@1.0.1: resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} @@ -6308,6 +7960,13 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -6326,6 +7985,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -6334,6 +7997,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -6352,6 +8018,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6374,6 +8044,14 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwindcss-dir@4.0.0: resolution: {integrity: sha512-G5orTODS8sDQOZqKa2Q4Ey/F4nlxK1mTZm02iKHLxZaNjpboPews/h2KUksC5KbgIVrpmOe1hqcNYZJy07ftwA==} @@ -6387,10 +8065,28 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} + engines: {node: '>=18'} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terser@5.48.0: + resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -6404,9 +8100,16 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyclip@0.1.13: + resolution: {integrity: sha512-8OqlXQ35euK9+e7L68u8UwcODxkHoIkjbGsgXuARKNyQ5G6xt8nw1YPeMbxMLgCPFkToU+UEK5j05t2t8edKpQ==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -6456,6 +8159,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -6508,6 +8215,14 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} + engines: {node: '>=20'} + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -6519,10 +8234,25 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + unctx@2.5.0: + resolution: {integrity: sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==} + + undici-types@5.28.4: + resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -6534,13 +8264,35 @@ packages: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unimport@6.3.0: + resolution: {integrity: sha512-M+Dxk5W9WRd+8j56W9tp8lGW/dmMc7g5zj7BWQnEjKQhryBstqsi1V0izb0zHwSkEN8cSYV7K75/bykairV2tA==} + engines: {node: '>=18.12.0'} + peerDependencies: + oxc-parser: '*' + rolldown: ^1.0.0 + peerDependenciesMeta: + oxc-parser: + optional: true + rolldown: + optional: true + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -6567,10 +8319,95 @@ packages: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unplugin@2.3.5: resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} engines: {node: '>=18.12.0'} + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true + + untyped@2.0.0: + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} + hasBin: true + + unwasm@0.5.3: + resolution: {integrity: sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -6583,6 +8420,9 @@ packages: upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + uqr@0.1.3: + resolution: {integrity: sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6613,6 +8453,10 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vinxi@0.5.3: + resolution: {integrity: sha512-4sL2SMrRzdzClapP44oXdGjCE1oq7/DagsbjY5A09EibmoIO4LP8ScRVdh03lfXxKRk7nCWK7n7dqKvm+fp/9w==} + hasBin: true + vite-node@2.1.9: resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6824,11 +8668,20 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6845,6 +8698,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -6864,10 +8721,18 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + xmlbuilder2@4.0.3: resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} engines: {node: '>=20.0'} @@ -6889,6 +8754,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml-ast-parser@0.0.43: resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} @@ -6905,6 +8774,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -6913,10 +8786,24 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.1: + resolution: {integrity: sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod@3.25.63: resolution: {integrity: sha512-3ttCkqhtpncYXfP0f6dsyabbYV/nEUW+Xlu89jiXbTBifUfjaSqXOG6JnQPLtqt87n7KAmnMqcjay6c0Wq0Vbw==} @@ -6972,6 +8859,12 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -7152,6 +9045,8 @@ snapshots: '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -7240,6 +9135,11 @@ snapshots: '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -7375,6 +9275,16 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -7415,6 +9325,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': dependencies: '@babel/core': 7.27.4 @@ -7426,6 +9347,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.29.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.27.6': {} '@babel/template@7.27.2': @@ -7616,6 +9548,8 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 + '@cloudflare/kv-asset-handler@0.4.2': {} + '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -7636,6 +9570,13 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} + '@deno/shim-deno-test@0.5.0': {} + + '@deno/shim-deno@0.19.2': + dependencies: + '@deno/shim-deno-test': 0.5.0 + which: 4.0.0 + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -7663,153 +9604,300 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.20.2': + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/aix-ppc64@0.28.0': optional: true - '@esbuild/android-arm64@0.25.5': + '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.25.5': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.25.5': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.25.5': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.25.5': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.25.5': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.25.5': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.25.5': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.25.5': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.25.5': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.25.5': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.25.5': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.25.5': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.25.5': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.25.5': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.25.5': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.25.5': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.25.5': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.25.5': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.25.5': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.25.5': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.25.5': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.25.5': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@1.21.7))': + '@esbuild/win32-x64@0.28.0': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.7.0))': dependencies: - eslint: 9.28.0(jiti@1.21.7) + eslint: 9.28.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -7879,7 +9967,7 @@ snapshots: graphql: 16.9.0 tslib: 2.6.3 - '@graphql-codegen/cli@5.0.2(@types/node@22.15.31)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3)': + '@graphql-codegen/cli@5.0.2(@parcel/watcher@2.5.6)(@types/node@22.15.31)(enquirer@2.4.1)(graphql@16.9.0)(typescript@5.8.3)': dependencies: '@babel/generator': 7.27.5 '@babel/template': 7.27.2 @@ -7917,6 +10005,8 @@ snapshots: tslib: 2.8.1 yaml: 2.5.0 yargs: 17.7.2 + optionalDependencies: + '@parcel/watcher': 2.5.6 transitivePeerDependencies: - '@types/node' - bufferutil @@ -8410,6 +10500,8 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@ioredis/commands@1.10.0': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -8419,11 +10511,15 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) optionalDependencies: typescript: 5.8.3 @@ -8447,8 +10543,15 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -8477,6 +10580,19 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.8.1 + tar: 7.5.15 + transitivePeerDependencies: + - encoding + - supports-color + '@mdx-js/react@3.1.1(@types/react@19.2.15)(react@19.2.6)': dependencies: '@types/mdx': 2.0.13 @@ -8539,16 +10655,31 @@ snapshots: '@nothing-but/utils@0.17.0': {} + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + '@oozcitak/dom@2.0.2': dependencies: '@oozcitak/infra': 2.0.2 '@oozcitak/url': 3.0.0 '@oozcitak/util': 10.0.0 + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + '@oozcitak/infra@2.0.2': dependencies: '@oozcitak/util': 10.0.0 + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + '@oozcitak/url@3.0.0': dependencies: '@oozcitak/infra': 2.0.2 @@ -8556,6 +10687,8 @@ snapshots: '@oozcitak/util@10.0.0': {} + '@oozcitak/util@8.3.8': {} + '@oxc-parser/binding-android-arm-eabi@0.127.0': optional: true @@ -8689,6 +10822,76 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.19.1': optional: true + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-wasm@2.3.0': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 + + '@parcel/watcher-wasm@2.5.6': + dependencies: + is-glob: 4.0.3 + picomatch: 4.0.4 + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + '@peculiar/asn1-schema@2.3.13': dependencies: asn1js: 3.0.5 @@ -8710,6 +10913,18 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.7.0': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + '@reduxjs/toolkit@1.9.7(react@19.2.6)': dependencies: immer: 9.0.21 @@ -8770,72 +10985,216 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.1': optional: true + '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/pluginutils@1.0.0-beta.40': {} '@rolldown/pluginutils@1.0.1': {} + '@rollup/plugin-alias@6.0.0(rollup@4.60.4)': + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-commonjs@29.0.3(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.60.4) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.4) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-inject@5.0.5(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.60.4) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-json@6.1.0(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.60.4) + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.60.4) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-replace@6.0.3(rollup@4.60.4)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.60.4) + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/plugin-terser@1.0.0(rollup@4.60.4)': + dependencies: + serialize-javascript: 7.0.5 + smob: 1.6.2 + terser: 5.48.0 + optionalDependencies: + rollup: 4.60.4 + + '@rollup/pluginutils@5.4.0(rollup@4.60.4)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.4 + '@rollup/rollup-android-arm-eabi@4.43.0': optional: true + '@rollup/rollup-android-arm-eabi@4.60.4': + optional: true + '@rollup/rollup-android-arm64@4.43.0': optional: true + '@rollup/rollup-android-arm64@4.60.4': + optional: true + '@rollup/rollup-darwin-arm64@4.43.0': optional: true + '@rollup/rollup-darwin-arm64@4.60.4': + optional: true + '@rollup/rollup-darwin-x64@4.43.0': optional: true + '@rollup/rollup-darwin-x64@4.60.4': + optional: true + '@rollup/rollup-freebsd-arm64@4.43.0': optional: true + '@rollup/rollup-freebsd-arm64@4.60.4': + optional: true + '@rollup/rollup-freebsd-x64@4.43.0': optional: true + '@rollup/rollup-freebsd-x64@4.60.4': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.60.4': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.43.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.60.4': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.43.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.60.4': + optional: true + '@rollup/rollup-linux-arm64-musl@4.43.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.4': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.60.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.4': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.43.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.60.4': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.43.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.60.4': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.43.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.60.4': + optional: true + '@rollup/rollup-linux-x64-gnu@4.43.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.60.4': + optional: true + '@rollup/rollup-linux-x64-musl@4.43.0': optional: true + '@rollup/rollup-linux-x64-musl@4.60.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.4': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.43.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.60.4': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.43.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.60.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.4': + optional: true + '@rollup/rollup-win32-x64-msvc@4.43.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.60.4': + optional: true + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/is@7.2.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + '@solid-devtools/debugger@0.28.1(solid-js@2.0.0-beta.14)': dependencies: '@nothing-but/utils': 0.17.0 @@ -8991,10 +11350,12 @@ snapshots: seroval-plugins: 1.5.4(seroval@1.5.4) solid-js: 2.0.0-beta.14 - '@storybook/addon-docs@10.4.1(@types/react@19.2.15)(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@speed-highlight/core@1.2.15': {} + + '@storybook/addon-docs@10.4.1(@types/react@19.2.15)(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.15)(react@19.2.6) - '@storybook/csf-plugin': 10.4.1(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@storybook/csf-plugin': 10.4.1(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@storybook/react-dom-shim': 10.4.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) react: 19.2.6 @@ -9010,25 +11371,25 @@ snapshots: - vite - webpack - '@storybook/builder-vite@10.4.1(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@storybook/builder-vite@10.4.1(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: - '@storybook/csf-plugin': 10.4.1(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@storybook/csf-plugin': 10.4.1(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.4.1(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@storybook/csf-plugin@10.4.1(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) unplugin: 2.3.5 optionalDependencies: esbuild: 0.25.5 - rollup: 4.43.0 - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + rollup: 4.60.4 + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) '@storybook/global@5.0.0': {} @@ -9103,8 +11464,181 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.3.3 + '@tanstack/directive-functions-plugin@1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-utils': 1.131.2 + babel-dead-code-elimination: 1.0.12 + tiny-invariant: 1.3.3 + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + transitivePeerDependencies: + - supports-color + + '@tanstack/directive-functions-plugin@1.142.1(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-utils': 1.141.0 + babel-dead-code-elimination: 1.0.12 + pathe: 2.0.3 + tiny-invariant: 1.3.3 + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + transitivePeerDependencies: + - supports-color + + '@tanstack/history@1.131.2': {} + '@tanstack/history@1.161.6': {} + '@tanstack/history@1.162.0': {} + + '@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-store': 0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.8 + isbot: 5.1.40 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@tanstack/react-start-client@1.168.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@tanstack/react-start-plugin@1.131.50(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@vitejs/plugin-react@4.7.0(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(oxc-parser@0.127.0)(rolldown@1.0.1)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@tanstack/start-plugin-core': 1.131.50(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(oxc-parser@0.127.0)(rolldown@1.0.1)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@vitejs/plugin-react': 4.7.0(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + pathe: 2.0.3 + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + zod: 3.25.63 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@tanstack/react-router' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-start-router-manifest@1.120.19(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)': + dependencies: + '@tanstack/router-core': 1.168.9 + tiny-invariant: 1.3.3 + vinxi: 0.5.3(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sass + - sass-embedded + - sqlite3 + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - xml2js + - yaml + + '@tanstack/react-start-server@1.167.13(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-server-core': 1.169.8 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + transitivePeerDependencies: + - crossws + + '@tanstack/react-store@0.9.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + use-sync-external-store: 1.6.0(react@19.2.6) + + '@tanstack/router-core@1.131.50': + dependencies: + '@tanstack/history': 1.131.2 + '@tanstack/store': 0.7.7 + cookie-es: 1.2.3 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + '@tanstack/router-core@1.168.9': dependencies: '@tanstack/history': 1.161.6 @@ -9112,6 +11646,26 @@ snapshots: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) + '@tanstack/router-core@1.171.8': + dependencies: + '@tanstack/history': 1.162.0 + cookie-es: 3.1.1 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + + '@tanstack/router-generator@1.131.50': + dependencies: + '@tanstack/router-core': 1.131.50 + '@tanstack/router-utils': 1.131.2 + '@tanstack/virtual-file-routes': 1.131.2 + prettier: 3.5.3 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.20.2 + zod: 3.25.63 + transitivePeerDependencies: + - supports-color + '@tanstack/router-generator@1.166.24': dependencies: '@tanstack/router-core': 1.168.9 @@ -9125,7 +11679,52 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/router-plugin@1.131.50(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.131.50 + '@tanstack/router-generator': 1.131.50 + '@tanstack/router-utils': 1.131.2 + '@tanstack/virtual-file-routes': 1.131.2 + babel-dead-code-elimination: 1.0.12 + chokidar: 3.6.0 + unplugin: 2.3.5 + zod: 3.25.63 + optionalDependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.167.12(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.9 + '@tanstack/router-generator': 1.166.24 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.5 + zod: 3.25.63 + optionalDependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.167.12(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -9141,8 +11740,33 @@ snapshots: unplugin: 2.3.5 zod: 3.25.63 optionalDependencies: - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.131.2': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.3 + '@babel/preset-typescript': 7.27.1(@babel/core@7.29.0) + ansis: 4.1.0 + diff: 8.0.2 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.141.0': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.3 + '@babel/preset-typescript': 7.27.1(@babel/core@7.29.0) + ansis: 4.1.0 + diff: 8.0.2 + pathe: 2.0.3 + tinyglobby: 0.2.16 transitivePeerDependencies: - supports-color @@ -9160,6 +11784,38 @@ snapshots: transitivePeerDependencies: - supports-color + '@tanstack/server-functions-plugin@1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/directive-functions-plugin': 1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + babel-dead-code-elimination: 1.0.12 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/server-functions-plugin@1.142.1(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/directive-functions-plugin': 1.142.1(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + babel-dead-code-elimination: 1.0.12 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + '@tanstack/solid-router@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)': dependencies: '@solid-devtools/logger': 0.9.11(solid-js@2.0.0-beta.14) @@ -9191,18 +11847,18 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/solid-start@2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/solid-start@2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start-client': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start-server': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/start-client-core': 1.167.9 - '@tanstack/start-plugin-core': 1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-plugin-core': 1.167.17(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) '@tanstack/start-server-core': 1.167.9 pathe: 2.0.3 solid-js: 2.0.0-beta.14 - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) transitivePeerDependencies: - '@rsbuild/core' - '@tanstack/react-router' @@ -9211,6 +11867,67 @@ snapshots: - vite-plugin-solid - webpack + '@tanstack/start-api-routes@1.120.19(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)': + dependencies: + '@tanstack/router-core': 1.168.9 + '@tanstack/start-server-core': 1.167.9 + vinxi: 0.5.3(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - crossws + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sass + - sass-embedded + - sqlite3 + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - xml2js + - yaml + + '@tanstack/start-client-core@1.131.50': + dependencies: + '@tanstack/router-core': 1.131.50 + '@tanstack/start-storage-context': 1.131.50 + cookie-es: 1.2.3 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + '@tanstack/start-client-core@1.167.9': dependencies: '@tanstack/router-core': 1.168.9 @@ -9218,9 +11935,146 @@ snapshots: '@tanstack/start-storage-context': 1.166.23 seroval: 1.5.4 + '@tanstack/start-client-core@1.170.6': + dependencies: + '@tanstack/router-core': 1.171.8 + '@tanstack/start-fn-stubs': 1.162.0 + '@tanstack/start-storage-context': 1.167.10 + seroval: 1.5.4 + + '@tanstack/start-config@1.120.20(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))(yaml@2.5.0)': + dependencies: + '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-plugin': 1.131.50(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@vitejs/plugin-react@4.7.0(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(oxc-parser@0.127.0)(rolldown@1.0.1)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/router-generator': 1.166.24 + '@tanstack/router-plugin': 1.167.12(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/server-functions-plugin': 1.142.1(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-server-functions-handler': 1.120.19 + '@vitejs/plugin-react': 4.7.0(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + import-meta-resolve: 4.2.0 + nitropack: 2.13.4(oxc-parser@0.127.0)(rolldown@1.0.1) + ofetch: 1.5.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + vinxi: 0.5.3(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + zod: 3.25.63 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - crossws + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sass + - sass-embedded + - sqlite3 + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + - yaml + '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/start-fn-stubs@1.162.0': {} + + '@tanstack/start-plugin-core@1.131.50(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(oxc-parser@0.127.0)(rolldown@1.0.1)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.131.50 + '@tanstack/router-generator': 1.131.50 + '@tanstack/router-plugin': 1.131.50(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/router-utils': 1.131.2 + '@tanstack/server-functions-plugin': 1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-server-core': 1.131.50 + '@types/babel__code-frame': 7.27.0 + '@types/babel__core': 7.20.5 + babel-dead-code-elimination: 1.0.12 + cheerio: 1.2.0 + h3: 1.13.0 + nitropack: 2.13.4(oxc-parser@0.127.0)(rolldown@1.0.1) + pathe: 2.0.3 + ufo: 1.6.1 + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + xmlbuilder2: 3.1.1 + zod: 3.25.63 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@tanstack/react-router' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/start-plugin-core@1.167.17(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -9228,7 +12082,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.9 '@tanstack/router-generator': 1.166.24 - '@tanstack/router-plugin': 1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/router-plugin': 1.167.12(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.9 '@tanstack/start-server-core': 1.167.9 @@ -9240,8 +12094,8 @@ snapshots: srvx: 0.11.15 tinyglobby: 0.2.16 ufo: 1.6.1 - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) xmlbuilder2: 4.0.3 zod: 3.25.63 transitivePeerDependencies: @@ -9252,20 +12106,165 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.167.9': - dependencies: - '@tanstack/history': 1.161.6 - '@tanstack/router-core': 1.168.9 - '@tanstack/start-client-core': 1.167.9 - '@tanstack/start-storage-context': 1.166.23 - h3-v2: h3@2.0.1-rc.16 - seroval: 1.5.4 - transitivePeerDependencies: - - crossws + '@tanstack/start-server-core@1.131.50': + dependencies: + '@tanstack/history': 1.131.2 + '@tanstack/router-core': 1.131.50 + '@tanstack/start-client-core': 1.131.50 + '@tanstack/start-storage-context': 1.131.50 + h3: 1.13.0 + isbot: 5.1.40 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + unctx: 2.5.0 + + '@tanstack/start-server-core@1.167.9': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/router-core': 1.168.9 + '@tanstack/start-client-core': 1.167.9 + '@tanstack/start-storage-context': 1.166.23 + h3-v2: h3@2.0.1-rc.16 + seroval: 1.5.4 + transitivePeerDependencies: + - crossws + + '@tanstack/start-server-core@1.169.8': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/router-core': 1.171.8 + '@tanstack/start-client-core': 1.170.6 + '@tanstack/start-storage-context': 1.167.10 + fetchdts: 0.1.7 + h3-v2: h3@2.0.1-rc.20 + seroval: 1.5.4 + transitivePeerDependencies: + - crossws + + '@tanstack/start-server-functions-client@1.131.50(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@tanstack/server-functions-plugin': 1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-server-functions-fetcher': 1.131.50 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-server-functions-fetcher@1.131.50': + dependencies: + '@tanstack/router-core': 1.131.50 + '@tanstack/start-client-core': 1.131.50 + + '@tanstack/start-server-functions-handler@1.120.19': + dependencies: + '@tanstack/router-core': 1.168.9 + '@tanstack/start-client-core': 1.167.9 + '@tanstack/start-server-core': 1.167.9 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - crossws + + '@tanstack/start-server-functions-server@1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@tanstack/server-functions-plugin': 1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-server-functions-ssr@1.120.19(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@tanstack/server-functions-plugin': 1.142.1(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-client-core': 1.167.9 + '@tanstack/start-server-core': 1.167.9 + '@tanstack/start-server-functions-fetcher': 1.131.50 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - crossws + - supports-color + - vite + + '@tanstack/start-storage-context@1.131.50': + dependencies: + '@tanstack/router-core': 1.131.50 + + '@tanstack/start-storage-context@1.166.23': + dependencies: + '@tanstack/router-core': 1.168.9 + + '@tanstack/start-storage-context@1.167.10': + dependencies: + '@tanstack/router-core': 1.171.8 + + '@tanstack/start@1.120.20(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))(yaml@2.5.0)': + dependencies: + '@tanstack/react-start-client': 1.168.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/react-start-router-manifest': 1.120.19(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + '@tanstack/react-start-server': 1.167.13(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@tanstack/start-api-routes': 1.120.19(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + '@tanstack/start-config': 1.120.20(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))(yaml@2.5.0) + '@tanstack/start-server-functions-client': 1.131.50(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-server-functions-handler': 1.120.19 + '@tanstack/start-server-functions-server': 1.131.2(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-server-functions-ssr': 1.120.19(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - crossws + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - oxc-parser + - react + - react-dom + - react-native-b4a + - rolldown + - sass + - sass-embedded + - sqlite3 + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - vite + - vite-plugin-solid + - webpack + - xml2js + - yaml + + '@tanstack/store@0.7.7': {} + + '@tanstack/store@0.9.3': {} - '@tanstack/start-storage-context@1.166.23': - dependencies: - '@tanstack/router-core': 1.168.9 + '@tanstack/virtual-file-routes@1.131.2': {} '@tanstack/virtual-file-routes@1.161.7': {} @@ -9308,6 +12307,8 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/babel__code-frame@7.27.0': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.3 @@ -9329,6 +12330,8 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@types/braces@3.0.5': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -9378,6 +12381,10 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/micromatch@4.0.10': + dependencies: + '@types/braces': 3.0.5 + '@types/ms@0.7.34': {} '@types/node@12.20.55': {} @@ -9392,6 +12399,8 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/resolve@1.20.2': {} + '@types/sizzle@2.3.8': {} '@types/tough-cookie@4.0.5': {} @@ -9404,15 +12413,15 @@ snapshots: dependencies: '@types/node': 22.15.31 - '@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3))(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/type-utils': 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.0 - eslint: 9.28.0(jiti@1.21.7) + eslint: 9.28.0(jiti@2.7.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9421,14 +12430,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.34.0 '@typescript-eslint/types': 8.34.0 '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.0 debug: 4.4.1 - eslint: 9.28.0(jiti@1.21.7) + eslint: 9.28.0(jiti@2.7.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -9451,12 +12460,12 @@ snapshots: dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.28.0(jiti@1.21.7) + eslint: 9.28.0(jiti@2.7.0) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -9480,13 +12489,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3)': + '@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.34.0 '@typescript-eslint/types': 8.34.0 '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - eslint: 9.28.0(jiti@1.21.7) + eslint: 9.28.0(jiti@2.7.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -9498,6 +12507,57 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@vercel/nft@1.10.2(rollup@4.60.4)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.4.0(rollup@4.60.4) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.4 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vinxi/listhen@1.5.6': + dependencies: + '@parcel/watcher': 2.5.6 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.4.2 + defu: 6.1.7 + get-port-please: 3.2.0 + h3: 1.13.0 + http-shutdown: 1.2.2 + jiti: 1.21.7 + mlly: 1.8.2 + node-forge: 1.4.0 + pathe: 1.1.2 + std-env: 3.9.0 + ufo: 1.6.1 + untun: 0.1.3 + uqr: 0.1.3 + + '@vitejs/plugin-react@4.7.0(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + transitivePeerDependencies: + - supports-color + '@vitest/expect@2.1.9': dependencies: '@vitest/spy': 2.1.9 @@ -9513,13 +12573,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.9(vite@5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8))': + '@vitest/mocker@2.1.9(vite@5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8) + vite: 5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0) '@vitest/pretty-format@2.1.9': dependencies: @@ -9592,6 +12652,16 @@ snapshots: fast-querystring: 1.1.2 tslib: 2.8.1 + abbrev@3.0.1: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -9608,6 +12678,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.16.0: {} + agent-base@7.1.3: {} aggregate-error@3.1.0: @@ -9622,6 +12694,10 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -9653,6 +12729,30 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.2.0 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + arg@5.0.2: {} argparse@1.0.10: @@ -9685,6 +12785,10 @@ snapshots: astral-regex@2.0.0: {} + async-sema@3.1.1: {} + + async@3.2.6: {} + asynckit@0.4.0: {} auto-bind@4.0.0: {} @@ -9709,6 +12813,8 @@ snapshots: postcss: 7.0.39 postcss-value-parser: 4.2.0 + b4a@1.8.1: {} + babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.29.0 @@ -9826,6 +12932,38 @@ snapshots: balanced-match@4.0.4: {} + bare-events@2.8.3: {} + + bare-fs@4.7.1: + dependencies: + bare-events: 2.8.3 + bare-path: 3.0.0 + bare-stream: 2.13.1(bare-events@2.8.3) + bare-url: 2.4.3 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-os@3.9.1: {} + + bare-path@3.0.0: + dependencies: + bare-os: 3.9.1 + + bare-stream@2.13.1(bare-events@2.8.3): + dependencies: + streamx: 2.26.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.8.3 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.3: + dependencies: + bare-path: 3.0.0 + base64-js@1.5.1: {} baseline-browser-mapping@2.10.32: {} @@ -9836,6 +12974,10 @@ snapshots: binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -9844,6 +12986,17 @@ snapshots: boolbase@1.0.0: {} + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -9872,11 +13025,20 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-crc32@1.0.0: {} + + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -9887,6 +13049,23 @@ snapshots: bytes@3.1.2: {} + c12@3.3.4(magicast@0.5.3): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.0.8 + giget: 3.2.0 + jiti: 2.7.0 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + optionalDependencies: + magicast: 0.5.3 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -9905,6 +13084,8 @@ snapshots: camelcase@5.3.1: {} + camelcase@7.0.1: {} + caniuse-lite@1.0.30001722: {} capital-case@1.0.4: @@ -9934,6 +13115,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case-all@1.0.15: dependencies: change-case: 4.1.2 @@ -10009,10 +13192,24 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chownr@3.0.0: {} + ci-info@3.9.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + + citty@0.2.2: {} + clean-stack@2.2.0: {} + cli-boxes@3.0.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -10028,6 +13225,12 @@ snapshots: client-only@0.0.1: {} + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.1 + is64bit: 2.0.0 + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -10040,10 +13243,18 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.2 + clone@1.0.4: {} clsx@2.1.1: {} + cluster-key-slot@1.1.1: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -10074,14 +13285,34 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} + commander@4.1.1: {} commander@5.1.0: {} common-tags@1.8.2: {} + commondir@1.0.1: {} + + compatx@0.2.0: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + concat-map@0.0.1: {} + confbox@0.1.8: {} + + confbox@0.2.4: {} + + consola@3.4.2: {} + constant-case@3.0.4: dependencies: no-case: 3.0.4 @@ -10090,8 +13321,16 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@1.2.3: {} + cookie-es@2.0.0: {} + cookie-es@2.0.1: {} + + cookie-es@3.1.1: {} + + core-util-is@1.0.3: {} + cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.1 @@ -10101,6 +13340,15 @@ snapshots: optionalDependencies: typescript: 5.8.3 + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + croner@10.0.1: {} + cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 @@ -10117,6 +13365,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -10155,12 +13407,27 @@ snapshots: dependencies: '@babel/runtime': 7.27.6 + dax-sh@0.39.2: + dependencies: + '@deno/shim-deno': 0.19.2 + undici-types: 5.28.4 + + db0@0.3.4: {} + debounce@1.2.1: {} + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.4.1: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decimal.js@10.5.0: {} @@ -10173,6 +13440,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} default-browser@5.5.0: @@ -10188,18 +13457,27 @@ snapshots: defined@1.0.1: {} + defu@6.1.7: {} + delayed-stream@1.0.0: {} + denque@2.1.0: {} + + depd@2.0.0: {} + dependency-graph@0.11.0: {} dequal@2.0.3: {} + destr@2.0.5: {} + + destroy@1.2.0: {} + detect-indent@6.1.0: {} detect-libc@2.0.4: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} detective@5.2.1: dependencies: @@ -10248,8 +13526,14 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dot-prop@10.1.0: + dependencies: + type-fest: 5.6.0 + dotenv@16.5.0: {} + dotenv@17.4.2: {} + dset@3.1.3: {} dunder-proto@1.0.1: @@ -10258,10 +13542,16 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + electron-to-chromium@1.5.166: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -10270,6 +13560,8 @@ snapshots: emoticon@4.1.0: {} + encodeurl@2.0.0: {} + encoding-sniffer@0.2.1: dependencies: iconv-lite: 0.6.3 @@ -10290,6 +13582,8 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -10317,6 +13611,32 @@ snapshots: transitivePeerDependencies: - supports-color + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -10371,18 +13691,49 @@ snapshots: '@esbuild/win32-ia32': 0.25.5 '@esbuild/win32-x64': 0.25.5 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-plugin-eslint-comments@3.2.0(eslint@9.28.0(jiti@1.21.7)): + eslint-plugin-eslint-comments@3.2.0(eslint@9.28.0(jiti@2.7.0)): dependencies: escape-string-regexp: 1.0.5 - eslint: 9.28.0(jiti@1.21.7) + eslint: 9.28.0(jiti@2.7.0) ignore: 5.3.2 eslint-plugin-no-only-tests@3.3.0: {} @@ -10396,9 +13747,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.28.0(jiti@1.21.7): + eslint@9.28.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.1 '@eslint/config-helpers': 0.2.3 @@ -10434,7 +13785,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.7 + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -10456,12 +13807,40 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 esutils@2.0.3: {} + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.8.3 + transitivePeerDependencies: + - bare-abort-controller + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + expect-type@1.2.1: {} exsolve@1.0.8: {} @@ -10482,6 +13861,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10537,6 +13918,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + fetchdts@0.1.7: {} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -10545,6 +13928,8 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-uri-to-path@1.0.0: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -10566,6 +13951,8 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.16.0: {} + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -10585,6 +13972,10 @@ snapshots: fraction.js@4.3.7: {} + fresh@0.5.2: {} + + fresh@2.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -10614,6 +14005,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10627,15 +14020,21 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-port-please@3.2.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@8.0.1: {} + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 + giget@3.2.0: {} + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -10683,6 +14082,15 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@16.2.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -10729,11 +14137,45 @@ snapshots: graphql@16.9.0: {} + gzip-size@7.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.13.0: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + ohash: 1.1.6 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + unenv: 1.10.0 + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + h3@2.0.1-rc.16: dependencies: rou3: 0.8.1 srvx: 0.11.15 + h3@2.0.1-rc.20: + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -10798,6 +14240,8 @@ snapshots: highlight.js@11.11.1: {} + hookable@5.5.3: {} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -10815,6 +14259,14 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 @@ -10822,6 +14274,16 @@ snapshots: transitivePeerDependencies: - supports-color + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.16.0 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-shutdown@1.2.2: {} + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -10829,8 +14291,12 @@ snapshots: transitivePeerDependencies: - supports-color + httpxy@0.5.3: {} + human-id@4.1.1: {} + human-signals@5.0.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -10858,6 +14324,8 @@ snapshots: import-from@4.0.0: {} + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -10891,6 +14359,20 @@ snapshots: dependencies: loose-envify: 1.4.0 + ioredis@5.11.0: + dependencies: + '@ioredis/commands': 1.10.0 + cluster-key-slot: 1.1.1 + debug: 4.4.3 + denque: 2.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + iron-webcrypto@1.2.1: {} + is-absolute@1.0.0: dependencies: is-relative: 1.0.0 @@ -10918,6 +14400,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -10928,16 +14412,28 @@ snapshots: dependencies: tslib: 2.8.1 + is-module@1.0.0: {} + is-number@7.0.0: {} + is-path-inside@4.0.0: {} + is-plain-obj@4.1.0: {} is-potential-custom-element-name@1.0.1: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + is-relative@1.0.0: dependencies: is-unc-path: 1.0.0 + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -10960,10 +14456,18 @@ snapshots: dependencies: is-inside-container: 1.0.0 + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + isbot@5.1.40: {} isexe@2.0.0: {} + isexe@3.1.5: {} + isomorphic-ws@5.0.0(ws@8.18.2): dependencies: ws: 8.18.2 @@ -10976,10 +14480,14 @@ snapshots: jiti@1.21.7: {} + jiti@2.7.0: {} + jose@5.6.3: {} js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -11050,6 +14558,16 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@4.1.5: {} + + klona@2.0.6: {} + + knitwork@1.3.0: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leaflet@1.9.4: {} levn@0.4.1: @@ -11112,6 +14630,27 @@ snapshots: lines-and-columns@1.2.4: {} + listhen@1.10.0: + dependencies: + '@parcel/watcher': 2.5.6 + '@parcel/watcher-wasm': 2.5.6 + citty: 0.2.2 + consola: 3.4.2 + crossws: 0.3.5 + defu: 6.1.7 + get-port-please: 3.2.0 + h3: 1.15.11 + http-shutdown: 1.2.2 + jiti: 2.7.0 + mlly: 1.8.2 + node-forge: 1.4.0 + pathe: 2.0.3 + std-env: 4.1.0 + tinyclip: 0.1.13 + ufo: 1.6.4 + untun: 0.1.3 + uqr: 0.1.3 + listr2@4.0.5(enquirer@2.4.1): dependencies: cli-truncate: 2.1.0 @@ -11125,6 +14664,12 @@ snapshots: optionalDependencies: enquirer: 2.4.1 + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -11195,6 +14740,16 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + map-cache@0.2.2: {} markdown-table@3.0.4: {} @@ -11319,6 +14874,8 @@ snapshots: dependencies: is-what: 4.1.16 + merge-stream@2.0.0: {} + merge2@1.4.1: {} meros@1.3.0(@types/node@22.15.31): @@ -11523,12 +15080,26 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mime@3.0.0: {} + + mime@4.1.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + min-indent@1.0.1: {} minimatch@10.2.5: @@ -11543,6 +15114,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -11553,8 +15128,21 @@ snapshots: minipass@7.1.3: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + mri@1.2.0: {} + ms@2.0.0: {} + ms@2.1.3: {} mute-stream@0.0.8: {} @@ -11594,11 +15182,117 @@ snapshots: - '@babel/core' - babel-plugin-macros + nitropack@2.13.4(oxc-parser@0.127.0)(rolldown@1.0.1): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.2 + '@rollup/plugin-alias': 6.0.0(rollup@4.60.4) + '@rollup/plugin-commonjs': 29.0.3(rollup@4.60.4) + '@rollup/plugin-inject': 5.0.5(rollup@4.60.4) + '@rollup/plugin-json': 6.1.0(rollup@4.60.4) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.60.4) + '@rollup/plugin-replace': 6.0.3(rollup@4.60.4) + '@rollup/plugin-terser': 1.0.0(rollup@4.60.4) + '@vercel/nft': 1.10.2(rollup@4.60.4) + archiver: 7.0.1 + c12: 3.3.4(magicast@0.5.3) + chokidar: 5.0.0 + citty: 0.2.2 + compatx: 0.2.0 + confbox: 0.2.4 + consola: 3.4.2 + cookie-es: 2.0.1 + croner: 10.0.1 + crossws: 0.3.5 + db0: 0.3.4 + defu: 6.1.7 + destr: 2.0.5 + dot-prop: 10.1.0 + esbuild: 0.28.0 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + exsolve: 1.0.8 + globby: 16.2.0 + gzip-size: 7.0.0 + h3: 1.15.11 + hookable: 5.5.3 + httpxy: 0.5.3 + ioredis: 5.11.0 + jiti: 2.7.0 + klona: 2.0.6 + knitwork: 1.3.0 + listhen: 1.10.0 + magic-string: 0.30.21 + magicast: 0.5.3 + mime: 4.1.0 + mlly: 1.8.2 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.4 + ofetch: 1.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + pretty-bytes: 7.1.0 + radix3: 1.1.2 + rollup: 4.60.4 + rollup-plugin-visualizer: 7.0.1(rolldown@1.0.1)(rollup@4.60.4) + scule: 1.3.0 + semver: 7.8.1 + serve-placeholder: 2.0.2 + serve-static: 2.2.1 + source-map: 0.7.6 + std-env: 4.1.0 + ufo: 1.6.4 + ultrahtml: 1.6.0 + uncrypto: 0.1.3 + unctx: 2.5.0 + unenv: 2.0.0-rc.24 + unimport: 6.3.0(oxc-parser@0.127.0)(rolldown@1.0.1) + unplugin-utils: 0.3.1 + unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.0) + untyped: 2.0.0 + unwasm: 0.5.3 + youch: 4.1.1 + youch-core: 0.3.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.8.1 + node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} node-emoji@1.11.0: @@ -11612,6 +15306,8 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-fetch-native@1.6.7: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -11622,10 +15318,20 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-forge@1.4.0: {} + + node-gyp-build@4.8.4: {} + node-int64@0.4.0: {} + node-mock-http@1.0.4: {} + node-releases@2.0.19: {} + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 @@ -11636,6 +15342,10 @@ snapshots: normalize.css@8.0.1: {} + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -11652,6 +15362,20 @@ snapshots: object-hash@3.0.0: {} + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@1.1.6: {} + + ohash@2.0.11: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -11660,6 +15384,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + open@10.2.0: dependencies: default-browser: 5.5.0 @@ -11667,6 +15395,15 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -11812,6 +15549,8 @@ snapshots: dependencies: entities: 6.0.1 + parseurl@1.3.3: {} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 @@ -11828,6 +15567,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-root-regex@0.1.2: {} @@ -11846,6 +15587,8 @@ snapshots: lru-cache: 11.5.0 minipass: 7.1.2 + path-to-regexp@6.3.0: {} + path-type@4.0.0: {} pathe@1.1.2: {} @@ -11854,6 +15597,8 @@ snapshots: pathval@2.0.0: {} + perfect-debounce@2.1.0: {} + picocolors@0.2.1: {} picocolors@1.1.1: {} @@ -11870,6 +15615,18 @@ snapshots: pirates@4.0.6: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + postcss-functions@3.0.0: dependencies: glob: 7.2.3 @@ -11960,6 +15717,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.1.0: {} + prelude-ls@1.2.1: {} prettier-plugin-tailwindcss@0.6.12(prettier@3.5.3): @@ -11970,6 +15729,8 @@ snapshots: prettier@3.5.3: {} + pretty-bytes@7.1.0: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -11978,6 +15739,10 @@ snapshots: pretty-hrtime@1.0.3: {} + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + promise@7.3.1: dependencies: asap: 2.0.6 @@ -12003,8 +15768,19 @@ snapshots: quansync@0.2.10: {} + quansync@0.2.11: {} + queue-microtask@1.2.3: {} + radix3@1.1.2: {} + + range-parser@1.2.1: {} + + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + react-docgen-typescript@2.4.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -12016,6 +15792,8 @@ snapshots: react-is@17.0.2: {} + react-refresh@0.17.0: {} + react@19.2.6: {} read-cache@1.0.0: @@ -12029,16 +15807,40 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + readdirp@5.0.0: {} + recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -12052,6 +15854,12 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + reduce-css-calc@2.1.8: dependencies: css-unit-converter: 1.1.2 @@ -12161,6 +15969,8 @@ snapshots: require-main-filename@2.0.0: {} + requires-port@1.0.0: {} + reselect@4.1.8: {} resolve-from@4.0.0: {} @@ -12205,6 +16015,16 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.1 '@rolldown/binding-win32-x64-msvc': 1.0.1 + rollup-plugin-visualizer@7.0.1(rolldown@1.0.1)(rollup@4.60.4): + dependencies: + open: 11.0.0 + picomatch: 4.0.4 + source-map: 0.7.6 + yargs: 18.0.0 + optionalDependencies: + rolldown: 1.0.1 + rollup: 4.60.4 + rollup@4.43.0: dependencies: '@types/estree': 1.0.7 @@ -12231,6 +16051,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 + rollup@4.60.4: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.4 + '@rollup/rollup-android-arm64': 4.60.4 + '@rollup/rollup-darwin-arm64': 4.60.4 + '@rollup/rollup-darwin-x64': 4.60.4 + '@rollup/rollup-freebsd-arm64': 4.60.4 + '@rollup/rollup-freebsd-x64': 4.60.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.4 + '@rollup/rollup-linux-arm-musleabihf': 4.60.4 + '@rollup/rollup-linux-arm64-gnu': 4.60.4 + '@rollup/rollup-linux-arm64-musl': 4.60.4 + '@rollup/rollup-linux-loong64-gnu': 4.60.4 + '@rollup/rollup-linux-loong64-musl': 4.60.4 + '@rollup/rollup-linux-ppc64-gnu': 4.60.4 + '@rollup/rollup-linux-ppc64-musl': 4.60.4 + '@rollup/rollup-linux-riscv64-gnu': 4.60.4 + '@rollup/rollup-linux-riscv64-musl': 4.60.4 + '@rollup/rollup-linux-s390x-gnu': 4.60.4 + '@rollup/rollup-linux-x64-gnu': 4.60.4 + '@rollup/rollup-linux-x64-musl': 4.60.4 + '@rollup/rollup-openbsd-x64': 4.60.4 + '@rollup/rollup-openharmony-arm64': 4.60.4 + '@rollup/rollup-win32-arm64-msvc': 4.60.4 + '@rollup/rollup-win32-ia32-msvc': 4.60.4 + '@rollup/rollup-win32-x64-gnu': 4.60.4 + '@rollup/rollup-win32-x64-msvc': 4.60.4 + fsevents: 2.3.3 + rou3@0.8.1: {} rrweb-cssom@0.7.1: {} @@ -12249,6 +16100,8 @@ snapshots: dependencies: tslib: 2.8.1 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} @@ -12267,18 +16120,56 @@ snapshots: scuid@1.1.0: {} + scule@1.3.0: {} + semver@6.3.1: {} semver@7.7.2: {} semver@7.8.1: {} + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + sentence-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.8.1 upper-case-first: 2.0.2 + serialize-javascript@7.0.5: {} + seroval-plugins@1.3.2(seroval@1.3.2): dependencies: seroval: 1.3.2 @@ -12291,10 +16182,34 @@ snapshots: seroval@1.5.4: {} + serve-placeholder@2.0.2: + dependencies: + defu: 6.1.7 + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} + sharp@0.34.5: dependencies: '@img/colour': 1.1.0 @@ -12353,6 +16268,8 @@ snapshots: slash@3.0.0: {} + slash@5.1.0: {} + slice-ansi@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -12365,6 +16282,8 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + smob@1.6.2: {} + snake-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -12417,6 +16336,11 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.6.1: {} source-map@0.7.6: {} @@ -12438,18 +16362,24 @@ snapshots: stackback@0.0.2: {} + standard-as-callback@2.1.0: {} + + statuses@2.0.2: {} + std-env@3.9.0: {} - storybook-solidjs-vite@10.1.1(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(esbuild@0.25.5)(rollup@4.43.0)(solid-js@2.0.0-beta.14)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + std-env@4.1.0: {} + + storybook-solidjs-vite@10.1.1(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(esbuild@0.25.5)(rollup@4.60.4)(solid-js@2.0.0-beta.14)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)): dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) - '@storybook/builder-vite': 10.4.1(esbuild@0.25.5)(rollup@4.43.0)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) + '@storybook/builder-vite': 10.4.1(esbuild@0.25.5)(rollup@4.60.4)(storybook@10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) '@storybook/global': 5.0.0 semver: 7.8.1 solid-js: 2.0.0-beta.14 storybook: 10.4.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@testing-library/dom@10.4.1)(@types/react@19.2.15)(prettier@3.5.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) optionalDependencies: '@solidjs/web': 2.0.0-beta.14(solid-js@2.0.0-beta.14) typescript: 5.8.3 @@ -12489,6 +16419,15 @@ snapshots: streamsearch@1.1.0: {} + streamx@2.26.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-env-interpolation@1.0.1: {} string-width@4.2.3: @@ -12503,6 +16442,16 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -12522,12 +16471,18 @@ snapshots: strip-bom@3.0.0: {} + strip-final-newline@3.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + styled-jsx@5.1.6(@babel/core@7.27.4)(react@19.2.6): dependencies: client-only: 0.0.1 @@ -12545,6 +16500,8 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + supports-color@10.2.2: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -12565,6 +16522,10 @@ snapshots: symbol-tree@3.2.4: {} + system-architecture@0.1.0: {} + + tagged-tag@1.0.0: {} + tailwindcss-dir@4.0.0: dependencies: tailwindcss: 1.9.6 @@ -12621,8 +16582,47 @@ snapshots: transitivePeerDependencies: - ts-node + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.1 + fast-fifo: 1.3.2 + streamx: 2.26.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar@7.5.15: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + + teex@1.0.1: + dependencies: + streamx: 2.26.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + term-size@2.2.1: {} + terser@5.48.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -12635,8 +16635,12 @@ snapshots: tiny-invariant@1.3.3: {} + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + tinyclip@0.1.13: {} + tinyexec@0.3.2: {} tinyglobby@0.2.14: @@ -12677,6 +16681,8 @@ snapshots: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -12718,14 +16724,35 @@ snapshots: type-fest@0.21.3: {} + type-fest@2.19.0: {} + + type-fest@5.6.0: + dependencies: + tagged-tag: 1.0.0 + typescript@5.8.3: {} ua-parser-js@1.0.38: {} ufo@1.6.1: {} + ufo@1.6.4: {} + + ultrahtml@1.6.0: {} + unc-path-regex@0.1.2: {} + uncrypto@0.1.3: {} + + unctx@2.5.0: + dependencies: + acorn: 8.15.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + unplugin: 2.3.11 + + undici-types@5.28.4: {} + undici-types@6.21.0: {} undici@5.28.4: @@ -12734,8 +16761,22 @@ snapshots: undici@7.25.0: {} + unenv@1.10.0: + dependencies: + consola: 3.4.2 + defu: 6.1.7 + mime: 3.0.0 + node-fetch-native: 1.6.7 + pathe: 1.1.2 + + unenv@2.0.0-rc.24: + dependencies: + pathe: 2.0.3 + unicode-emoji-modifier-base@1.0.0: {} + unicorn-magic@0.4.0: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -12746,6 +16787,26 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unimport@6.3.0(oxc-parser@0.127.0)(rolldown@1.0.1): + dependencies: + acorn: 8.16.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + pathe: 2.0.3 + picomatch: 4.0.4 + pkg-types: 2.3.1 + scule: 1.3.0 + strip-literal: 3.1.0 + tinyglobby: 0.2.16 + unplugin: 3.0.0 + unplugin-utils: 0.3.1 + optionalDependencies: + oxc-parser: 0.127.0 + rolldown: 1.0.1 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -12780,12 +16841,67 @@ snapshots: dependencies: normalize-path: 2.1.1 + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.4 + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + unplugin@2.3.5: dependencies: acorn: 8.15.0 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 + unplugin@3.0.0: + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + unstorage@1.17.5(db0@0.3.4)(ioredis@5.11.0): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.0 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + optionalDependencies: + db0: 0.3.4 + ioredis: 5.11.0 + + untun@0.1.3: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 1.1.2 + + untyped@2.0.0: + dependencies: + citty: 0.1.6 + defu: 6.1.7 + jiti: 2.7.0 + knitwork: 1.3.0 + scule: 1.3.0 + + unwasm@0.5.3: + dependencies: + exsolve: 1.0.8 + knitwork: 1.3.0 + magic-string: 0.30.21 + mlly: 1.8.2 + pathe: 2.0.3 + pkg-types: 2.3.1 + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: browserslist: 4.25.0 @@ -12800,6 +16916,8 @@ snapshots: dependencies: tslib: 2.8.1 + uqr@0.1.3: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -12828,13 +16946,96 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.9(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8): + vinxi@0.5.3(@types/node@22.15.31)(db0@0.3.4)(ioredis@5.11.0)(jiti@2.7.0)(lightningcss@1.32.0)(oxc-parser@0.127.0)(rolldown@1.0.1)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@types/micromatch': 4.0.10 + '@vinxi/listhen': 1.5.6 + boxen: 7.1.1 + chokidar: 3.6.0 + citty: 0.1.6 + consola: 3.4.2 + crossws: 0.3.5 + dax-sh: 0.39.2 + defu: 6.1.7 + es-module-lexer: 1.7.0 + esbuild: 0.20.2 + fast-glob: 3.3.3 + get-port-please: 3.2.0 + h3: 1.13.0 + hookable: 5.5.3 + http-proxy: 1.18.1 + micromatch: 4.0.8 + nitropack: 2.13.4(oxc-parser@0.127.0)(rolldown@1.0.1) + node-fetch-native: 1.6.7 + path-to-regexp: 6.3.0 + pathe: 1.1.2 + radix3: 1.1.2 + resolve: 1.22.10 + serve-placeholder: 2.0.2 + serve-static: 1.16.3 + ufo: 1.6.1 + unctx: 2.5.0 + unenv: 1.10.0 + unstorage: 1.17.5(db0@0.3.4)(ioredis@5.11.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + zod: 3.25.63 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - sass + - sass-embedded + - sqlite3 + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - xml2js + - yaml + + vite-node@2.1.9(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8) + vite: 5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0) transitivePeerDependencies: - '@types/node' - less @@ -12846,7 +17047,7 @@ snapshots: - supports-color - terser - vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) @@ -12855,14 +17056,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 2.0.0-beta.14 solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.14) - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@solidjs/web': 2.0.0-beta.14(solid-js@2.0.0-beta.14) @@ -12871,14 +17072,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 2.0.0-beta.14 solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.14) - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) + vitefu: 1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite@5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8): + vite@5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0): dependencies: esbuild: 0.21.5 postcss: 8.5.5 @@ -12888,8 +17089,9 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.32.0 sass: 1.77.8 + terser: 5.48.0 - vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0): + vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -12900,13 +17102,14 @@ snapshots: optionalDependencies: '@types/node': 22.15.31 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.7.0 lightningcss: 1.32.0 sass: 1.77.8 + terser: 5.48.0 tsx: 4.20.2 yaml: 2.5.0 - vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0): + vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -12915,25 +17118,26 @@ snapshots: tinyglobby: 0.2.16 optionalDependencies: '@types/node': 22.15.31 - esbuild: 0.25.5 + esbuild: 0.28.0 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.7.0 sass: 1.77.8 + terser: 5.48.0 tsx: 4.20.2 yaml: 2.5.0 - vitefu@1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) - vitefu@1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0)): optionalDependencies: - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.13(@types/node@22.15.31)(esbuild@0.28.0)(jiti@2.7.0)(sass@1.77.8)(terser@5.48.0)(tsx@4.20.2)(yaml@2.5.0) - vitest@2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8): + vitest@2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)) + '@vitest/mocker': 2.1.9(vite@5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -12949,8 +17153,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.0 tinyrainbow: 1.2.0 - vite: 5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8) - vite-node: 2.1.9(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8) + vite: 5.4.4(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0) + vite-node: 2.1.9(@types/node@22.15.31)(lightningcss@1.32.0)(sass@1.77.8)(terser@5.48.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.31 @@ -13012,11 +17216,19 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.5 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + word-wrap@1.2.5: {} wrap-ansi@6.2.0: @@ -13037,6 +17249,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} ws@8.18.2: {} @@ -13045,8 +17263,20 @@ snapshots: dependencies: is-wsl: 3.1.1 + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + xml-name-validator@5.0.0: {} + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + xmlbuilder2@4.0.3: dependencies: '@oozcitak/dom': 2.0.2 @@ -13064,6 +17294,8 @@ snapshots: yallist@3.1.1: {} + yallist@5.0.0: {} + yaml-ast-parser@0.0.43: {} yaml@2.5.0: {} @@ -13075,6 +17307,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -13099,8 +17333,36 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yocto-queue@0.1.0: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.3 + error-stack-parser-es: 1.0.5 + + youch@4.1.1: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.7.0 + '@speed-highlight/core': 1.2.15 + cookie-es: 3.1.1 + youch-core: 0.3.3 + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod@3.25.63: {} zwitch@2.0.4: {} From 1347b17e9db1d8b36bca4046b7e148bf8ae928f7 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Mon, 1 Jun 2026 20:42:10 -0400 Subject: [PATCH 5/5] CR improvement suggestions --- packages/analytics/README.md | 2 +- packages/analytics/package.json | 3 +- packages/analytics/src/analytics.ts | 2 +- packages/analytics/src/context.ts | 6 +- packages/analytics/src/guard.ts | 2 +- packages/analytics/src/relay.ts | 8 +- packages/analytics/src/relay/solidstart.ts | 5 +- packages/analytics/src/relay/tanstack.ts | 4 +- packages/analytics/src/types.ts | 2 +- packages/analytics/test/index.test.ts | 118 ++++++++++----------- packages/utils/src/index.ts | 5 +- 11 files changed, 79 insertions(+), 78 deletions(-) diff --git a/packages/analytics/README.md b/packages/analytics/README.md index 73695782e..7c31054bd 100644 --- a/packages/analytics/README.md +++ b/packages/analytics/README.md @@ -186,7 +186,7 @@ When `onBeforeLeave` fires: Route analytics events through your own server function instead of calling providers directly from the browser. This keeps API keys off the client and lets you enrich events with server-side context (session data, IP-based geo, etc.) before forwarding to the provider. -``` +```text browser → createServerPlugin → your server function → GA / Mixpanel / Segment ``` diff --git a/packages/analytics/package.json b/packages/analytics/package.json index abe26cbb8..7ac0e9c1a 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -58,8 +58,7 @@ "useAnalytics", "makeAnalyticsGuard", "createAnalyticsGuard", - "createServerPlugin", - "createEventHandler" + "createServerPlugin" ], "category": "Utilities" }, diff --git a/packages/analytics/src/analytics.ts b/packages/analytics/src/analytics.ts index c08476daf..4818be65d 100644 --- a/packages/analytics/src/analytics.ts +++ b/packages/analytics/src/analytics.ts @@ -104,7 +104,7 @@ function buildCore(queue: EventBuffer, options: AnalyticsOptions) { function drainBatch(): AnyPayload[] { const events: AnyPayload[] = []; - const max = drainSize ?? Infinity; + const max = batching ? (drainSize ?? Infinity) : Infinity; let item: AnyPayload | undefined; while (events.length < max && (item = queue.remove()) !== undefined) { events.push(item); diff --git a/packages/analytics/src/context.ts b/packages/analytics/src/context.ts index 1af25d497..17c46b5af 100644 --- a/packages/analytics/src/context.ts +++ b/packages/analytics/src/context.ts @@ -42,4 +42,8 @@ export function AnalyticsProvider(props: { * } * ``` */ -export const useAnalytics = (): ReactiveAnalyticsControls => useContext(AnalyticsCtx); +export const useAnalytics = (): ReactiveAnalyticsControls => { + const controls = useContext(AnalyticsCtx); + if (controls === undefined) throw new Error("useAnalytics: must be called inside "); + return controls; +}; diff --git a/packages/analytics/src/guard.ts b/packages/analytics/src/guard.ts index 481d72cbb..b227f6596 100644 --- a/packages/analytics/src/guard.ts +++ b/packages/analytics/src/guard.ts @@ -38,7 +38,7 @@ function buildOnBeforeLeave(analytics: Drainable): (event: BeforeLeaveEvent) => * ```ts * import { useBeforeLeave } from "@solidjs/router"; * const [analytics, cleanup] = makeAnalytics([...]); - * const { onBeforeLeave, cleanup } = makeAnalyticsGuard(analytics); + * const { onBeforeLeave, cleanup: guardCleanup } = makeAnalyticsGuard(analytics); * useBeforeLeave(onBeforeLeave); * ``` */ diff --git a/packages/analytics/src/relay.ts b/packages/analytics/src/relay.ts index c683dc3ad..4b942ae86 100644 --- a/packages/analytics/src/relay.ts +++ b/packages/analytics/src/relay.ts @@ -18,15 +18,15 @@ import type { AnalyticsPlugin, AnyPayload } from "./types.js"; * ``` */ export function createServerPlugin( - fn: (payload: AnyPayload) => Promise, + fn: (payload: AnyPayload) => Promise, options: { name?: string; events?: Array } = {}, ): AnalyticsPlugin { const { name = "server", events } = options; const handles = (type: AnyPayload["type"]) => !events || events.includes(type); return { name, - page: handles("page") ? ({ payload }) => fn(payload) : undefined, - track: handles("track") ? ({ payload }) => fn(payload) : undefined, - identify: handles("identify") ? ({ payload }) => fn(payload) : undefined, + page: handles("page") ? ({ payload }) => fn(payload) as Promise : undefined, + track: handles("track") ? ({ payload }) => fn(payload) as Promise : undefined, + identify: handles("identify") ? ({ payload }) => fn(payload) as Promise : undefined, }; } diff --git a/packages/analytics/src/relay/solidstart.ts b/packages/analytics/src/relay/solidstart.ts index 6f3159b41..fcdd38258 100644 --- a/packages/analytics/src/relay/solidstart.ts +++ b/packages/analytics/src/relay/solidstart.ts @@ -10,13 +10,14 @@ import { createServerPlugin } from "../relay.js"; * * ```ts * // analytics.server.ts - * import { action } from "@solidjs/router"; + * import { action, reload } from "@solidjs/router"; * import googleAnalytics from "@analytics/google-analytics"; * * export const relayEvent = action(async (payload: AnyPayload) => { * "use server"; * const ga = googleAnalytics({ measurementId: import.meta.env.GA_ID }); * await ga.track?.({ payload, config: {}, abort: () => {} }); + * return reload({ revalidate: [] }); * }); * * // app.tsx @@ -29,7 +30,7 @@ import { createServerPlugin } from "../relay.js"; * ``` */ export function createSolidStartRelayPlugin( - action: (payload: AnyPayload) => Promise, + action: (payload: AnyPayload) => Promise, options?: { name?: string; events?: Array }, ): AnalyticsPlugin { return createServerPlugin(action, { name: "solidstart", ...options }); diff --git a/packages/analytics/src/relay/tanstack.ts b/packages/analytics/src/relay/tanstack.ts index 8b32daf77..4ca408f19 100644 --- a/packages/analytics/src/relay/tanstack.ts +++ b/packages/analytics/src/relay/tanstack.ts @@ -10,11 +10,11 @@ import { createServerPlugin } from "../relay.js"; * * ```ts * // analytics.server.ts - * import { createServerFn } from "@tanstack/start"; + * import { createServerFn } from "@tanstack/solid-start"; * import googleAnalytics from "@analytics/google-analytics"; * * export const relayEvent = createServerFn({ method: "POST" }) - * .validator((d: unknown) => d as AnyPayload) + * .inputValidator((d: unknown) => d as AnyPayload) * .handler(async ({ data: payload }) => { * const ga = googleAnalytics({ measurementId: process.env.GA_ID }); * await ga.track?.({ payload, config: {}, abort: () => {} }); diff --git a/packages/analytics/src/types.ts b/packages/analytics/src/types.ts index 67cad53d9..aabfec3ce 100644 --- a/packages/analytics/src/types.ts +++ b/packages/analytics/src/types.ts @@ -13,7 +13,7 @@ export type TrackProperties = Record; export type IdentifyTraits = Record; export type EventMeta = { - /** Unique request identifier for this event. */ + /** Unique request identifier for this event. Unique within an analytics instance and with high probability unique across independent instances (separate processes or SSR requests). */ rid: string; /** Unix timestamp (ms) when the event was created. */ ts: number; diff --git a/packages/analytics/test/index.test.ts b/packages/analytics/test/index.test.ts index 93f4a4ccd..8c804899f 100644 --- a/packages/analytics/test/index.test.ts +++ b/packages/analytics/test/index.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi, afterEach } from "vitest"; +import { describe, expect, it, vi, afterEach, beforeEach } from "vitest"; import { createRoot, flush } from "solid-js"; import { makeAnalytics, createAnalytics } from "../src/analytics.js"; import { makeAnalyticsGuard, createAnalyticsGuard } from "../src/guard.js"; @@ -9,9 +9,8 @@ function makeReadyPlugin(overrides: Partial = {}): AnalyticsPlu return { name: "ready", ...overrides }; } -function delay(ms = 0): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); -} +beforeEach(() => vi.useFakeTimers()); +afterEach(() => vi.useRealTimers()); // ─── makeAnalytics ──────────────────────────────────────────────────────────── @@ -20,7 +19,7 @@ describe("makeAnalytics", () => { const pageSpy = vi.fn(); const [analytics, cleanup] = makeAnalytics([makeReadyPlugin({ page: ({ payload }) => pageSpy(payload) })]); analytics.page({ title: "Home" }); - await delay(); + await vi.advanceTimersByTimeAsync(0); expect(pageSpy).toHaveBeenCalledOnce(); const payload = pageSpy.mock.calls[0]![0] as PagePayload; expect(payload.type).toBe("page"); @@ -33,7 +32,7 @@ describe("makeAnalytics", () => { const trackSpy = vi.fn(); const [analytics, cleanup] = makeAnalytics([makeReadyPlugin({ track: ({ payload }) => trackSpy(payload) })]); analytics.track("button_click", { name: "signup" }); - await delay(); + await vi.advanceTimersByTimeAsync(0); expect(trackSpy).toHaveBeenCalledOnce(); const payload = trackSpy.mock.calls[0]![0] as TrackPayload; expect(payload.type).toBe("track"); @@ -48,7 +47,7 @@ describe("makeAnalytics", () => { makeReadyPlugin({ identify: ({ payload }) => identifySpy(payload) }), ]); analytics.identify("user-1", { email: "alice@example.com" }); - await delay(); + await vi.advanceTimersByTimeAsync(0); expect(identifySpy).toHaveBeenCalledOnce(); const payload = identifySpy.mock.calls[0]![0] as IdentifyPayload; expect(payload.type).toBe("identify"); @@ -71,11 +70,11 @@ describe("makeAnalytics", () => { ]); analytics.page({ title: "Queued" }); - await delay(); // init not done yet + await vi.advanceTimersByTimeAsync(0); // init not done yet expect(pageSpy).not.toHaveBeenCalled(); resolveInit(); - await delay(20); // allow init + drain + await vi.advanceTimersByTimeAsync(20); // allow init + drain expect(pageSpy).toHaveBeenCalledOnce(); cleanup(); }); @@ -86,7 +85,7 @@ describe("makeAnalytics", () => { const pluginB: AnalyticsPlugin = { name: "b", track: async () => { order.push("b"); } }; const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); analytics.track("ev"); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(order).toEqual(["a", "b"]); cleanup(); }); @@ -98,7 +97,7 @@ describe("makeAnalytics", () => { const pluginB: AnalyticsPlugin = { name: "b", track: () => spyB() }; const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); analytics.track("ev"); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(spyA).toHaveBeenCalledOnce(); expect(spyB).not.toHaveBeenCalled(); cleanup(); @@ -113,7 +112,7 @@ describe("makeAnalytics", () => { const pluginB: AnalyticsPlugin = { name: "ok", track: () => spyB() }; const [analytics, cleanup] = makeAnalytics([pluginA, pluginB]); analytics.track("ev"); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(spyB).toHaveBeenCalledOnce(); cleanup(); }); @@ -126,7 +125,7 @@ describe("makeAnalytics", () => { const [analytics, cleanup] = makeAnalytics([pluginA]); analytics.use(pluginB); analytics.track("ev"); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(spyA).toHaveBeenCalledOnce(); expect(spyB).toHaveBeenCalledOnce(); cleanup(); @@ -143,7 +142,7 @@ describe("makeAnalytics", () => { analytics.page({ title: "Lost" }); cleanup(); // discard before init resolves resolveInit(); - await delay(100); + await vi.advanceTimersByTimeAsync(100); expect(spy).not.toHaveBeenCalled(); }); @@ -157,10 +156,10 @@ describe("makeAnalytics", () => { }; const [analytics, cleanup] = makeAnalytics([plugin], { retryInterval: 20 }); analytics.page({ title: "Deferred" }); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(spy).not.toHaveBeenCalled(); isLoaded = true; - await delay(50); // poll fires, drains queue + await vi.advanceTimersByTimeAsync(50); // poll fires, drains queue expect(spy).toHaveBeenCalledOnce(); cleanup(); }); @@ -171,7 +170,7 @@ describe("makeAnalytics", () => { const [analytics, cleanup] = makeAnalytics([plugin]); analytics.track("a"); analytics.track("b"); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(rids).toHaveLength(2); expect(rids[0]).not.toBe(rids[1]); cleanup(); @@ -196,25 +195,23 @@ describe("createAnalytics", () => { }); }); - it("pendingCount() reflects queued event count", () => - new Promise(resolve => { - createRoot(d => { - dispose = d; - let resolveInit!: () => void; - const initDone = new Promise(res => (resolveInit = res)); - const analytics = createAnalytics([{ name: "async", initialize: () => initDone, page: () => {} }]); - analytics.page({ title: "A" }); - analytics.page({ title: "B" }); - flush(); - expect(analytics.pendingCount()).toBe(2); - resolveInit(); - delay(20).then(() => { - flush(); - expect(analytics.pendingCount()).toBe(0); - resolve(); - }); - }); - })); + it("pendingCount() reflects queued event count", async () => { + let resolveInit!: () => void; + const initDone = new Promise(res => (resolveInit = res)); + let analyticsRef!: ReturnType; + createRoot(d => { + dispose = d; + analyticsRef = createAnalytics([{ name: "async", initialize: () => initDone, page: () => {} }]); + analyticsRef.page({ title: "A" }); + analyticsRef.page({ title: "B" }); + flush(); + expect(analyticsRef.pendingCount()).toBe(2); + resolveInit(); + }); + await vi.advanceTimersByTimeAsync(20); + flush(); + expect(analyticsRef.pendingCount()).toBe(0); + }); it("reset() clears the queue and resets pendingCount", () => { createRoot(d => { @@ -273,7 +270,7 @@ describe("drain()", () => { const [analytics, cleanup] = makeAnalytics([plugin]); analytics.track("ev"); const drained = analytics.drain().then(() => order.push("drained")); - await delay(5); + await vi.advanceTimersByTimeAsync(5); expect(order).toEqual([]); // neither done yet resolveTrack(); await drained; @@ -308,10 +305,10 @@ describe("drainInterval / drainSize", () => { analytics.track("b"); analytics.track("c"); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(spy).not.toHaveBeenCalled(); // not dispatched yet - await delay(30); // drain interval fires + await vi.advanceTimersByTimeAsync(30); // drain interval fires expect(spy).toHaveBeenCalledTimes(3); expect(spy.mock.calls.map(c => c[0])).toEqual(["a", "b", "c"]); cleanup(); @@ -326,35 +323,34 @@ describe("drainInterval / drainSize", () => { analytics.track("b"); analytics.track("c"); - await delay(40); // first drain fires + await vi.advanceTimersByTimeAsync(40); // first drain fires expect(spy).toHaveBeenCalledTimes(2); expect(spy.mock.calls.map(c => c[0])).toEqual(["a", "b"]); - await delay(30); // second drain fires + await vi.advanceTimersByTimeAsync(30); // second drain fires expect(spy).toHaveBeenCalledTimes(3); expect(spy.mock.calls[2]![0]).toBe("c"); cleanup(); }); it("pendingCount reflects queued events in batch mode", async () => { - await new Promise(resolve => { - createRoot(d => { - const spy = vi.fn(); - const plugin: AnalyticsPlugin = { name: "p", track: () => spy() }; - const analytics = createAnalytics([plugin], { drainInterval: 50 }); - analytics.track("a"); - analytics.track("b"); - flush(); - expect(analytics.pendingCount()).toBe(2); - delay(60).then(() => { - flush(); - expect(analytics.pendingCount()).toBe(0); - expect(spy).toHaveBeenCalledTimes(2); - d(); - resolve(); - }); - }); + const spy = vi.fn(); + let analyticsRef!: ReturnType; + let disposeRef!: () => void; + createRoot(d => { + disposeRef = d; + const plugin: AnalyticsPlugin = { name: "p", track: () => spy() }; + analyticsRef = createAnalytics([plugin], { drainInterval: 50 }); + analyticsRef.track("a"); + analyticsRef.track("b"); + flush(); + expect(analyticsRef.pendingCount()).toBe(2); }); + await vi.advanceTimersByTimeAsync(60); + flush(); + expect(analyticsRef.pendingCount()).toBe(0); + expect(spy).toHaveBeenCalledTimes(2); + disposeRef(); }); it("without drainInterval events dispatch immediately (default behavior unchanged)", async () => { @@ -362,7 +358,7 @@ describe("drainInterval / drainSize", () => { const plugin: AnalyticsPlugin = { name: "p", track: ({ payload }) => spy(payload.event) }; const [analytics, cleanup] = makeAnalytics([plugin]); analytics.track("immediate"); - await delay(5); + await vi.advanceTimersByTimeAsync(5); expect(spy).toHaveBeenCalledWith("immediate"); cleanup(); }); @@ -393,7 +389,7 @@ describe("makeAnalyticsGuard", () => { expect(retried).not.toHaveBeenCalled(); resolveTrack(); - await delay(10); + await vi.advanceTimersByTimeAsync(10); expect(retried).toHaveBeenCalledWith(true); cleanup(); @@ -419,7 +415,7 @@ describe("makeAnalyticsGuard", () => { expect(event.preventDefault).toHaveBeenCalledOnce(); resolveTrack(); - await delay(10); + await vi.advanceTimersByTimeAsync(10); cleanup(); cleanupAnalytics(); }); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index cf4fc82f8..1cc6e9f0b 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -102,10 +102,11 @@ export function reverseChain( export const clamp = (n: number, min: number, max: number) => Math.min(Math.max(n, min), max); -/** Creates an ID generator with its own isolated counter. Each call to the returned function produces a unique `timestamp-sequence` string. */ +/** Creates an ID generator with its own isolated counter and per-generator random segment. Each call to the returned function produces a `timestamp-sequence-random` string that is unique within the generator and with high probability unique across independent generators (e.g. separate processes or SSR requests). */ export const createIdGenerator = (): (() => string) => { let seq = 0; - return () => `${Date.now().toString(36)}-${(++seq).toString(36)}`; + const rand = Math.random().toString(36).slice(2, 8); + return () => `${Date.now().toString(36)}-${(++seq).toString(36)}-${rand}`; }; /**