diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs new file mode 100644 index 000000000..f154da33d --- /dev/null +++ b/.pnpmfile.cjs @@ -0,0 +1,25 @@ +function readPackage(pkg, context) { + // Force all @tanstack/db dependencies to resolve to workspace version + if (pkg.dependencies && pkg.dependencies["@tanstack/db"]) { + pkg.dependencies["@tanstack/db"] = "workspace:*" + context.log(`Overriding @tanstack/db dependency in ${pkg.name}`) + } + + if (pkg.devDependencies && pkg.devDependencies["@tanstack/db"]) { + pkg.devDependencies["@tanstack/db"] = "workspace:*" + context.log(`Overriding @tanstack/db devDependency in ${pkg.name}`) + } + + if (pkg.peerDependencies && pkg.peerDependencies["@tanstack/db"]) { + pkg.peerDependencies["@tanstack/db"] = "workspace:*" + context.log(`Overriding @tanstack/db peerDependency in ${pkg.name}`) + } + + return pkg +} + +module.exports = { + hooks: { + readPackage, + }, +} diff --git a/examples/react/offline-transactions/.env.example b/examples/react/offline-transactions/.env.example new file mode 100644 index 000000000..e7f34f35d --- /dev/null +++ b/examples/react/offline-transactions/.env.example @@ -0,0 +1,3 @@ +# Honeycomb API Key +# Get your API key from https://ui.honeycomb.io/account +HONEYCOMB_API_KEY=your_api_key_here diff --git a/examples/react/offline-transactions/.gitignore b/examples/react/offline-transactions/.gitignore new file mode 100644 index 000000000..6ab0517d9 --- /dev/null +++ b/examples/react/offline-transactions/.gitignore @@ -0,0 +1,20 @@ +node_modules +package-lock.json +yarn.lock + +.DS_Store +.cache +.env +.vercel +.output +.nitro +/build/ +/api/ +/server/build +/public/build# Sentry Config File +.env.sentry-build-plugin +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +.tanstack \ No newline at end of file diff --git a/examples/react/offline-transactions/.prettierignore b/examples/react/offline-transactions/.prettierignore new file mode 100644 index 000000000..2be5eaa6e --- /dev/null +++ b/examples/react/offline-transactions/.prettierignore @@ -0,0 +1,4 @@ +**/build +**/public +pnpm-lock.yaml +routeTree.gen.ts \ No newline at end of file diff --git a/examples/react/offline-transactions/README.md b/examples/react/offline-transactions/README.md new file mode 100644 index 000000000..90cba4aac --- /dev/null +++ b/examples/react/offline-transactions/README.md @@ -0,0 +1,72 @@ +# Welcome to TanStack.com! + +This site is built with TanStack Router! + +- [TanStack Router Docs](https://tanstack.com/router) + +It's deployed automagically with Netlify! + +- [Netlify](https://netlify.com/) + +## Development + +From your terminal: + +```sh +pnpm install +pnpm dev +``` + +This starts your app in development mode, rebuilding assets on file changes. + +## Editing and previewing the docs of TanStack projects locally + +The documentations for all TanStack projects except for `React Charts` are hosted on [https://tanstack.com](https://tanstack.com), powered by this TanStack Router app. +In production, the markdown doc pages are fetched from the GitHub repos of the projects, but in development they are read from the local file system. + +Follow these steps if you want to edit the doc pages of a project (in these steps we'll assume it's [`TanStack/form`](https://github.com/tanstack/form)) and preview them locally : + +1. Create a new directory called `tanstack`. + +```sh +mkdir tanstack +``` + +2. Enter the directory and clone this repo and the repo of the project there. + +```sh +cd tanstack +git clone git@github.com:TanStack/tanstack.com.git +git clone git@github.com:TanStack/form.git +``` + +> [!NOTE] +> Your `tanstack` directory should look like this: +> +> ``` +> tanstack/ +> | +> +-- form/ +> | +> +-- tanstack.com/ +> ``` + +> [!WARNING] +> Make sure the name of the directory in your local file system matches the name of the project's repo. For example, `tanstack/form` must be cloned into `form` (this is the default) instead of `some-other-name`, because that way, the doc pages won't be found. + +3. Enter the `tanstack/tanstack.com` directory, install the dependencies and run the app in dev mode: + +```sh +cd tanstack.com +pnpm i +# The app will run on https://localhost:3000 by default +pnpm dev +``` + +4. Now you can visit http://localhost:3000/form/latest/docs/overview in the browser and see the changes you make in `tanstack/form/docs`. + +> [!NOTE] +> The updated pages need to be manually reloaded in the browser. + +> [!WARNING] +> You will need to update the `docs/config.json` file (in the project's repo) if you add a new doc page! diff --git a/examples/react/offline-transactions/README.otel.md b/examples/react/offline-transactions/README.otel.md new file mode 100644 index 000000000..d081be87f --- /dev/null +++ b/examples/react/offline-transactions/README.otel.md @@ -0,0 +1,102 @@ +# OpenTelemetry Setup + +This example includes OpenTelemetry instrumentation for observability of offline transactions. + +## Quick Start + +### 1. Set up Honeycomb API Key + +```bash +cp .env.example .env +# Edit .env and add your Honeycomb API key +``` + +Get your API key from https://ui.honeycomb.io/account + +### 2. Start the OpenTelemetry Collector + +```bash +docker-compose up -d +``` + +This starts the OpenTelemetry Collector with CORS support on port 4318. + +### 3. Enable Tracing in the App + +Uncomment the tracing configuration in `src/routes/indexeddb.tsx` or `src/routes/localstorage.tsx`: + +```typescript +const offlineExecutor = createIndexedDBOfflineExecutor({ + endpoint: "http://localhost:4318/v1/traces", +}) +``` + +### 4. View Traces in Honeycomb + +1. Go to https://ui.honeycomb.io +2. Navigate to your environment +3. You should see traces from `@tanstack/offline-transactions-example` + +## What Gets Traced + +The offline transactions package instruments: + +- **Transaction execution**: Full lifecycle from persistence to completion +- **Outbox operations**: add, get, update, remove transactions +- **Retry logic**: Failed transactions with retry attempts and delays +- **Error handling**: Failed spans with error details and stack traces +- **Scheduler operations**: Transaction queuing and batching + +## Configuration Options + +### Using Jaeger (Local Development) + +If you prefer Jaeger for local development: + +1. Uncomment the `jaeger` service in `docker-compose.yml` +2. Update `otel-collector-config.yaml` to use the Jaeger exporter +3. Access Jaeger UI at http://localhost:16686 + +### Custom Honeycomb Configuration + +You can pass headers for Honeycomb configuration: + +```typescript +const offlineExecutor = createIndexedDBOfflineExecutor({ + endpoint: "http://localhost:4318/v1/traces", + headers: { + // Optional: specify dataset + "x-honeycomb-dataset": "my-dataset", + }, +}) +``` + +## Troubleshooting + +### CORS Errors + +If you see CORS errors, verify: + +- The collector is running: `docker-compose ps` +- Port 4318 is accessible: `curl http://localhost:4318` +- The `allowed_origins` in `otel-collector-config.yaml` matches your app's origin + +### No Traces Appearing + +Check collector logs: + +```bash +docker-compose logs otel-collector +``` + +Verify your Honeycomb API key is correct: + +```bash +docker-compose exec otel-collector env | grep HONEYCOMB +``` + +### Stopping the Collector + +```bash +docker-compose down +``` diff --git a/examples/react/offline-transactions/docker-compose.yml b/examples/react/offline-transactions/docker-compose.yml new file mode 100644 index 000000000..999857852 --- /dev/null +++ b/examples/react/offline-transactions/docker-compose.yml @@ -0,0 +1,24 @@ +services: + # OpenTelemetry Collector - handles CORS and forwards traces to Honeycomb + otel-collector: + image: otel/opentelemetry-collector:latest + command: ["--config=/etc/otel-collector-config.yaml"] + environment: + # Set your Honeycomb API key here or via .env file + - HONEYCOMB_API_KEY=${HONEYCOMB_API_KEY} + volumes: + - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml + ports: + - "4318:4318" # OTLP HTTP endpoint with CORS support + restart: unless-stopped + + # Optional: Local Jaeger for development + # Uncomment this and update otel-collector-config.yaml to use Jaeger instead + # jaeger: + # image: jaegertracing/all-in-one:latest + # environment: + # - COLLECTOR_OTLP_ENABLED=true + # ports: + # - "16686:16686" # Jaeger UI + # - "4317:4317" # OTLP gRPC + # restart: unless-stopped diff --git a/examples/react/offline-transactions/otel-collector-config.yaml b/examples/react/offline-transactions/otel-collector-config.yaml new file mode 100644 index 000000000..436a2c1e7 --- /dev/null +++ b/examples/react/offline-transactions/otel-collector-config.yaml @@ -0,0 +1,35 @@ +receivers: + otlp: + protocols: + http: + endpoint: 0.0.0.0:4318 + cors: + allowed_origins: + - "http://localhost:*" + - "http://127.0.0.1:*" + allowed_headers: + - "*" + max_age: 7200 + +exporters: + # Honeycomb exporter + otlp/honeycomb: + endpoint: api.honeycomb.io:443 + headers: + x-honeycomb-team: "${HONEYCOMB_API_KEY}" + + # Jaeger exporter (optional - uncomment to use local Jaeger instead) + # otlp/jaeger: + # endpoint: jaeger:4317 + # tls: + # insecure: true + + # Debug exporter for troubleshooting + debug: + verbosity: detailed + +service: + pipelines: + traces: + receivers: [otlp] + exporters: [otlp/honeycomb, debug] diff --git a/examples/react/offline-transactions/package.json b/examples/react/offline-transactions/package.json new file mode 100644 index 000000000..291841139 --- /dev/null +++ b/examples/react/offline-transactions/package.json @@ -0,0 +1,44 @@ +{ + "name": "tanstack-start-example-basic", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build && tsc --noEmit", + "start": "node .output/server/index.mjs" + }, + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.56.0", + "@opentelemetry/instrumentation": "^0.56.0", + "@opentelemetry/instrumentation-fetch": "^0.56.0", + "@opentelemetry/resources": "^1.29.0", + "@opentelemetry/sdk-trace-web": "^1.29.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "@tanstack/offline-transactions": "workspace:*", + "@tanstack/query-db-collection": "workspace:*", + "@tanstack/react-db": "workspace:*", + "@tanstack/react-query": "^5.89.0", + "@tanstack/react-router": "^1.131.47", + "@tanstack/react-router-devtools": "^1.131.47", + "@tanstack/react-start": "^1.131.47", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^2.6.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@types/node": "^22.5.4", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^5.0.3", + "autoprefixer": "^10.4.20", + "chokidar": "^4.0.3", + "postcss": "^8.5.1", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.2", + "vite": "^7.1.7", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/examples/react/offline-transactions/postcss.config.mjs b/examples/react/offline-transactions/postcss.config.mjs new file mode 100644 index 000000000..2e7af2b7f --- /dev/null +++ b/examples/react/offline-transactions/postcss.config.mjs @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/react/offline-transactions/public/android-chrome-192x192.png b/examples/react/offline-transactions/public/android-chrome-192x192.png new file mode 100644 index 000000000..09c8324f8 Binary files /dev/null and b/examples/react/offline-transactions/public/android-chrome-192x192.png differ diff --git a/examples/react/offline-transactions/public/android-chrome-512x512.png b/examples/react/offline-transactions/public/android-chrome-512x512.png new file mode 100644 index 000000000..11d626ea3 Binary files /dev/null and b/examples/react/offline-transactions/public/android-chrome-512x512.png differ diff --git a/examples/react/offline-transactions/public/apple-touch-icon.png b/examples/react/offline-transactions/public/apple-touch-icon.png new file mode 100644 index 000000000..5a9423cc0 Binary files /dev/null and b/examples/react/offline-transactions/public/apple-touch-icon.png differ diff --git a/examples/react/offline-transactions/public/favicon-16x16.png b/examples/react/offline-transactions/public/favicon-16x16.png new file mode 100644 index 000000000..e3389b004 Binary files /dev/null and b/examples/react/offline-transactions/public/favicon-16x16.png differ diff --git a/examples/react/offline-transactions/public/favicon-32x32.png b/examples/react/offline-transactions/public/favicon-32x32.png new file mode 100644 index 000000000..900c77d44 Binary files /dev/null and b/examples/react/offline-transactions/public/favicon-32x32.png differ diff --git a/examples/react/offline-transactions/public/favicon.ico b/examples/react/offline-transactions/public/favicon.ico new file mode 100644 index 000000000..1a1751676 Binary files /dev/null and b/examples/react/offline-transactions/public/favicon.ico differ diff --git a/examples/react/offline-transactions/public/favicon.png b/examples/react/offline-transactions/public/favicon.png new file mode 100644 index 000000000..1e77bc060 Binary files /dev/null and b/examples/react/offline-transactions/public/favicon.png differ diff --git a/examples/react/offline-transactions/public/site.webmanifest b/examples/react/offline-transactions/public/site.webmanifest new file mode 100644 index 000000000..fa99de77d --- /dev/null +++ b/examples/react/offline-transactions/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/examples/react/offline-transactions/src/components/DefaultCatchBoundary.tsx b/examples/react/offline-transactions/src/components/DefaultCatchBoundary.tsx new file mode 100644 index 000000000..63e20524f --- /dev/null +++ b/examples/react/offline-transactions/src/components/DefaultCatchBoundary.tsx @@ -0,0 +1,53 @@ +import { + ErrorComponent, + Link, + rootRouteId, + useMatch, + useRouter, +} from "@tanstack/react-router" +import type { ErrorComponentProps } from "@tanstack/react-router" + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(`DefaultCatchBoundary Error:`, error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/examples/react/offline-transactions/src/components/NotFound.tsx b/examples/react/offline-transactions/src/components/NotFound.tsx new file mode 100644 index 000000000..b29bf8dc7 --- /dev/null +++ b/examples/react/offline-transactions/src/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from "@tanstack/react-router" + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/examples/react/offline-transactions/src/components/TodoDemo.tsx b/examples/react/offline-transactions/src/components/TodoDemo.tsx new file mode 100644 index 000000000..4a4bd3259 --- /dev/null +++ b/examples/react/offline-transactions/src/components/TodoDemo.tsx @@ -0,0 +1,272 @@ +import React, { useEffect, useMemo, useState } from "react" +import { useLiveQuery } from "@tanstack/react-db" +import { createTodoActions, todoCollection } from "~/db/todos" + +interface TodoDemoProps { + title: string + description: string + storageType: `indexeddb` | `localstorage` + offline: any +} + +export function TodoDemo({ + title, + description, + storageType, + offline, +}: TodoDemoProps) { + const [newTodoText, setNewTodoText] = useState(``) + const [error, setError] = useState(null) + const [isOnline, setIsOnline] = useState(navigator.onLine) + const [pendingCount, setPendingCount] = useState(0) + + // Create actions based on offline executor + const actions = useMemo(() => createTodoActions(offline), [offline]) + console.log({ offline, actions }) + + // Use live query to get todos + const { data: todoList = [], isLoading } = useLiveQuery((q) => + q + .from({ todo: todoCollection }) + .orderBy(({ todo }) => todo.createdAt, `desc`) + ) + + // Monitor online status + useEffect(() => { + const handleOnline = () => { + setIsOnline(true) + if (offline) { + offline.notifyOnline() + } + } + const handleOffline = () => setIsOnline(false) + + window.addEventListener(`online`, handleOnline) + window.addEventListener(`offline`, handleOffline) + + return () => { + window.removeEventListener(`online`, handleOnline) + window.removeEventListener(`offline`, handleOffline) + } + }, [offline]) + + // Monitor pending transactions + useEffect(() => { + if (!offline) return + + const interval = setInterval(() => { + setPendingCount(offline.getPendingCount()) + }, 100) + + return () => clearInterval(interval) + }, [offline]) + + const handleAddTodo = async () => { + if (!newTodoText.trim()) return + + try { + setError(null) + if (typeof actions.addTodo === `function`) { + await actions.addTodo(newTodoText) + } else { + actions.addTodo(newTodoText) + } + setNewTodoText(``) + } catch (err) { + setError(err instanceof Error ? err.message : `Failed to add todo`) + } + } + + const handleToggleTodo = async (id: string) => { + try { + setError(null) + if (typeof actions.toggleTodo === `function`) { + await actions.toggleTodo(id) + } else { + actions.toggleTodo(id) + } + } catch (err) { + setError(err instanceof Error ? err.message : `Failed to toggle todo`) + } + } + + const handleDeleteTodo = async (id: string) => { + try { + setError(null) + if (typeof actions.deleteTodo === `function`) { + await actions.deleteTodo(id) + } else { + actions.deleteTodo(id) + } + } catch (err) { + setError(err instanceof Error ? err.message : `Failed to delete todo`) + } + } + + const handleKeyPress = (e: React.KeyboardEvent) => { + if (e.key === `Enter`) { + handleAddTodo() + } + } + + const getStorageIcon = () => { + switch (storageType) { + case `indexeddb`: + return `🗄️` + case `localstorage`: + return `💾` + default: + return `💿` + } + } + + return ( +
+
+
+ {getStorageIcon()} +
+

{title}

+

{description}

+
+
+ + {/* Status indicators */} +
+
+
+ {isOnline ? `Online` : `Offline`} +
+ +
+
+ {offline?.isOfflineEnabled ? `Offline Mode Enabled` : `Online Only`} +
+ + {pendingCount > 0 && ( +
+
+ {pendingCount} pending sync{pendingCount !== 1 ? `s` : ``} +
+ )} +
+ + {/* Error display */} + {error && ( +
+

{error}

+
+ )} + + {/* Add new todo */} +
+ setNewTodoText(e.target.value)} + onKeyPress={handleKeyPress} + placeholder="Add a new todo..." + className="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" + disabled={isLoading} + /> + +
+ + {/* Todo list */} +
+ {isLoading && todoList.length === 0 ? ( +
+
+ Loading todos... +
+ ) : todoList.length === 0 ? ( +
+ No todos yet. Add one above to get started! +
+ + Try going offline to see how it works + +
+ ) : ( + todoList.map((todo) => { + return ( +
+ + + {todo.text} + + + {new Date(todo.createdAt).toLocaleDateString()} + + +
+ ) + }) + )} +
+ + {/* Instructions */} +
+

Try this:

+
    +
  1. 1. Add some todos while online
  2. +
  3. 3. Add more todos (they'll be stored locally)
  4. +
  5. 4. Go back online to see them sync
  6. +
  7. + 5. Open this page in another tab to test multi-tab coordination +
  8. +
+
+
+
+ ) +} diff --git a/examples/react/offline-transactions/src/db/todos.ts b/examples/react/offline-transactions/src/db/todos.ts new file mode 100644 index 000000000..57989df1b --- /dev/null +++ b/examples/react/offline-transactions/src/db/todos.ts @@ -0,0 +1,314 @@ +import { createCollection } from "@tanstack/react-db" +import { queryCollectionOptions } from "@tanstack/query-db-collection" +import { + IndexedDBAdapter, + LocalStorageAdapter, + startOfflineExecutor, +} from "@tanstack/offline-transactions" +import { z } from "zod" +import type { PendingMutation } from "@tanstack/db" +import type { Todo } from "~/utils/todos" +import { queryClient } from "~/utils/queryClient" + +/** + * A utility function to fetch data from a URL with built-in retry logic for non-200 responses. + * + * This function will automatically retry HTTP requests a specified number of times if the initial + * fetch fails or returns a non-200 OK status. It uses an exponential backoff strategy to increase + * the delay between retries, reducing the load on the server. + * + * @param url The URL to fetch. + * @param options A standard `RequestInit` object for the fetch request. Supports all HTTP methods. + * @param retryConfig An object with retry configuration. + * @param retryConfig.retries The number of times to retry the request (default: 6). + * @param retryConfig.delay The initial delay in milliseconds before the first retry (default: 1000). + * @param retryConfig.backoff The backoff multiplier for subsequent retries (default: 2). + * @returns A promise that resolves to the `Response` object if the fetch is successful. + * @throws An error if the maximum number of retries is exceeded. + */ +export async function fetchWithRetry( + url: string, + options: RequestInit = {}, + retryConfig: { retries?: number; delay?: number; backoff?: number } = {} +): Promise { + const { retries = 6, delay = 1000, backoff = 2 } = retryConfig + + // Loop for the specified number of retries + for (let i = 0; i <= retries; i++) { + try { + const response = await fetch(url, options) + + // If the response is OK, return it immediately + if (response.ok) { + return response + } + + // If it's a non-200 response, log the status and prepare to retry + console.warn( + `Fetch attempt ${i + 1} failed with status: ${response.status}. Retrying...` + ) + + // Wait before the next attempt, with exponential backoff + if (i < retries) { + const currentDelay = delay * Math.pow(backoff, i) + await new Promise((resolve) => setTimeout(resolve, currentDelay)) + } + } catch (error) { + // Catch network errors and log a message + console.error( + `Fetch attempt ${i + 1} failed due to a network error:`, + error + ) + + // Wait before the next attempt, with exponential backoff + if (i < retries) { + const currentDelay = delay * Math.pow(backoff, i) + await new Promise((resolve) => setTimeout(resolve, currentDelay)) + } else { + // If all retries have failed, re-throw the original error + throw error + } + } + } + + // If the loop completes without a successful response, throw a final error + throw new Error(`Failed to fetch ${url} after ${retries} retries.`) +} + +// Define schema +const todoSchema = z.object({ + id: z.string(), + text: z.string(), + completed: z.boolean(), + createdAt: z.date(), + updatedAt: z.date(), +}) + +// Create the todo collection +export const todoCollection = createCollection( + queryCollectionOptions({ + queryClient, + queryKey: [`todos`], + queryFn: async (): Promise> => { + const response = await fetchWithRetry(`/api/todos`) + if (!response.ok) { + throw new Error(`Failed to fetch todos`) + } + const data = await response.json() + const res = data.map((todo: any) => ({ + ...todo, + createdAt: new Date(todo.createdAt), + updatedAt: new Date(todo.updatedAt), + })) + return res + }, + getKey: (item) => item.id, + schema: todoSchema, + }) +) + +// API client functions +export const todoAPI = { + async syncTodos({ + transaction, + idempotencyKey, + }: { + transaction: { mutations: Array } + idempotencyKey: string + }) { + const mutations = transaction.mutations + + console.log(`sync todos`, mutations[0].changes, mutations[0].original.text) + for (const mutation of mutations) { + try { + switch (mutation.type) { + case `insert`: { + const todoData = mutation.modified as Todo + const response = await fetchWithRetry(`/api/todos`, { + method: `POST`, + headers: { + "Content-Type": `application/json`, + "Idempotency-Key": idempotencyKey, + }, + body: JSON.stringify({ + text: todoData.text, + completed: todoData.completed, + }), + }) + + if (!response.ok) { + throw new Error(`Failed to sync insert: ${response.statusText}`) + } + break + } + + case `update`: { + const todoData = mutation.modified as Partial + const response = await fetch( + `/api/todos/${(mutation.modified as Todo).id}`, + { + method: `PUT`, + headers: { + "Content-Type": `application/json`, + "Idempotency-Key": idempotencyKey, + }, + body: JSON.stringify({ + text: todoData.text, + completed: todoData.completed, + }), + } + ) + + if (!response.ok) { + throw new Error(`Failed to sync update: ${response.statusText}`) + } + break + } + + case `delete`: { + const response = await fetchWithRetry( + `/api/todos/${(mutation.original as Todo).id}`, + { + method: `DELETE`, + headers: { + "Idempotency-Key": idempotencyKey, + }, + } + ) + + if (!response.ok) { + throw new Error(`Failed to sync delete: ${response.statusText}`) + } + break + } + } + } catch (error) { + console.error(`Sync error for mutation:`, mutation, error) + throw error + } + } + const start = performance.now() + console.time(`refresh collection ${start}`) + await todoCollection.utils.refetch() + console.timeEnd(`refresh collection ${start}`) + }, +} + +// Helper functions to create offline actions +export function createTodoActions(offline: any) { + const addTodoAction = offline?.createOfflineAction({ + mutationFnName: `syncTodos`, + onMutate: (text: string) => { + const newTodo = { + id: crypto.randomUUID(), + text: text.trim(), + completed: false, + createdAt: new Date(), + updatedAt: new Date(), + } + todoCollection.insert(newTodo) + return newTodo + }, + }) + + const toggleTodoAction = offline?.createOfflineAction({ + mutationFnName: `syncTodos`, + onMutate: (id: string) => { + const todo = todoCollection.get(id) + if (!todo) return + todoCollection.update(id, (draft) => { + draft.completed = !draft.completed + draft.updatedAt = new Date() + }) + return todo + }, + }) + + const deleteTodoAction = offline?.createOfflineAction({ + mutationFnName: `syncTodos`, + onMutate: (id: string) => { + const todo = todoCollection.get(id) + if (todo) { + todoCollection.delete(id) + } + return todo + }, + }) + + console.log(`creating offline actions`) + + return { + addTodo: addTodoAction, + toggleTodo: toggleTodoAction, + deleteTodo: deleteTodoAction, + } +} + +// IndexedDB offline executor +export async function createIndexedDBOfflineExecutor(otel?: { + endpoint: string + headers?: Record +}) { + const executor = startOfflineExecutor({ + collections: { todos: todoCollection }, + storage: new IndexedDBAdapter(`offline-todos-indexeddb`, `transactions`), + mutationFns: { + syncTodos: todoAPI.syncTodos, + }, + onLeadershipChange: (isLeader) => { + console.log({ isLeader }) + if (!isLeader) { + console.warn(`Running in online-only mode (another tab is the leader)`) + } + }, + otel, + }) + + // Initialize OpenTelemetry AFTER creating the executor so we can pass the online detector + if (otel?.endpoint) { + const { initWebTracing } = await import(`~/otel-web`) + await initWebTracing({ + endpoint: otel.endpoint, + headers: otel.headers, + onlineDetector: executor.getOnlineDetector(), + }).catch((error) => { + console.error(`Failed to initialize OpenTelemetry:`, error) + }) + } + + return executor +} + +// localStorage offline executor +export async function createLocalStorageOfflineExecutor(otel?: { + endpoint: string + headers?: Record +}) { + const executor = startOfflineExecutor({ + collections: { todos: todoCollection }, + storage: new LocalStorageAdapter(`offline-todos-ls:`), + mutationFns: { + syncTodos: todoAPI.syncTodos, + }, + onLeadershipChange: (isLeader) => { + if (!isLeader) { + console.warn(`Running in online-only mode (another tab is the leader)`) + } + }, + otel, + }) + + // Initialize OpenTelemetry AFTER creating the executor so we can pass the online detector + if (otel?.endpoint) { + const { initWebTracing } = await import(`~/otel-web`) + await initWebTracing({ + endpoint: otel.endpoint, + headers: otel.headers, + onlineDetector: executor.getOnlineDetector(), + }).catch((error) => { + console.error(`Failed to initialize OpenTelemetry:`, error) + }) + } + + return executor +} diff --git a/examples/react/offline-transactions/src/otel-offline-processor.ts b/examples/react/offline-transactions/src/otel-offline-processor.ts new file mode 100644 index 000000000..d7a9664c6 --- /dev/null +++ b/examples/react/offline-transactions/src/otel-offline-processor.ts @@ -0,0 +1,161 @@ +import { + OTelSpanStorage, + deserializeSpan, + serializeSpan, +} from "./otel-span-storage" +import type { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base" + +/** + * Custom span processor that persists failed spans to IndexedDB + * and retries sending them when back online + */ +export class OfflineRetrySpanProcessor { + private storage: OTelSpanStorage + private exporter: SpanExporter + private isShutdown = false + private retryTimer: ReturnType | null = null + + constructor(exporter: SpanExporter) { + this.exporter = exporter + this.storage = new OTelSpanStorage() + } + + async forceFlush(): Promise { + // Attempt to retry all stored spans + await this.retryStoredSpans() + } + + onStart(): void { + // No-op for this processor + } + + async onEnd(span: ReadableSpan): Promise { + if (this.isShutdown) { + return + } + + try { + // Try to export the span immediately + const result = await new Promise((resolve) => { + this.exporter.export([span], (result) => { + resolve(result) + }) + }) + + if (!result || result.code !== 0) { + // Export failed, store for retry + console.warn( + `Failed to export span, storing for retry:`, + span.name, + result + ) + await this.storage.store(serializeSpan(span)) + } + } catch (error) { + // Network error or exporter failure, store for retry + console.warn(`Error exporting span, storing for retry:`, error) + await this.storage.store(serializeSpan(span)) + } + } + + async shutdown(): Promise { + if (this.isShutdown) { + return + } + + this.isShutdown = true + + if (this.retryTimer) { + clearTimeout(this.retryTimer) + this.retryTimer = null + } + + // Final flush attempt + await this.forceFlush() + await this.exporter.shutdown() + } + + /** + * Retry sending all stored spans + * Returns the number of spans successfully sent + */ + async retryStoredSpans(): Promise { + if (this.isShutdown) { + return 0 + } + + const storedSpans = await this.storage.getAll() + + if (storedSpans.length === 0) { + return 0 + } + + console.log(`Retrying ${storedSpans.length} stored spans`) + let successCount = 0 + + for (const stored of storedSpans) { + try { + const deserializedSpan = deserializeSpan(stored.span) + const result = await new Promise((resolve) => { + this.exporter.export([deserializedSpan], (result) => { + resolve(result) + }) + }) + + if (result && result.code === 0) { + // Success! Remove from storage + await this.storage.remove(stored.id) + successCount++ + } else { + // Still failing, increment retry count + await this.storage.incrementRetryCount(stored.id) + } + } catch (error) { + // Still can't send, increment retry count + console.warn(`Retry failed for span:`, error) + await this.storage.incrementRetryCount(stored.id) + } + } + + console.log( + `Successfully retried ${successCount}/${storedSpans.length} spans` + ) + return successCount + } + + /** + * Start periodic retry attempts + */ + startPeriodicRetry(intervalMs = 30000): void { + if (this.retryTimer) { + return + } + + const retry = async () => { + await this.retryStoredSpans() + + if (!this.isShutdown) { + this.retryTimer = setTimeout(retry, intervalMs) + } + } + + this.retryTimer = setTimeout(retry, intervalMs) + } + + /** + * Stop periodic retry attempts + */ + stopPeriodicRetry(): void { + if (this.retryTimer) { + clearTimeout(this.retryTimer) + this.retryTimer = null + } + } + + /** + * Get the number of spans waiting to be retried + */ + async getPendingCount(): Promise { + return this.storage.getCount() + } +} diff --git a/examples/react/offline-transactions/src/otel-span-storage.ts b/examples/react/offline-transactions/src/otel-span-storage.ts new file mode 100644 index 000000000..56a8ae05a --- /dev/null +++ b/examples/react/offline-transactions/src/otel-span-storage.ts @@ -0,0 +1,207 @@ +/** + * IndexedDB storage for persisting OpenTelemetry spans when offline + */ +import type { ReadableSpan } from "@opentelemetry/sdk-trace-base" + +export interface SerializedSpan { + name: string + spanContext: { + traceId: string + spanId: string + traceFlags: number + } + parentSpanId?: string + startTime: [number, number] + endTime: [number, number] + status: { code: number; message?: string } + attributes: Record + events: Array + links: Array + kind: number + resource: Record + instrumentationLibrary: { name: string; version?: string } +} + +interface StoredSpan { + id: string + span: SerializedSpan + timestamp: number + retryCount: number +} + +export class OTelSpanStorage { + private dbName = `otel-spans` + private storeName = `failed-spans` + private db: IDBDatabase | null = null + private maxRetries = 5 + + async init(): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, 1) + + request.onerror = () => reject(request.error) + request.onsuccess = () => { + this.db = request.result + resolve() + } + + request.onupgradeneeded = (event) => { + const db = (event.target as IDBOpenDBRequest).result + if (!db.objectStoreNames.contains(this.storeName)) { + const store = db.createObjectStore(this.storeName, { keyPath: `id` }) + store.createIndex(`timestamp`, `timestamp`, { unique: false }) + store.createIndex(`retryCount`, `retryCount`, { unique: false }) + } + } + }) + } + + async store(spanData: SerializedSpan): Promise { + if (!this.db) await this.init() + + const storedSpan: StoredSpan = { + id: crypto.randomUUID(), + span: spanData, + timestamp: Date.now(), + retryCount: 0, + } + + return new Promise((resolve, reject) => { + const transaction = this.db!.transaction([this.storeName], `readwrite`) + const store = transaction.objectStore(this.storeName) + const request = store.add(storedSpan) + + request.onsuccess = () => resolve() + request.onerror = () => reject(request.error) + }) + } + + async getAll(): Promise> { + if (!this.db) await this.init() + + return new Promise((resolve, reject) => { + const transaction = this.db!.transaction([this.storeName], `readonly`) + const store = transaction.objectStore(this.storeName) + const request = store.getAll() + + request.onsuccess = () => resolve(request.result) + request.onerror = () => reject(request.error) + }) + } + + async remove(id: string): Promise { + if (!this.db) await this.init() + + return new Promise((resolve, reject) => { + const transaction = this.db!.transaction([this.storeName], `readwrite`) + const store = transaction.objectStore(this.storeName) + const request = store.delete(id) + + request.onsuccess = () => resolve() + request.onerror = () => reject(request.error) + }) + } + + async incrementRetryCount(id: string): Promise { + if (!this.db) await this.init() + + return new Promise((resolve, reject) => { + const transaction = this.db!.transaction([this.storeName], `readwrite`) + const store = transaction.objectStore(this.storeName) + const getRequest = store.get(id) + + getRequest.onsuccess = () => { + const storedSpan = getRequest.result as StoredSpan + + storedSpan.retryCount++ + + // Remove if max retries exceeded + if (storedSpan.retryCount > this.maxRetries) { + console.warn(`Max retries exceeded for span ${id}, removing`) + this.remove(id).then(resolve).catch(reject) + return + } + + const putRequest = store.put(storedSpan) + putRequest.onsuccess = () => resolve() + putRequest.onerror = () => reject(putRequest.error) + } + + getRequest.onerror = () => reject(getRequest.error) + }) + } + + async clear(): Promise { + if (!this.db) await this.init() + + return new Promise((resolve, reject) => { + const transaction = this.db!.transaction([this.storeName], `readwrite`) + const store = transaction.objectStore(this.storeName) + const request = store.clear() + + request.onsuccess = () => resolve() + request.onerror = () => reject(request.error) + }) + } + + async getCount(): Promise { + if (!this.db) await this.init() + + return new Promise((resolve, reject) => { + const transaction = this.db!.transaction([this.storeName], `readonly`) + const store = transaction.objectStore(this.storeName) + const request = store.count() + + request.onsuccess = () => resolve(request.result) + request.onerror = () => reject(request.error) + }) + } +} + +/** + * Serialize a ReadableSpan to a plain object that can be stored in IndexedDB + */ +export function serializeSpan(span: ReadableSpan): SerializedSpan { + return { + name: span.name, + spanContext: { + traceId: span.spanContext().traceId, + spanId: span.spanContext().spanId, + traceFlags: span.spanContext().traceFlags, + }, + parentSpanId: span.parentSpanId, + startTime: span.startTime, + endTime: span.endTime, + status: span.status, + attributes: span.attributes, + events: span.events, + links: span.links, + kind: span.kind, + resource: span.resource.attributes, + instrumentationLibrary: span.instrumentationLibrary, + } +} + +/** + * Deserialize a stored span back into a format the exporter can use + */ +export function deserializeSpan(serialized: SerializedSpan): any { + return { + name: serialized.name, + spanContext: () => serialized.spanContext, + parentSpanId: serialized.parentSpanId, + startTime: serialized.startTime, + endTime: serialized.endTime, + status: serialized.status, + attributes: serialized.attributes, + events: serialized.events, + links: serialized.links, + kind: serialized.kind, + resource: { + attributes: serialized.resource, + }, + instrumentationLibrary: serialized.instrumentationLibrary, + duration: serialized.endTime, + ended: true, + } +} diff --git a/examples/react/offline-transactions/src/otel-web.ts b/examples/react/offline-transactions/src/otel-web.ts new file mode 100644 index 000000000..d77f050cc --- /dev/null +++ b/examples/react/offline-transactions/src/otel-web.ts @@ -0,0 +1,100 @@ +import { OfflineRetrySpanProcessor } from "./otel-offline-processor" + +export interface InitWebTracingOptions { + endpoint: string + headers?: Record + serviceName?: string + sampleRatio?: number + onlineDetector?: { + subscribe: (callback: () => void) => () => void + } +} + +let offlineProcessor: OfflineRetrySpanProcessor | null = null + +export async function initWebTracing( + options: InitWebTracingOptions +): Promise { + const { + endpoint, + headers = {}, + serviceName = `@tanstack/offline-transactions-example`, + sampleRatio = 1.0, + onlineDetector, + } = options + + // Dynamic imports to keep bundle size minimal + const { WebTracerProvider } = await import(`@opentelemetry/sdk-trace-web`) + const { OTLPTraceExporter } = await import( + `@opentelemetry/exporter-trace-otlp-http` + ) + const { BatchSpanProcessor } = await import(`@opentelemetry/sdk-trace-web`) + const { Resource } = await import(`@opentelemetry/resources`) + const { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } = await import( + `@opentelemetry/semantic-conventions` + ) + const { registerInstrumentations } = await import( + `@opentelemetry/instrumentation` + ) + const { TraceIdRatioBasedSampler } = await import( + `@opentelemetry/sdk-trace-web` + ) + + // Create resource with service identification + const resource = new Resource({ + [ATTR_SERVICE_NAME]: serviceName, + [ATTR_SERVICE_VERSION]: `0.0.1`, + }) + + // Configure OTLP exporter + const exporter = new OTLPTraceExporter({ + url: endpoint, + headers, + }) + + // Create tracer provider with sampling + const provider = new WebTracerProvider({ + resource, + sampler: new TraceIdRatioBasedSampler(sampleRatio), + }) + + // Add batch span processor for efficient export + provider.addSpanProcessor(new BatchSpanProcessor(exporter)) + + // Add offline retry processor for storing failed spans + offlineProcessor = new OfflineRetrySpanProcessor(exporter) + provider.addSpanProcessor(offlineProcessor as any) + + // Start periodic retry attempts + offlineProcessor.startPeriodicRetry(30000) + + // If online detector provided, retry on connectivity change + if (onlineDetector) { + onlineDetector.subscribe(async () => { + console.log(`Connectivity changed, retrying stored spans`) + if (offlineProcessor) { + const count = await offlineProcessor.retryStoredSpans() + if (count > 0) { + console.log(`Successfully sent ${count} stored spans`) + } + } + }) + } + + // Register the provider globally + provider.register() + + // Auto-instrument fetch calls + registerInstrumentations({ + instrumentations: [], + }) + + const pendingCount = await offlineProcessor.getPendingCount() + console.log( + `OpenTelemetry initialized: ${endpoint} (${pendingCount} spans pending retry)` + ) +} + +export function getOfflineProcessor(): OfflineRetrySpanProcessor | null { + return offlineProcessor +} diff --git a/examples/react/offline-transactions/src/routeTree.gen.ts b/examples/react/offline-transactions/src/routeTree.gen.ts new file mode 100644 index 000000000..def28e530 --- /dev/null +++ b/examples/react/offline-transactions/src/routeTree.gen.ts @@ -0,0 +1,226 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { createServerRootRoute } from '@tanstack/react-start/server' + +import { Route as rootRouteImport } from './routes/__root' +import { Route as LocalstorageRouteImport } from './routes/localstorage' +import { Route as IndexeddbRouteImport } from './routes/indexeddb' +import { Route as IndexRouteImport } from './routes/index' +import { ServerRoute as ApiUsersServerRouteImport } from './routes/api/users' +import { ServerRoute as ApiTodosServerRouteImport } from './routes/api/todos' +import { ServerRoute as ApiUsersUserIdServerRouteImport } from './routes/api/users.$userId' +import { ServerRoute as ApiTodosTodoIdServerRouteImport } from './routes/api/todos.$todoId' + +const rootServerRouteImport = createServerRootRoute() + +const LocalstorageRoute = LocalstorageRouteImport.update({ + id: '/localstorage', + path: '/localstorage', + getParentRoute: () => rootRouteImport, +} as any) +const IndexeddbRoute = IndexeddbRouteImport.update({ + id: '/indexeddb', + path: '/indexeddb', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const ApiUsersServerRoute = ApiUsersServerRouteImport.update({ + id: '/api/users', + path: '/api/users', + getParentRoute: () => rootServerRouteImport, +} as any) +const ApiTodosServerRoute = ApiTodosServerRouteImport.update({ + id: '/api/todos', + path: '/api/todos', + getParentRoute: () => rootServerRouteImport, +} as any) +const ApiUsersUserIdServerRoute = ApiUsersUserIdServerRouteImport.update({ + id: '/$userId', + path: '/$userId', + getParentRoute: () => ApiUsersServerRoute, +} as any) +const ApiTodosTodoIdServerRoute = ApiTodosTodoIdServerRouteImport.update({ + id: '/$todoId', + path: '/$todoId', + getParentRoute: () => ApiTodosServerRoute, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/indexeddb': typeof IndexeddbRoute + '/localstorage': typeof LocalstorageRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/indexeddb': typeof IndexeddbRoute + '/localstorage': typeof LocalstorageRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/indexeddb': typeof IndexeddbRoute + '/localstorage': typeof LocalstorageRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/indexeddb' | '/localstorage' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/indexeddb' | '/localstorage' + id: '__root__' | '/' | '/indexeddb' | '/localstorage' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + IndexeddbRoute: typeof IndexeddbRoute + LocalstorageRoute: typeof LocalstorageRoute +} +export interface FileServerRoutesByFullPath { + '/api/todos': typeof ApiTodosServerRouteWithChildren + '/api/users': typeof ApiUsersServerRouteWithChildren + '/api/todos/$todoId': typeof ApiTodosTodoIdServerRoute + '/api/users/$userId': typeof ApiUsersUserIdServerRoute +} +export interface FileServerRoutesByTo { + '/api/todos': typeof ApiTodosServerRouteWithChildren + '/api/users': typeof ApiUsersServerRouteWithChildren + '/api/todos/$todoId': typeof ApiTodosTodoIdServerRoute + '/api/users/$userId': typeof ApiUsersUserIdServerRoute +} +export interface FileServerRoutesById { + __root__: typeof rootServerRouteImport + '/api/todos': typeof ApiTodosServerRouteWithChildren + '/api/users': typeof ApiUsersServerRouteWithChildren + '/api/todos/$todoId': typeof ApiTodosTodoIdServerRoute + '/api/users/$userId': typeof ApiUsersUserIdServerRoute +} +export interface FileServerRouteTypes { + fileServerRoutesByFullPath: FileServerRoutesByFullPath + fullPaths: + | '/api/todos' + | '/api/users' + | '/api/todos/$todoId' + | '/api/users/$userId' + fileServerRoutesByTo: FileServerRoutesByTo + to: '/api/todos' | '/api/users' | '/api/todos/$todoId' | '/api/users/$userId' + id: + | '__root__' + | '/api/todos' + | '/api/users' + | '/api/todos/$todoId' + | '/api/users/$userId' + fileServerRoutesById: FileServerRoutesById +} +export interface RootServerRouteChildren { + ApiTodosServerRoute: typeof ApiTodosServerRouteWithChildren + ApiUsersServerRoute: typeof ApiUsersServerRouteWithChildren +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/localstorage': { + id: '/localstorage' + path: '/localstorage' + fullPath: '/localstorage' + preLoaderRoute: typeof LocalstorageRouteImport + parentRoute: typeof rootRouteImport + } + '/indexeddb': { + id: '/indexeddb' + path: '/indexeddb' + fullPath: '/indexeddb' + preLoaderRoute: typeof IndexeddbRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} +declare module '@tanstack/react-start/server' { + interface ServerFileRoutesByPath { + '/api/users': { + id: '/api/users' + path: '/api/users' + fullPath: '/api/users' + preLoaderRoute: typeof ApiUsersServerRouteImport + parentRoute: typeof rootServerRouteImport + } + '/api/todos': { + id: '/api/todos' + path: '/api/todos' + fullPath: '/api/todos' + preLoaderRoute: typeof ApiTodosServerRouteImport + parentRoute: typeof rootServerRouteImport + } + '/api/users/$userId': { + id: '/api/users/$userId' + path: '/$userId' + fullPath: '/api/users/$userId' + preLoaderRoute: typeof ApiUsersUserIdServerRouteImport + parentRoute: typeof ApiUsersServerRoute + } + '/api/todos/$todoId': { + id: '/api/todos/$todoId' + path: '/$todoId' + fullPath: '/api/todos/$todoId' + preLoaderRoute: typeof ApiTodosTodoIdServerRouteImport + parentRoute: typeof ApiTodosServerRoute + } + } +} + +interface ApiTodosServerRouteChildren { + ApiTodosTodoIdServerRoute: typeof ApiTodosTodoIdServerRoute +} + +const ApiTodosServerRouteChildren: ApiTodosServerRouteChildren = { + ApiTodosTodoIdServerRoute: ApiTodosTodoIdServerRoute, +} + +const ApiTodosServerRouteWithChildren = ApiTodosServerRoute._addFileChildren( + ApiTodosServerRouteChildren, +) + +interface ApiUsersServerRouteChildren { + ApiUsersUserIdServerRoute: typeof ApiUsersUserIdServerRoute +} + +const ApiUsersServerRouteChildren: ApiUsersServerRouteChildren = { + ApiUsersUserIdServerRoute: ApiUsersUserIdServerRoute, +} + +const ApiUsersServerRouteWithChildren = ApiUsersServerRoute._addFileChildren( + ApiUsersServerRouteChildren, +) + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + IndexeddbRoute: IndexeddbRoute, + LocalstorageRoute: LocalstorageRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() +const rootServerRouteChildren: RootServerRouteChildren = { + ApiTodosServerRoute: ApiTodosServerRouteWithChildren, + ApiUsersServerRoute: ApiUsersServerRouteWithChildren, +} +export const serverRouteTree = rootServerRouteImport + ._addFileChildren(rootServerRouteChildren) + ._addFileTypes() diff --git a/examples/react/offline-transactions/src/router.tsx b/examples/react/offline-transactions/src/router.tsx new file mode 100644 index 000000000..e15333a99 --- /dev/null +++ b/examples/react/offline-transactions/src/router.tsx @@ -0,0 +1,22 @@ +import { createRouter as createTanStackRouter } from "@tanstack/react-router" +import { routeTree } from "./routeTree.gen" +import { DefaultCatchBoundary } from "./components/DefaultCatchBoundary" +import { NotFound } from "./components/NotFound" + +export function createRouter() { + const router = createTanStackRouter({ + routeTree, + defaultPreload: `intent`, + defaultErrorComponent: DefaultCatchBoundary, + defaultNotFoundComponent: () => , + scrollRestoration: true, + }) + + return router +} + +declare module "@tanstack/react-router" { + interface Register { + router: ReturnType + } +} diff --git a/examples/react/offline-transactions/src/routes/__root.tsx b/examples/react/offline-transactions/src/routes/__root.tsx new file mode 100644 index 000000000..ae2487fb4 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/__root.tsx @@ -0,0 +1,124 @@ +/// +import { + HeadContent, + Link, + Scripts, + createRootRoute, +} from "@tanstack/react-router" +import { TanStackRouterDevtools } from "@tanstack/react-router-devtools" +import { QueryClientProvider } from "@tanstack/react-query" +import * as React from "react" +import { DefaultCatchBoundary } from "~/components/DefaultCatchBoundary" +import { NotFound } from "~/components/NotFound" +import appCss from "~/styles/app.css?url" +import { seo } from "~/utils/seo" +import { queryClient } from "~/utils/queryClient" + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { + charSet: `utf-8`, + }, + { + name: `viewport`, + content: `width=device-width, initial-scale=1`, + }, + ...seo({ + title: `TanStack Start | Type-Safe, Client-First, Full-Stack React Framework`, + description: `TanStack Start is a type-safe, client-first, full-stack React framework. `, + }), + ], + links: [ + { rel: `stylesheet`, href: appCss }, + { + rel: `apple-touch-icon`, + sizes: `180x180`, + href: `/apple-touch-icon.png`, + }, + { + rel: `icon`, + type: `image/png`, + sizes: `32x32`, + href: `/favicon-32x32.png`, + }, + { + rel: `icon`, + type: `image/png`, + sizes: `16x16`, + href: `/favicon-16x16.png`, + }, + { rel: `manifest`, href: `/site.webmanifest`, color: `#fffff` }, + { rel: `icon`, href: `/favicon.ico` }, + ], + scripts: [ + { + src: `/customScript.js`, + type: `text/javascript`, + }, + ], + }), + errorComponent: DefaultCatchBoundary, + notFoundComponent: () => , + shellComponent: RootDocument, +}) + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + +
+
+
+
+ + + TanStack Offline Transactions + +
+
+ + Home + + + 🗄️ IndexedDB + + + 💾 localStorage + +
+
+
+
+
+ {children} + +
+ + + + ) +} diff --git a/examples/react/offline-transactions/src/routes/api/todos.$todoId.ts b/examples/react/offline-transactions/src/routes/api/todos.$todoId.ts new file mode 100644 index 000000000..e55263518 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/api/todos.$todoId.ts @@ -0,0 +1,80 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import type { TodoUpdate } from "~/utils/todos" +import { todoService } from "~/utils/todos" + +export const ServerRoute = createServerFileRoute(`/api/todos/$todoId`).methods({ + GET: async ({ params, request }) => { + console.info(`GET /api/todos/${params.todoId} @`, request.url) + + try { + const todo = await todoService.withDelay(() => { + todoService.simulateFailure(0.1) + return todoService.getById(params.todoId) + }) + + if (!todo) { + return json({ error: `Todo not found` }, { status: 404 }) + } + + return json(todo) + } catch (error) { + console.error(`Error fetching todo:`, error) + return json({ error: `Failed to fetch todo` }, { status: 500 }) + } + }, + + PUT: async ({ params, request }) => { + console.info(`PUT /api/todos/${params.todoId} @`, request.url) + + try { + const body = (await request.json()) as TodoUpdate + + const todo = await todoService.withDelay(() => { + todoService.simulateFailure(0.15) + return todoService.update(params.todoId, body) + }) + + if (!todo) { + return json({ error: `Todo not found` }, { status: 404 }) + } + + return json(todo) + } catch (error) { + console.error(`Error updating todo:`, error) + if (error instanceof Error && error.message.includes(`Simulated`)) { + return json( + { error: `Network error - please try again` }, + { status: 503 } + ) + } + return json({ error: `Failed to update todo` }, { status: 500 }) + } + }, + + DELETE: async ({ params, request }) => { + console.info(`DELETE /api/todos/${params.todoId} @`, request.url) + + try { + const success = await todoService.withDelay(() => { + todoService.simulateFailure(0.15) + return todoService.delete(params.todoId) + }) + + if (!success) { + return json({ error: `Todo not found` }, { status: 404 }) + } + + return json({ success: true }) + } catch (error) { + console.error(`Error deleting todo:`, error) + if (error instanceof Error && error.message.includes(`Simulated`)) { + return json( + { error: `Network error - please try again` }, + { status: 503 } + ) + } + return json({ error: `Failed to delete todo` }, { status: 500 }) + } + }, +}) diff --git a/examples/react/offline-transactions/src/routes/api/todos.ts b/examples/react/offline-transactions/src/routes/api/todos.ts new file mode 100644 index 000000000..76623dd3c --- /dev/null +++ b/examples/react/offline-transactions/src/routes/api/todos.ts @@ -0,0 +1,52 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import type { TodoInput } from "~/utils/todos" +import { todoService } from "~/utils/todos" + +export const ServerRoute = createServerFileRoute(`/api/todos`).methods({ + GET: async ({ request }) => { + console.info(`GET /api/todos @`, request.url) + + try { + const todos = await todoService.withDelay(() => { + // Occasionally simulate failure for demo + todoService.simulateFailure(0.1) + return todoService.getAll() + }) + + return json(todos) + } catch (error) { + console.error(`Error fetching todos:`, error) + return json({ error: `Failed to fetch todos` }, { status: 500 }) + } + }, + + POST: async ({ request }) => { + console.info(`POST /api/todos @`, request.url) + + try { + const body = (await request.json()) as TodoInput + + if (!body.text || body.text.trim() === ``) { + return json({ error: `Todo text is required` }, { status: 400 }) + } + + const todo = await todoService.withDelay(() => { + // Occasionally simulate failure for demo + todoService.simulateFailure(0.15) + return todoService.create(body) + }) + + return json(todo, { status: 201 }) + } catch (error) { + console.error(`Error creating todo:`, error) + if (error instanceof Error && error.message.includes(`Simulated`)) { + return json( + { error: `Network error - please try again` }, + { status: 503 } + ) + } + return json({ error: `Failed to create todo` }, { status: 500 }) + } + }, +}) diff --git a/examples/react/offline-transactions/src/routes/api/users.$userId.ts b/examples/react/offline-transactions/src/routes/api/users.$userId.ts new file mode 100644 index 000000000..8f966de20 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/api/users.$userId.ts @@ -0,0 +1,28 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import type { User } from "~/utils/users" + +export const ServerRoute = createServerFileRoute(`/api/users/$userId`).methods({ + GET: async ({ params, request }) => { + console.info(`Fetching users by id=${params.userId}... @`, request.url) + try { + const res = await fetch( + `https://jsonplaceholder.typicode.com/users/` + params.userId + ) + if (!res.ok) { + throw new Error(`Failed to fetch user`) + } + + const user = (await res.json()) as User + + return json({ + id: user.id, + name: user.name, + email: user.email, + }) + } catch (e) { + console.error(e) + return json({ error: `User not found` }, { status: 404 }) + } + }, +}) diff --git a/examples/react/offline-transactions/src/routes/api/users.ts b/examples/react/offline-transactions/src/routes/api/users.ts new file mode 100644 index 000000000..d92e39318 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/api/users.ts @@ -0,0 +1,64 @@ +import { + createServerFileRoute, + getRequestHeaders, +} from "@tanstack/react-start/server" +import { createMiddleware, json } from "@tanstack/react-start" +import type { User } from "~/utils/users" + +const userLoggerMiddleware = createMiddleware({ type: `request` }).server( + async ({ next, _request }) => { + console.info(`In: /users`) + console.info(`Request Headers:`, getRequestHeaders()) + const result = await next() + result.response.headers.set(`x-users`, `true`) + console.info(`Out: /users`) + return result + } +) + +const testParentMiddleware = createMiddleware({ type: `request` }).server( + async ({ next, _request }) => { + console.info(`In: testParentMiddleware`) + const result = await next() + result.response.headers.set(`x-test-parent`, `true`) + console.info(`Out: testParentMiddleware`) + return result + } +) + +const testMiddleware = createMiddleware({ type: `request` }) + .middleware([testParentMiddleware]) + .server(async ({ next, _request }) => { + console.info(`In: testMiddleware`) + const result = await next() + result.response.headers.set(`x-test`, `true`) + + // if (Math.random() > 0.5) { + // throw new Response(null, { + // status: 302, + // headers: { Location: 'https://www.google.com' }, + // }) + // } + + console.info(`Out: testMiddleware`) + return result + }) + +export const ServerRoute = createServerFileRoute(`/api/users`) + .middleware([testMiddleware, userLoggerMiddleware, testParentMiddleware]) + .methods({ + GET: async ({ request }) => { + console.info(`GET /api/users @`, request.url) + console.info(`Fetching users... @`, request.url) + const res = await fetch(`https://jsonplaceholder.typicode.com/users`) + if (!res.ok) { + throw new Error(`Failed to fetch users`) + } + + const data = (await res.json()) as Array + + const list = data.slice(0, 10) + + return json(list.map((u) => ({ id: u.id, name: u.name, email: u.email }))) + }, + }) diff --git a/examples/react/offline-transactions/src/routes/index.tsx b/examples/react/offline-transactions/src/routes/index.tsx new file mode 100644 index 000000000..bb1db6612 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/index.tsx @@ -0,0 +1,125 @@ +import { Link, createFileRoute } from "@tanstack/react-router" + +export const Route = createFileRoute(`/`)({ + component: Home, +}) + +function Home() { + return ( +
+
+
+

+ TanStack Offline Transactions Demo +

+

+ Experience offline-first development with automatic data + persistence, multi-tab coordination, and seamless sync when + connectivity returns. +

+
+ +
+ +
+
+ 🗄️ +

+ IndexedDB Storage +

+
+

+ Persistent offline storage with IndexedDB. Best performance and + reliability for offline-first applications. +

+
+ + High Storage Limit + + + Structured Data + + + Async API + +
+
+ + + +
+
+ 💾 +

+ localStorage Fallback +

+
+

+ Reliable fallback storage using localStorage. Works everywhere + but with storage limitations. +

+
+ + Universal Support + + + Sync API + + + Limited Storage + +
+
+ +
+ +
+

+ Features Demonstrated +

+
+
+

+ 📦 Outbox Pattern +

+

+ Mutations are persisted before being applied, ensuring zero data + loss during offline periods. +

+
+ +
+

+ 🔄 Automatic Retry +

+

+ Failed operations are retried with exponential backoff when + connectivity is restored. +

+
+ +
+

+ 👥 Multi-tab Coordination +

+

+ Leader election ensures only one tab manages offline storage, + preventing conflicts. +

+
+ +
+

+ ⚡ Optimistic Updates +

+

+ UI updates immediately while mutations sync in the background, + providing snappy user experience. +

+
+
+
+
+
+ ) +} diff --git a/examples/react/offline-transactions/src/routes/indexeddb.tsx b/examples/react/offline-transactions/src/routes/indexeddb.tsx new file mode 100644 index 000000000..6647e7b86 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/indexeddb.tsx @@ -0,0 +1,50 @@ +import { createFileRoute } from "@tanstack/react-router" +import { useEffect, useState } from "react" +import { TodoDemo } from "~/components/TodoDemo" +import { createIndexedDBOfflineExecutor } from "~/db/todos" + +export const Route = createFileRoute(`/indexeddb`)({ + component: IndexedDBDemo, +}) + +function IndexedDBDemo() { + const [offline, setOffline] = useState(null) + + useEffect(() => { + let offlineExecutor: any + + // To enable OpenTelemetry tracing, pass otel config: + // Jaeger: + // createIndexedDBOfflineExecutor({ + // endpoint: 'http://localhost:4318/v1/traces', + // }).then(setOffline) + // Honeycomb: + // createIndexedDBOfflineExecutor({ + // endpoint: 'https://api.honeycomb.io/v1/traces', + // headers: { 'x-honeycomb-team': 'YOUR_API_KEY' }, + // }).then(setOffline) + + createIndexedDBOfflineExecutor({ + endpoint: `http://localhost:4318/v1/traces`, + }).then((executor) => { + offlineExecutor = executor + console.log({ offlineExecutor }) + setOffline(executor) + }) + + return () => { + offlineExecutor?.dispose() + } + }, []) + + return ( +
+ +
+ ) +} diff --git a/examples/react/offline-transactions/src/routes/localstorage.tsx b/examples/react/offline-transactions/src/routes/localstorage.tsx new file mode 100644 index 000000000..8741d4d81 --- /dev/null +++ b/examples/react/offline-transactions/src/routes/localstorage.tsx @@ -0,0 +1,47 @@ +import { createFileRoute } from "@tanstack/react-router" +import { useEffect, useState } from "react" +import { TodoDemo } from "~/components/TodoDemo" +import { createLocalStorageOfflineExecutor } from "~/db/todos" + +export const Route = createFileRoute(`/localstorage`)({ + component: LocalStorageDemo, +}) + +function LocalStorageDemo() { + const [offline, setOffline] = useState(null) + + useEffect(() => { + let offlineExecutor: any + + // To enable OpenTelemetry tracing, pass otel config: + // Jaeger: + // createLocalStorageOfflineExecutor({ + // endpoint: 'http://localhost:4318/v1/traces', + // }).then(setOffline) + // Honeycomb: + // createLocalStorageOfflineExecutor({ + // endpoint: 'https://api.honeycomb.io/v1/traces', + // headers: { 'x-honeycomb-team': 'YOUR_API_KEY' }, + // }).then(setOffline) + + createLocalStorageOfflineExecutor().then((executor) => { + offlineExecutor = executor + setOffline(executor) + }) + + return () => { + offlineExecutor?.dispose() + } + }, []) + + return ( +
+ +
+ ) +} diff --git a/examples/react/offline-transactions/src/styles/app.css b/examples/react/offline-transactions/src/styles/app.css new file mode 100644 index 000000000..c53c87066 --- /dev/null +++ b/examples/react/offline-transactions/src/styles/app.css @@ -0,0 +1,22 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html { + color-scheme: light dark; + } + + * { + @apply border-gray-200 dark:border-gray-800; + } + + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/examples/react/offline-transactions/src/utils/loggingMiddleware.tsx b/examples/react/offline-transactions/src/utils/loggingMiddleware.tsx new file mode 100644 index 000000000..2c516283b --- /dev/null +++ b/examples/react/offline-transactions/src/utils/loggingMiddleware.tsx @@ -0,0 +1,41 @@ +import { createMiddleware } from "@tanstack/react-start" + +const preLogMiddleware = createMiddleware({ type: `function` }) + .client(async (ctx) => { + const clientTime = new Date() + + return ctx.next({ + context: { + clientTime, + }, + sendContext: { + clientTime, + }, + }) + }) + .server(async (ctx) => { + const serverTime = new Date() + + return ctx.next({ + sendContext: { + serverTime, + durationToServer: + serverTime.getTime() - ctx.context.clientTime.getTime(), + }, + }) + }) + +export const logMiddleware = createMiddleware({ type: `function` }) + .middleware([preLogMiddleware]) + .client(async (ctx) => { + const res = await ctx.next() + + const now = new Date() + console.log(`Client Req/Res:`, { + duration: now.getTime() - res.context.clientTime.getTime(), + durationToServer: res.context.durationToServer, + durationFromServer: now.getTime() - res.context.serverTime.getTime(), + }) + + return res + }) diff --git a/examples/react/offline-transactions/src/utils/queryClient.ts b/examples/react/offline-transactions/src/utils/queryClient.ts new file mode 100644 index 000000000..3706eed12 --- /dev/null +++ b/examples/react/offline-transactions/src/utils/queryClient.ts @@ -0,0 +1,10 @@ +import { QueryClient } from "@tanstack/react-query" + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 1000 * 60 * 5, // 5 minutes + gcTime: 1000 * 60 * 30, // 30 minutes + }, + }, +}) diff --git a/examples/react/offline-transactions/src/utils/seo.ts b/examples/react/offline-transactions/src/utils/seo.ts new file mode 100644 index 000000000..bbbdd34ad --- /dev/null +++ b/examples/react/offline-transactions/src/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: `description`, content: description }, + { name: `keywords`, content: keywords }, + { name: `twitter:title`, content: title }, + { name: `twitter:description`, content: description }, + { name: `twitter:creator`, content: `@tannerlinsley` }, + { name: `twitter:site`, content: `@tannerlinsley` }, + { name: `og:type`, content: `website` }, + { name: `og:title`, content: title }, + { name: `og:description`, content: description }, + ...(image + ? [ + { name: `twitter:image`, content: image }, + { name: `twitter:card`, content: `summary_large_image` }, + { name: `og:image`, content: image }, + ] + : []), + ] + + return tags +} diff --git a/examples/react/offline-transactions/src/utils/todos.ts b/examples/react/offline-transactions/src/utils/todos.ts new file mode 100644 index 000000000..935a7f565 --- /dev/null +++ b/examples/react/offline-transactions/src/utils/todos.ts @@ -0,0 +1,92 @@ +export interface Todo { + id: string + text: string + completed: boolean + createdAt: Date + updatedAt: Date +} + +export interface TodoInput { + text: string + completed?: boolean +} + +export interface TodoUpdate { + text?: string + completed?: boolean +} + +// In-memory storage for the demo +const todosStore = new Map() + +// Helper function to generate IDs +function generateId(): string { + return Math.random().toString(36).substring(2) + Date.now().toString(36) +} + +export const todoService = { + getAll(): Array { + return Array.from(todosStore.values()).sort( + (a, b) => + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + }, + + getById(id: string): Todo | undefined { + return todosStore.get(id) + }, + + create(input: TodoInput): Todo { + const now = new Date() + const todo: Todo = { + id: generateId(), + text: input.text, + completed: input.completed ?? false, + createdAt: now, + updatedAt: now, + } + todosStore.set(todo.id, todo) + return todo + }, + + update(id: string, updates: TodoUpdate): Todo | null { + const existing = todosStore.get(id) + if (!existing) { + return null + } + + const updated: Todo = { + ...existing, + ...updates, + updatedAt: new Date(), + } + todosStore.set(id, updated) + return updated + }, + + delete(id: string): boolean { + return todosStore.delete(id) + }, + + clear(): void { + todosStore.clear() + }, + + // For demo purposes - simulate network delays + async withDelay(fn: () => T, delay = 500): Promise { + await new Promise((resolve) => setTimeout(resolve, delay)) + return fn() + }, + + // For demo purposes - simulate random failures + simulateFailure(probability = 0.2): void { + if (Math.random() < probability) { + throw new Error(`Simulated network failure`) + } + }, +} + +// Add some initial data for demo +todoService.create({ text: `Learn TanStack DB` }) +todoService.create({ text: `Build offline-first app` }) +todoService.create({ text: `Test multi-tab coordination`, completed: true }) diff --git a/examples/react/offline-transactions/tailwind.config.mjs b/examples/react/offline-transactions/tailwind.config.mjs new file mode 100644 index 000000000..6765f75b2 --- /dev/null +++ b/examples/react/offline-transactions/tailwind.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./src/**/*.{js,jsx,ts,tsx}"], +} diff --git a/examples/react/offline-transactions/tsconfig.json b/examples/react/offline-transactions/tsconfig.json new file mode 100644 index 000000000..3a9fb7cd7 --- /dev/null +++ b/examples/react/offline-transactions/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./src/*"] + }, + "noEmit": true + } +} diff --git a/examples/react/offline-transactions/vite.config.ts b/examples/react/offline-transactions/vite.config.ts new file mode 100644 index 000000000..f730c1bf5 --- /dev/null +++ b/examples/react/offline-transactions/vite.config.ts @@ -0,0 +1,78 @@ +import path from "node:path" +import { tanstackStart } from "@tanstack/react-start/plugin/vite" +import { defineConfig } from "vite" +import tsConfigPaths from "vite-tsconfig-paths" +import viteReact from "@vitejs/plugin-react" +import chokidar from "chokidar" + +function watchWorkspacePackages() { + return { + name: `watch-workspace-packages`, + configureServer(server: any) { + const watchPaths = [ + path.resolve(__dirname, `../../../packages/db/dist`), + path.resolve(__dirname, `../../../packages/offline-transactions/dist`), + ] + + console.log(`[watch-workspace] Starting to watch paths:`) + watchPaths.forEach((p) => console.log(` - ${p}`)) + console.log(`[watch-workspace] Current directory: ${__dirname}`) + console.log(`[watch-workspace] Resolved paths:`) + watchPaths.forEach((p) => console.log(` - ${path.resolve(p)}`)) + + const watcher = chokidar.watch(watchPaths, { + ignored: /node_modules/, + persistent: true, + }) + + watcher.on(`ready`, () => { + console.log( + `[watch-workspace] Initial scan complete. Watching for changes...` + ) + const watchedPaths = watcher.getWatched() + console.log(`[watch-workspace] Currently watching:`, watchedPaths) + }) + + watcher.on(`add`, (filePath) => { + console.log(`[watch-workspace] File added: ${filePath}`) + server.ws.send({ + type: `full-reload`, + }) + }) + + watcher.on(`change`, (filePath) => { + console.log(`[watch-workspace] File changed: ${filePath}`) + server.ws.send({ + type: `full-reload`, + }) + }) + + watcher.on(`error`, (error) => { + console.error(`[watch-workspace] Watcher error:`, error) + }) + }, + } +} + +export default defineConfig({ + server: { + port: 3000, + watch: { + ignored: [`!**/node_modules/@tanstack/**`], + }, + }, + optimizeDeps: { + exclude: [`@tanstack/db`, `@tanstack/offline-transactions`], + }, + plugins: [ + watchWorkspacePackages(), + tsConfigPaths({ + projects: [`./tsconfig.json`], + }), + tanstackStart({ + customViteReactPlugin: true, + mode: `spa`, // SPA mode for client-side only offline features + }), + viteReact(), + ], +}) diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index c042a34e4..1d96e2aef 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -17,8 +17,8 @@ "dependencies": { "@tailwindcss/vite": "^4.1.13", "@tanstack/query-core": "^5.90.2", - "@tanstack/query-db-collection": "^0.2.24", - "@tanstack/react-db": "^0.1.25", + "@tanstack/query-db-collection": "workspace:*", + "@tanstack/react-db": "workspace:*", "@tanstack/react-router": "^1.132.25", "@tanstack/react-router-devtools": "^1.132.25", "@tanstack/react-router-with-query": "^1.130.17", diff --git a/examples/react/todo/src/routes/electric.tsx b/examples/react/todo/src/routes/electric.tsx index 8d4f068f6..70b8816b7 100644 --- a/examples/react/todo/src/routes/electric.tsx +++ b/examples/react/todo/src/routes/electric.tsx @@ -1,3 +1,4 @@ +import * as React from "react" import { createFileRoute } from "@tanstack/react-router" import { useLiveQuery } from "@tanstack/react-db" import { diff --git a/examples/react/todo/src/routes/index.tsx b/examples/react/todo/src/routes/index.tsx index 37a2a8798..0986beb69 100644 --- a/examples/react/todo/src/routes/index.tsx +++ b/examples/react/todo/src/routes/index.tsx @@ -1,3 +1,4 @@ +import * as React from "react" import { Link, createFileRoute } from "@tanstack/react-router" export const Route = createFileRoute(`/`)({ diff --git a/examples/react/todo/src/routes/query.tsx b/examples/react/todo/src/routes/query.tsx index 129ab0cd4..52fe370b1 100644 --- a/examples/react/todo/src/routes/query.tsx +++ b/examples/react/todo/src/routes/query.tsx @@ -1,3 +1,4 @@ +import * as React from "react" import { createFileRoute } from "@tanstack/react-router" import { useLiveQuery } from "@tanstack/react-db" import { queryConfigCollection, queryTodoCollection } from "../lib/collections" diff --git a/examples/react/todo/src/routes/trailbase.tsx b/examples/react/todo/src/routes/trailbase.tsx index 4ed7458f7..0df1ea677 100644 --- a/examples/react/todo/src/routes/trailbase.tsx +++ b/examples/react/todo/src/routes/trailbase.tsx @@ -1,3 +1,4 @@ +import * as React from "react" import { createFileRoute } from "@tanstack/react-router" import { useLiveQuery } from "@tanstack/react-db" import { diff --git a/examples/solid/todo/package.json b/examples/solid/todo/package.json index 7d97d9fd9..052f9ed73 100644 --- a/examples/solid/todo/package.json +++ b/examples/solid/todo/package.json @@ -5,7 +5,7 @@ "dependencies": { "@tanstack/electric-db-collection": "^0.1.25", "@tanstack/query-core": "^5.90.2", - "@tanstack/query-db-collection": "^0.2.22", + "@tanstack/query-db-collection": "workspace:*", "@tanstack/solid-db": "^0.1.23", "@tanstack/solid-router": "^1.132.25", "@tanstack/solid-start": "^1.132.25", @@ -37,7 +37,7 @@ "pg": "^8.16.3", "tsx": "^4.20.6", "typescript": "^5.9.2", - "vite": "^6.3.6", + "vite": "^7.1.7", "vite-plugin-solid": "^2.11.8" }, "scripts": { diff --git a/package.json b/package.json index 863a4ff68..e2a1b6727 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@types/use-sync-external-store": "^1.5.0", "@typescript-eslint/eslint-plugin": "^8.45.0", "@typescript-eslint/parser": "^8.45.0", - "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react": "^5.0.3", "eslint": "^9.36.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", @@ -51,7 +51,7 @@ "shx": "^0.4.0", "tinyglobby": "^0.2.15", "typescript": "^5.9.2", - "vite": "^6.3.6", + "vite": "^7.1.7", "vitest": "^3.2.4", "zod": "^3.25.76" }, @@ -59,5 +59,24 @@ "*.{ts,tsx}": [ "eslint --fix" ] + }, + "workspaces": [ + "packages/*", + "examples/*", + "examples/react/*" + ], + "overrides": { + "@tanstack/db": "workspace:*", + "@tanstack/db-ivm": "workspace:*", + "@tanstack/react-db": "workspace:*", + "@tanstack/vue-db": "workspace:*" + }, + "pnpm": { + "overrides": { + "@tanstack/db": "workspace:*", + "@tanstack/query-db-collection": "workspace:*", + "@tanstack/react-db": "workspace:*", + "@tanstack/offline-transactions": "workspace:*" + } } } diff --git a/packages/offline-transactions/README.md b/packages/offline-transactions/README.md new file mode 100644 index 000000000..635e19627 --- /dev/null +++ b/packages/offline-transactions/README.md @@ -0,0 +1,219 @@ +# @tanstack/offline-transactions + +Offline-first transaction capabilities for TanStack DB that provides durable persistence of mutations with automatic retry when connectivity is restored. + +## Features + +- **Outbox Pattern**: Persist mutations before dispatch for zero data loss +- **Automatic Retry**: Exponential backoff with jitter for failed transactions +- **Multi-tab Coordination**: Leader election ensures safe storage access +- **FIFO Sequential Processing**: Transactions execute one at a time in creation order +- **Flexible Storage**: IndexedDB with localStorage fallback +- **Type Safe**: Full TypeScript support with TanStack DB integration + +## Installation + +```bash +npm install @tanstack/offline-transactions +``` + +## Quick Start + +```typescript +import { startOfflineExecutor } from "@tanstack/offline-transactions" + +// Setup offline executor +const offline = startOfflineExecutor({ + collections: { todos: todoCollection }, + mutationFns: { + syncTodos: async ({ transaction, idempotencyKey }) => { + await api.saveBatch(transaction.mutations, { idempotencyKey }) + }, + }, + onLeadershipChange: (isLeader) => { + if (!isLeader) { + console.warn("Running in online-only mode (another tab is the leader)") + } + }, +}) + +// Create offline transactions +const offlineTx = offline.createOfflineTransaction({ + mutationFnName: "syncTodos", + autoCommit: false, +}) + +offlineTx.mutate(() => { + todoCollection.insert({ + id: crypto.randomUUID(), + text: "Buy milk", + completed: false, + }) +}) + +// Execute with automatic offline support +await offlineTx.commit() +``` + +## Core Concepts + +### Outbox-First Persistence + +Mutations are persisted to a durable outbox before being applied, ensuring zero data loss during offline periods: + +1. Mutation is persisted to IndexedDB/localStorage +2. Optimistic update is applied locally +3. When online, mutation is sent to server +4. On success, mutation is removed from outbox + +### Multi-tab Coordination + +Only one tab acts as the "leader" to safely manage the outbox: + +- **Leader tab**: Full offline support with outbox persistence +- **Non-leader tabs**: Online-only mode for safety +- **Leadership transfer**: Automatic failover when leader tab closes + +### FIFO Sequential Processing + +Transactions are processed one at a time in the order they were created: + +- **Sequential execution**: All transactions execute in FIFO order +- **Dependency safety**: Avoids conflicts between transactions that may reference each other +- **Predictable behavior**: Transactions complete in the exact order they were created + +## API Reference + +### startOfflineExecutor(config) + +Creates and starts an offline executor instance. + +```typescript +interface OfflineConfig { + collections: Record + mutationFns: Record + storage?: StorageAdapter + maxConcurrency?: number + jitter?: boolean + beforeRetry?: (transactions: OfflineTransaction[]) => OfflineTransaction[] + onUnknownMutationFn?: (name: string, tx: OfflineTransaction) => void + onLeadershipChange?: (isLeader: boolean) => void +} +``` + +### OfflineExecutor + +#### Properties + +- `isOfflineEnabled: boolean` - Whether this tab can persist offline transactions + +#### Methods + +- `createOfflineTransaction(options)` - Create a manual offline transaction +- `waitForTransactionCompletion(id)` - Wait for a specific transaction to complete +- `removeFromOutbox(id)` - Manually remove transaction from outbox +- `peekOutbox()` - View all pending transactions +- `notifyOnline()` - Manually trigger retry execution +- `dispose()` - Clean up resources + +### Error Handling + +Use `NonRetriableError` for permanent failures: + +```typescript +import { NonRetriableError } from "@tanstack/offline-transactions" + +const mutationFn = async ({ transaction }) => { + try { + await api.save(transaction.mutations) + } catch (error) { + if (error.status === 422) { + throw new NonRetriableError("Invalid data - will not retry") + } + throw error // Will retry with backoff + } +} +``` + +## Advanced Usage + +### Custom Storage Adapter + +```typescript +import { + IndexedDBAdapter, + LocalStorageAdapter, +} from "@tanstack/offline-transactions" + +const executor = startOfflineExecutor({ + // Use custom storage + storage: new IndexedDBAdapter("my-app", "transactions"), + // ... other config +}) +``` + +### Custom Retry Policy + +```typescript +const executor = startOfflineExecutor({ + maxConcurrency: 5, + jitter: true, + beforeRetry: (transactions) => { + // Filter out old transactions + const cutoff = Date.now() - 24 * 60 * 60 * 1000 // 24 hours + return transactions.filter((tx) => tx.createdAt.getTime() > cutoff) + }, + // ... other config +}) +``` + +### Manual Transaction Control + +```typescript +const tx = executor.createOfflineTransaction({ + mutationFnName: "syncData", + autoCommit: false, +}) + +tx.mutate(() => { + collection.insert({ id: "1", text: "Item 1" }) + collection.insert({ id: "2", text: "Item 2" }) +}) + +// Commit when ready +await tx.commit() +``` + +## Migration from TanStack DB + +This package uses explicit offline transactions to provide offline capabilities: + +```typescript +// Before: Standard TanStack DB (online only) +todoCollection.insert({ id: "1", text: "Buy milk" }) + +// After: Explicit offline transactions +const offline = startOfflineExecutor({ + collections: { todos: todoCollection }, + mutationFns: { + syncTodos: async ({ transaction }) => { + await api.sync(transaction.mutations) + }, + }, +}) + +const tx = offline.createOfflineTransaction({ mutationFnName: "syncTodos" }) +tx.mutate(() => todoCollection.insert({ id: "1", text: "Buy milk" })) +await tx.commit() // Works offline! +``` + +## Browser Support + +- **IndexedDB**: Modern browsers (primary storage) +- **localStorage**: Fallback for limited environments +- **Web Locks API**: Chrome 69+, Firefox 96+ (preferred leader election) +- **BroadcastChannel**: All modern browsers (fallback leader election) + +## License + +MIT diff --git a/packages/offline-transactions/package.json b/packages/offline-transactions/package.json new file mode 100644 index 000000000..36e200f32 --- /dev/null +++ b/packages/offline-transactions/package.json @@ -0,0 +1,66 @@ +{ + "name": "@tanstack/offline-transactions", + "version": "0.0.0", + "description": "Offline-first transaction capabilities for TanStack DB", + "author": "TanStack", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/db.git", + "directory": "packages/offline-transactions" + }, + "publishConfig": { + "access": "public" + }, + "keywords": [ + "tanstack", + "database", + "offline", + "transactions", + "persistence", + "sync" + ], + "type": "module", + "sideEffects": false, + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "types": "dist/esm/index.d.ts", + "files": [ + "dist", + "src" + ], + "scripts": { + "build": "vite build", + "dev": "vite build --watch", + "test": "vitest", + "test:watch": "vitest --watch", + "typecheck": "tsc --noEmit", + "lint": "eslint src" + }, + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@tanstack/db": "workspace:*" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "eslint": "^8.57.0", + "typescript": "^5.5.4", + "vitest": "^3.2.4" + }, + "peerDependencies": { + "@tanstack/db": "workspace:*" + } +} diff --git a/packages/offline-transactions/src/OfflineExecutor.ts b/packages/offline-transactions/src/OfflineExecutor.ts new file mode 100644 index 000000000..95722b752 --- /dev/null +++ b/packages/offline-transactions/src/OfflineExecutor.ts @@ -0,0 +1,360 @@ +// Storage adapters +import { createOptimisticAction, createTransaction } from "@tanstack/db" +import { IndexedDBAdapter } from "./storage/IndexedDBAdapter" +import { LocalStorageAdapter } from "./storage/LocalStorageAdapter" + +// Core components +import { OutboxManager } from "./outbox/OutboxManager" +import { KeyScheduler } from "./executor/KeyScheduler" +import { TransactionExecutor } from "./executor/TransactionExecutor" + +// Coordination +import { WebLocksLeader } from "./coordination/WebLocksLeader" +import { BroadcastChannelLeader } from "./coordination/BroadcastChannelLeader" + +// Connectivity +import { DefaultOnlineDetector } from "./connectivity/OnlineDetector" + +// API +import { OfflineTransaction as OfflineTransactionAPI } from "./api/OfflineTransaction" +import { createOfflineAction } from "./api/OfflineAction" + +// TanStack DB primitives + +// Replay +import { withNestedSpan, withSpan } from "./telemetry/tracer" +import type { + CreateOfflineActionOptions, + CreateOfflineTransactionOptions, + LeaderElection, + OfflineConfig, + OfflineTransaction, + StorageAdapter, +} from "./types" +import type { Transaction } from "@tanstack/db" + +export class OfflineExecutor { + private config: OfflineConfig + private storage: StorageAdapter + private outbox: OutboxManager + private scheduler: KeyScheduler + private executor: TransactionExecutor + private leaderElection: LeaderElection + private onlineDetector: DefaultOnlineDetector + private isLeaderState = false + private unsubscribeOnline: (() => void) | null = null + private unsubscribeLeadership: (() => void) | null = null + + // Coordination mechanism for blocking transactions + private pendingTransactionPromises: Map< + string, + { + promise: Promise + resolve: (result: any) => void + reject: (error: Error) => void + } + > = new Map() + + constructor(config: OfflineConfig) { + this.config = config + this.storage = this.createStorage() + this.outbox = new OutboxManager(this.storage, this.config.collections) + this.scheduler = new KeyScheduler() + this.executor = new TransactionExecutor( + this.scheduler, + this.outbox, + this.config, + this + ) + this.leaderElection = this.createLeaderElection() + this.onlineDetector = new DefaultOnlineDetector() + + this.setupEventListeners() + this.initialize() + } + + private createStorage(): StorageAdapter { + if (this.config.storage) { + return this.config.storage + } + + try { + return new IndexedDBAdapter() + } catch (error) { + console.warn( + `IndexedDB not available, falling back to localStorage:`, + error + ) + return new LocalStorageAdapter() + } + } + + private createLeaderElection(): LeaderElection { + if (this.config.leaderElection) { + return this.config.leaderElection + } + + if (WebLocksLeader.isSupported()) { + return new WebLocksLeader() + } else if (BroadcastChannelLeader.isSupported()) { + return new BroadcastChannelLeader() + } else { + // Fallback: always be leader in environments without multi-tab support + return { + requestLeadership: () => Promise.resolve(true), + releaseLeadership: () => {}, + isLeader: () => true, + onLeadershipChange: () => () => {}, + } + } + } + + private setupEventListeners(): void { + this.unsubscribeLeadership = this.leaderElection.onLeadershipChange( + (isLeader) => { + this.isLeaderState = isLeader + + if (this.config.onLeadershipChange) { + this.config.onLeadershipChange(isLeader) + } + + if (isLeader) { + this.loadAndReplayTransactions() + } + } + ) + + this.unsubscribeOnline = this.onlineDetector.subscribe(() => { + if (this.isOfflineEnabled) { + // Reset retry delays so transactions can execute immediately when back online + this.executor.resetRetryDelays() + this.executor.executeAll().catch((error) => { + console.warn( + `Failed to execute transactions on connectivity change:`, + error + ) + }) + } + }) + } + + private async initialize(): Promise { + return withSpan(`executor.initialize`, {}, async (span) => { + try { + const isLeader = await this.leaderElection.requestLeadership() + span.setAttribute(`isLeader`, isLeader) + + if (isLeader) { + await this.loadAndReplayTransactions() + } + } catch (error) { + console.warn(`Failed to initialize offline executor:`, error) + } + }) + } + + private async loadAndReplayTransactions(): Promise { + try { + await this.executor.loadPendingTransactions() + await this.executor.executeAll() + } catch (error) { + console.warn(`Failed to load and replay transactions:`, error) + } + } + + get isOfflineEnabled(): boolean { + return this.isLeaderState + } + + createOfflineTransaction( + options: CreateOfflineTransactionOptions + ): Transaction | OfflineTransactionAPI { + const mutationFn = this.config.mutationFns[options.mutationFnName] + + if (!mutationFn) { + throw new Error(`Unknown mutation function: ${options.mutationFnName}`) + } + + // Check leadership immediately and use the appropriate primitive + if (!this.isOfflineEnabled) { + // Non-leader: use createTransaction directly with the resolved mutation function + // We need to wrap it to add the idempotency key + return createTransaction({ + autoCommit: options.autoCommit ?? true, + mutationFn: (params) => + mutationFn({ + ...params, + idempotencyKey: options.idempotencyKey || crypto.randomUUID(), + }), + metadata: options.metadata, + }) + } + + // Leader: use OfflineTransaction wrapper for offline persistence + return new OfflineTransactionAPI( + options, + mutationFn, + this.persistTransaction.bind(this), + this + ) + } + + createOfflineAction(options: CreateOfflineActionOptions) { + const mutationFn = this.config.mutationFns[options.mutationFnName] + + if (!mutationFn) { + throw new Error(`Unknown mutation function: ${options.mutationFnName}`) + } + + // Return a wrapper that checks leadership status at call time + return (variables: T) => { + // Check leadership when action is called, not when it's created + if (!this.isOfflineEnabled) { + // Non-leader: use createOptimisticAction directly + const action = createOptimisticAction({ + mutationFn: (vars, params) => + mutationFn({ + ...vars, + ...params, + idempotencyKey: crypto.randomUUID(), + }), + onMutate: options.onMutate, + }) + return action(variables) + } + + // Leader: use the offline action wrapper + const action = createOfflineAction( + options, + mutationFn, + this.persistTransaction.bind(this), + this + ) + return action(variables) + } + } + + private async persistTransaction( + transaction: OfflineTransaction + ): Promise { + return withNestedSpan( + `executor.persistTransaction`, + { + "transaction.id": transaction.id, + "transaction.mutationFnName": transaction.mutationFnName, + }, + async (span) => { + if (!this.isOfflineEnabled) { + span.setAttribute(`result`, `skipped_not_leader`) + this.resolveTransaction(transaction.id, undefined) + return + } + + try { + await this.outbox.add(transaction) + await this.executor.execute(transaction) + span.setAttribute(`result`, `persisted`) + } catch (error) { + console.error( + `Failed to persist offline transaction ${transaction.id}:`, + error + ) + span.setAttribute(`result`, `failed`) + throw error + } + } + ) + } + + // Method for OfflineTransaction to wait for completion + async waitForTransactionCompletion(transactionId: string): Promise { + const existing = this.pendingTransactionPromises.get(transactionId) + if (existing) { + return existing.promise + } + + const deferred: { + promise: Promise + resolve: (result: any) => void + reject: (error: Error) => void + } = {} as any + + deferred.promise = new Promise((resolve, reject) => { + deferred.resolve = resolve + deferred.reject = reject + }) + + this.pendingTransactionPromises.set(transactionId, deferred) + return deferred.promise + } + + // Method for TransactionExecutor to signal completion + resolveTransaction(transactionId: string, result: any): void { + const deferred = this.pendingTransactionPromises.get(transactionId) + if (deferred) { + deferred.resolve(result) + this.pendingTransactionPromises.delete(transactionId) + } + } + + // Method for TransactionExecutor to signal failure + rejectTransaction(transactionId: string, error: Error): void { + const deferred = this.pendingTransactionPromises.get(transactionId) + if (deferred) { + deferred.reject(error) + this.pendingTransactionPromises.delete(transactionId) + } + } + + async removeFromOutbox(id: string): Promise { + await this.outbox.remove(id) + } + + async peekOutbox(): Promise> { + return this.outbox.getAll() + } + + async clearOutbox(): Promise { + await this.outbox.clear() + this.executor.clear() + } + + notifyOnline(): void { + this.onlineDetector.notifyOnline() + } + + getPendingCount(): number { + return this.executor.getPendingCount() + } + + getRunningCount(): number { + return this.executor.getRunningCount() + } + + getOnlineDetector(): DefaultOnlineDetector { + return this.onlineDetector + } + + dispose(): void { + if (this.unsubscribeOnline) { + this.unsubscribeOnline() + this.unsubscribeOnline = null + } + + if (this.unsubscribeLeadership) { + this.unsubscribeLeadership() + this.unsubscribeLeadership = null + } + + this.leaderElection.releaseLeadership() + this.onlineDetector.dispose() + + if (`dispose` in this.leaderElection) { + ;(this.leaderElection as any).dispose() + } + } +} + +export function startOfflineExecutor(config: OfflineConfig): OfflineExecutor { + return new OfflineExecutor(config) +} diff --git a/packages/offline-transactions/src/api/OfflineAction.ts b/packages/offline-transactions/src/api/OfflineAction.ts new file mode 100644 index 000000000..7bd420958 --- /dev/null +++ b/packages/offline-transactions/src/api/OfflineAction.ts @@ -0,0 +1,68 @@ +import { SpanStatusCode, context, trace } from "@opentelemetry/api" +import { OfflineTransaction } from "./OfflineTransaction" +import type { Transaction } from "@tanstack/db" +import type { + CreateOfflineActionOptions, + OfflineMutationFn, + OfflineTransaction as OfflineTransactionType, +} from "../types" + +export function createOfflineAction( + options: CreateOfflineActionOptions, + mutationFn: OfflineMutationFn, + persistTransaction: (tx: OfflineTransactionType) => Promise, + executor: any +): (variables: T) => Transaction { + const { mutationFnName, onMutate } = options + console.log(`createOfflineAction 2`, options) + + return (variables: T): Transaction => { + const offlineTransaction = new OfflineTransaction( + { + mutationFnName, + autoCommit: false, + }, + mutationFn, + persistTransaction, + executor + ) + + const transaction = offlineTransaction.mutate(() => { + console.log(`mutate`) + onMutate(variables) + }) + + // Immediately commit with span instrumentation + const tracer = trace.getTracer(`@tanstack/offline-transactions`, `0.0.1`) + const span = tracer.startSpan(`offlineAction.${mutationFnName}`) + const ctx = trace.setSpan(context.active(), span) + console.log(`starting offlineAction span`, { tracer, span, ctx }) + + // Execute the commit within the span context + // The key is to return the promise synchronously from context.with() so context binds to it + const commitPromise = context.with(ctx, () => { + // Return the promise synchronously - this is critical for context propagation in browsers + return (async () => { + try { + await transaction.commit() + span.setStatus({ code: SpanStatusCode.OK }) + span.end() + console.log(`ended offlineAction span - success`) + } catch (error) { + span.recordException(error as Error) + span.setStatus({ code: SpanStatusCode.ERROR }) + span.end() + console.log(`ended offlineAction span - error`) + } + })() + }) + + // Don't await - this is fire-and-forget for optimistic actions + // But catch to prevent unhandled rejection + commitPromise.catch(() => { + // Already handled in try/catch above + }) + + return transaction + } +} diff --git a/packages/offline-transactions/src/api/OfflineTransaction.ts b/packages/offline-transactions/src/api/OfflineTransaction.ts new file mode 100644 index 000000000..25f4ca18a --- /dev/null +++ b/packages/offline-transactions/src/api/OfflineTransaction.ts @@ -0,0 +1,134 @@ +import { context, trace } from "@opentelemetry/api" +import { createTransaction } from "@tanstack/db" +import { NonRetriableError } from "../types" +import type { PendingMutation, Transaction } from "@tanstack/db" +import type { + CreateOfflineTransactionOptions, + OfflineMutationFn, + OfflineTransaction as OfflineTransactionType, +} from "../types" + +export class OfflineTransaction { + private offlineId: string + private mutationFnName: string + private autoCommit: boolean + private idempotencyKey: string + private metadata: Record + private transaction: Transaction | null = null + private persistTransaction: (tx: OfflineTransactionType) => Promise + private executor: any // Will be typed properly - reference to OfflineExecutor + + constructor( + options: CreateOfflineTransactionOptions, + mutationFn: OfflineMutationFn, + persistTransaction: (tx: OfflineTransactionType) => Promise, + executor: any + ) { + this.offlineId = crypto.randomUUID() + this.mutationFnName = options.mutationFnName + this.autoCommit = options.autoCommit ?? true + this.idempotencyKey = options.idempotencyKey ?? crypto.randomUUID() + this.metadata = options.metadata ?? {} + this.persistTransaction = persistTransaction + this.executor = executor + } + + mutate(callback: () => void): Transaction { + this.transaction = createTransaction({ + id: this.offlineId, + autoCommit: false, + mutationFn: async () => { + // This is the blocking mutationFn that waits for the executor + // First persist the transaction to the outbox + const activeSpan = trace.getSpan(context.active()) + const spanContext = activeSpan?.spanContext() + + const offlineTransaction: OfflineTransactionType = { + id: this.offlineId, + mutationFnName: this.mutationFnName, + mutations: this.transaction!.mutations, + keys: this.extractKeys(this.transaction!.mutations), + idempotencyKey: this.idempotencyKey, + createdAt: new Date(), + retryCount: 0, + nextAttemptAt: Date.now(), + metadata: this.metadata, + spanContext: spanContext + ? { + traceId: spanContext.traceId, + spanId: spanContext.spanId, + traceFlags: spanContext.traceFlags, + traceState: spanContext.traceState?.serialize(), + } + : undefined, + version: 1, + } + + const completionPromise = this.executor.waitForTransactionCompletion( + this.offlineId + ) + + try { + await this.persistTransaction(offlineTransaction) + // Now block and wait for the executor to complete the real mutation + await completionPromise + } catch (error) { + const normalizedError = + error instanceof Error ? error : new Error(String(error)) + this.executor.rejectTransaction(this.offlineId, normalizedError) + throw error + } + + return + }, + metadata: this.metadata, + }) + + this.transaction.mutate(() => { + callback() + }) + + if (this.autoCommit) { + // Auto-commit for direct OfflineTransaction usage + this.commit().catch((error) => { + console.error(`Auto-commit failed:`, error) + throw error + }) + } + + return this.transaction + } + + async commit(): Promise { + if (!this.transaction) { + throw new Error(`No mutations to commit. Call mutate() first.`) + } + + try { + // Commit the TanStack DB transaction + // This will trigger the mutationFn which handles persistence and waiting + await this.transaction.commit() + return this.transaction + } catch (error) { + // Only rollback for NonRetriableError - other errors should allow retry + if (error instanceof NonRetriableError) { + this.transaction.rollback() + } + throw error + } + } + + rollback(): void { + if (this.transaction) { + this.transaction.rollback() + } + } + + private extractKeys(mutations: Array): Array { + return mutations.map((mutation) => mutation.globalKey) + } + + get id(): string { + return this.offlineId + } +} diff --git a/packages/offline-transactions/src/connectivity/OnlineDetector.ts b/packages/offline-transactions/src/connectivity/OnlineDetector.ts new file mode 100644 index 000000000..caef3a596 --- /dev/null +++ b/packages/offline-transactions/src/connectivity/OnlineDetector.ts @@ -0,0 +1,87 @@ +import type { OnlineDetector } from "../types" + +export class DefaultOnlineDetector implements OnlineDetector { + private listeners: Set<() => void> = new Set() + private isListening = false + + constructor() { + this.startListening() + } + + private startListening(): void { + if (this.isListening) { + return + } + + this.isListening = true + + if (typeof window !== `undefined`) { + window.addEventListener(`online`, this.handleOnline) + document.addEventListener(`visibilitychange`, this.handleVisibilityChange) + } + } + + private stopListening(): void { + if (!this.isListening) { + return + } + + this.isListening = false + + if (typeof window !== `undefined`) { + window.removeEventListener(`online`, this.handleOnline) + document.removeEventListener( + `visibilitychange`, + this.handleVisibilityChange + ) + } + } + + private handleOnline = (): void => { + this.notifyListeners() + } + + private handleVisibilityChange = (): void => { + if (document.visibilityState === `visible`) { + this.notifyListeners() + } + } + + private notifyListeners(): void { + for (const listener of this.listeners) { + try { + listener() + } catch (error) { + console.warn(`OnlineDetector listener error:`, error) + } + } + } + + subscribe(callback: () => void): () => void { + this.listeners.add(callback) + + return () => { + this.listeners.delete(callback) + + if (this.listeners.size === 0) { + this.stopListening() + } + } + } + + notifyOnline(): void { + this.notifyListeners() + } + + isOnline(): boolean { + if (typeof navigator !== `undefined`) { + return navigator.onLine + } + return true + } + + dispose(): void { + this.stopListening() + this.listeners.clear() + } +} diff --git a/packages/offline-transactions/src/coordination/BroadcastChannelLeader.ts b/packages/offline-transactions/src/coordination/BroadcastChannelLeader.ts new file mode 100644 index 000000000..474346171 --- /dev/null +++ b/packages/offline-transactions/src/coordination/BroadcastChannelLeader.ts @@ -0,0 +1,181 @@ +import { BaseLeaderElection } from "./LeaderElection" + +interface LeaderMessage { + type: `heartbeat` | `election` | `leadership-claim` + tabId: string + timestamp: number +} + +export class BroadcastChannelLeader extends BaseLeaderElection { + private channelName: string + private tabId: string + private channel: BroadcastChannel | null = null + private heartbeatInterval: number | null = null + private electionTimeout: number | null = null + private lastLeaderHeartbeat = 0 + private readonly heartbeatIntervalMs = 5000 + private readonly electionTimeoutMs = 10000 + + constructor(channelName = `offline-executor-leader`) { + super() + this.channelName = channelName + this.tabId = crypto.randomUUID() + this.setupChannel() + } + + private setupChannel(): void { + if (!this.isBroadcastChannelSupported()) { + return + } + + this.channel = new BroadcastChannel(this.channelName) + this.channel.addEventListener(`message`, this.handleMessage) + } + + private handleMessage = (event: MessageEvent): void => { + const { type, tabId, timestamp } = event.data + + if (tabId === this.tabId) { + return + } + + switch (type) { + case `heartbeat`: + if (this.isLeaderState && tabId < this.tabId) { + this.releaseLeadership() + } else if (!this.isLeaderState) { + this.lastLeaderHeartbeat = timestamp + this.cancelElection() + } + break + + case `election`: + if (this.isLeaderState) { + this.sendHeartbeat() + } else if (tabId > this.tabId) { + this.startElection() + } + break + + case `leadership-claim`: + if (this.isLeaderState && tabId < this.tabId) { + this.releaseLeadership() + } + break + } + } + + async requestLeadership(): Promise { + if (!this.isBroadcastChannelSupported()) { + return false + } + + if (this.isLeaderState) { + return true + } + + this.startElection() + + return new Promise((resolve) => { + setTimeout(() => { + resolve(this.isLeaderState) + }, 1000) + }) + } + + private startElection(): void { + if (this.electionTimeout) { + return + } + + this.sendMessage({ + type: `election`, + tabId: this.tabId, + timestamp: Date.now(), + }) + + this.electionTimeout = window.setTimeout(() => { + const timeSinceLastHeartbeat = Date.now() - this.lastLeaderHeartbeat + + if (timeSinceLastHeartbeat > this.electionTimeoutMs) { + this.claimLeadership() + } + + this.electionTimeout = null + }, this.electionTimeoutMs) + } + + private cancelElection(): void { + if (this.electionTimeout) { + clearTimeout(this.electionTimeout) + this.electionTimeout = null + } + } + + private claimLeadership(): void { + this.notifyLeadershipChange(true) + this.sendMessage({ + type: `leadership-claim`, + tabId: this.tabId, + timestamp: Date.now(), + }) + this.startHeartbeat() + } + + private startHeartbeat(): void { + if (this.heartbeatInterval) { + return + } + + this.sendHeartbeat() + + this.heartbeatInterval = window.setInterval(() => { + this.sendHeartbeat() + }, this.heartbeatIntervalMs) + } + + private stopHeartbeat(): void { + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval) + this.heartbeatInterval = null + } + } + + private sendHeartbeat(): void { + this.sendMessage({ + type: `heartbeat`, + tabId: this.tabId, + timestamp: Date.now(), + }) + } + + private sendMessage(message: LeaderMessage): void { + if (this.channel) { + this.channel.postMessage(message) + } + } + + releaseLeadership(): void { + this.stopHeartbeat() + this.cancelElection() + this.notifyLeadershipChange(false) + } + + private isBroadcastChannelSupported(): boolean { + return typeof BroadcastChannel !== `undefined` + } + + static isSupported(): boolean { + return typeof BroadcastChannel !== `undefined` + } + + dispose(): void { + this.releaseLeadership() + + if (this.channel) { + this.channel.removeEventListener(`message`, this.handleMessage) + this.channel.close() + this.channel = null + } + } +} diff --git a/packages/offline-transactions/src/coordination/LeaderElection.ts b/packages/offline-transactions/src/coordination/LeaderElection.ts new file mode 100644 index 000000000..b33bca745 --- /dev/null +++ b/packages/offline-transactions/src/coordination/LeaderElection.ts @@ -0,0 +1,35 @@ +import type { LeaderElection } from "../types" + +export abstract class BaseLeaderElection implements LeaderElection { + protected isLeaderState = false + protected listeners: Set<(isLeader: boolean) => void> = new Set() + + abstract requestLeadership(): Promise + abstract releaseLeadership(): void + + isLeader(): boolean { + return this.isLeaderState + } + + onLeadershipChange(callback: (isLeader: boolean) => void): () => void { + this.listeners.add(callback) + + return () => { + this.listeners.delete(callback) + } + } + + protected notifyLeadershipChange(isLeader: boolean): void { + if (this.isLeaderState !== isLeader) { + this.isLeaderState = isLeader + + for (const listener of this.listeners) { + try { + listener(isLeader) + } catch (error) { + console.warn(`Leadership change listener error:`, error) + } + } + } + } +} diff --git a/packages/offline-transactions/src/coordination/WebLocksLeader.ts b/packages/offline-transactions/src/coordination/WebLocksLeader.ts new file mode 100644 index 000000000..b7952a8be --- /dev/null +++ b/packages/offline-transactions/src/coordination/WebLocksLeader.ts @@ -0,0 +1,82 @@ +import { BaseLeaderElection } from "./LeaderElection" + +export class WebLocksLeader extends BaseLeaderElection { + private lockName: string + private releaseLock: (() => void) | null = null + + constructor(lockName = `offline-executor-leader`) { + super() + this.lockName = lockName + } + + async requestLeadership(): Promise { + if (!this.isWebLocksSupported()) { + return false + } + + if (this.isLeaderState) { + return true + } + + try { + // First try to acquire the lock with ifAvailable + const available = await navigator.locks.request( + this.lockName, + { + mode: `exclusive`, + ifAvailable: true, + }, + (lock) => { + return lock !== null + } + ) + + if (!available) { + return false + } + + // Lock is available, now acquire it for real and hold it + navigator.locks.request( + this.lockName, + { + mode: `exclusive`, + }, + async (lock) => { + if (lock) { + this.notifyLeadershipChange(true) + // Hold the lock until released + return new Promise((resolve) => { + this.releaseLock = () => { + this.notifyLeadershipChange(false) + resolve() + } + }) + } + } + ) + + return true + } catch (error) { + if (error instanceof Error && error.name === `AbortError`) { + return false + } + console.warn(`Web Locks leadership request failed:`, error) + return false + } + } + + releaseLeadership(): void { + if (this.releaseLock) { + this.releaseLock() + this.releaseLock = null + } + } + + private isWebLocksSupported(): boolean { + return typeof navigator !== `undefined` && `locks` in navigator + } + + static isSupported(): boolean { + return typeof navigator !== `undefined` && `locks` in navigator + } +} diff --git a/packages/offline-transactions/src/executor/KeyScheduler.ts b/packages/offline-transactions/src/executor/KeyScheduler.ts new file mode 100644 index 000000000..506f423a2 --- /dev/null +++ b/packages/offline-transactions/src/executor/KeyScheduler.ts @@ -0,0 +1,123 @@ +import { withSyncSpan } from "../telemetry/tracer" +import type { OfflineTransaction } from "../types" + +export class KeyScheduler { + private pendingTransactions: Array = [] + private isRunning = false + + schedule(transaction: OfflineTransaction): void { + withSyncSpan( + `scheduler.schedule`, + { + "transaction.id": transaction.id, + queueLength: this.pendingTransactions.length, + }, + () => { + this.pendingTransactions.push(transaction) + // Sort by creation time to maintain FIFO order + this.pendingTransactions.sort( + (a, b) => a.createdAt.getTime() - b.createdAt.getTime() + ) + } + ) + } + + getNextBatch(_maxConcurrency: number): Array { + return withSyncSpan( + `scheduler.getNextBatch`, + { pendingCount: this.pendingTransactions.length }, + (span) => { + // For sequential processing, we ignore maxConcurrency and only process one transaction at a time + if (this.isRunning || this.pendingTransactions.length === 0) { + span.setAttribute(`result`, `empty`) + return [] + } + + // Find the first transaction that's ready to run + const readyTransaction = this.pendingTransactions.find((tx) => + this.isReadyToRun(tx) + ) + + if (readyTransaction) { + span.setAttribute(`result`, `found`) + span.setAttribute(`transaction.id`, readyTransaction.id) + } else { + span.setAttribute(`result`, `none_ready`) + } + + return readyTransaction ? [readyTransaction] : [] + } + ) + } + + private isReadyToRun(transaction: OfflineTransaction): boolean { + return Date.now() >= transaction.nextAttemptAt + } + + markStarted(_transaction: OfflineTransaction): void { + this.isRunning = true + } + + markCompleted(transaction: OfflineTransaction): void { + this.removeTransaction(transaction) + this.isRunning = false + } + + markFailed(_transaction: OfflineTransaction): void { + this.isRunning = false + } + + private removeTransaction(transaction: OfflineTransaction): void { + const index = this.pendingTransactions.findIndex( + (tx) => tx.id === transaction.id + ) + if (index >= 0) { + this.pendingTransactions.splice(index, 1) + } + } + + updateTransaction(transaction: OfflineTransaction): void { + const index = this.pendingTransactions.findIndex( + (tx) => tx.id === transaction.id + ) + if (index >= 0) { + this.pendingTransactions[index] = transaction + // Re-sort to maintain FIFO order after update + this.pendingTransactions.sort( + (a, b) => a.createdAt.getTime() - b.createdAt.getTime() + ) + } + } + + getPendingCount(): number { + return this.pendingTransactions.length + } + + getRunningCount(): number { + return this.isRunning ? 1 : 0 + } + + clear(): void { + this.pendingTransactions = [] + this.isRunning = false + } + + getAllPendingTransactions(): Array { + return [...this.pendingTransactions] + } + + updateTransactions(updatedTransactions: Array): void { + for (const updatedTx of updatedTransactions) { + const index = this.pendingTransactions.findIndex( + (tx) => tx.id === updatedTx.id + ) + if (index >= 0) { + this.pendingTransactions[index] = updatedTx + } + } + // Re-sort to maintain FIFO order after updates + this.pendingTransactions.sort( + (a, b) => a.createdAt.getTime() - b.createdAt.getTime() + ) + } +} diff --git a/packages/offline-transactions/src/executor/TransactionExecutor.ts b/packages/offline-transactions/src/executor/TransactionExecutor.ts new file mode 100644 index 000000000..5d8cde116 --- /dev/null +++ b/packages/offline-transactions/src/executor/TransactionExecutor.ts @@ -0,0 +1,330 @@ +import { createTraceState } from "@opentelemetry/api" +import { DefaultRetryPolicy } from "../retry/RetryPolicy" +import { NonRetriableError } from "../types" +import { withNestedSpan } from "../telemetry/tracer" +import type { SpanContext } from "@opentelemetry/api" +import type { KeyScheduler } from "./KeyScheduler" +import type { OutboxManager } from "../outbox/OutboxManager" +import type { + OfflineConfig, + OfflineTransaction, + SerializedSpanContext, +} from "../types" + +const HANDLED_EXECUTION_ERROR = Symbol(`HandledExecutionError`) + +function toSpanContext( + serialized?: SerializedSpanContext +): SpanContext | undefined { + if (!serialized) { + return undefined + } + + return { + traceId: serialized.traceId, + spanId: serialized.spanId, + traceFlags: serialized.traceFlags, + traceState: serialized.traceState + ? createTraceState(serialized.traceState) + : undefined, + } +} + +export class TransactionExecutor { + private scheduler: KeyScheduler + private outbox: OutboxManager + private config: OfflineConfig + private retryPolicy: DefaultRetryPolicy + private isExecuting = false + private executionPromise: Promise | null = null + private offlineExecutor: any // Reference to OfflineExecutor for signaling + private retryTimer: ReturnType | null = null + + constructor( + scheduler: KeyScheduler, + outbox: OutboxManager, + config: OfflineConfig, + offlineExecutor: any + ) { + this.scheduler = scheduler + this.outbox = outbox + this.config = config + this.retryPolicy = new DefaultRetryPolicy(10, config.jitter ?? true) + this.offlineExecutor = offlineExecutor + } + + async execute(transaction: OfflineTransaction): Promise { + this.scheduler.schedule(transaction) + await this.executeAll() + } + + async executeAll(): Promise { + if (this.isExecuting) { + return this.executionPromise! + } + + this.isExecuting = true + this.executionPromise = this.runExecution() + + try { + await this.executionPromise + } finally { + this.isExecuting = false + this.executionPromise = null + } + } + + private async runExecution(): Promise { + const maxConcurrency = this.config.maxConcurrency ?? 3 + + while (this.scheduler.getPendingCount() > 0) { + const batch = this.scheduler.getNextBatch(maxConcurrency) + + if (batch.length === 0) { + break + } + + const executions = batch.map((transaction) => + this.executeTransaction(transaction) + ) + await Promise.allSettled(executions) + } + + // Schedule next retry after execution completes + this.scheduleNextRetry() + } + + private async executeTransaction( + transaction: OfflineTransaction + ): Promise { + try { + await withNestedSpan( + `transaction.execute`, + { + "transaction.id": transaction.id, + "transaction.mutationFnName": transaction.mutationFnName, + "transaction.retryCount": transaction.retryCount, + "transaction.keyCount": transaction.keys.length, + }, + async (span) => { + this.scheduler.markStarted(transaction) + + if (transaction.retryCount > 0) { + span.setAttribute(`retry.attempt`, transaction.retryCount) + } + + try { + const result = await this.runMutationFn(transaction) + + this.scheduler.markCompleted(transaction) + await this.outbox.remove(transaction.id) + + span.setAttribute(`result`, `success`) + this.offlineExecutor.resolveTransaction(transaction.id, result) + } catch (error) { + const err = + error instanceof Error ? error : new Error(String(error)) + + span.setAttribute(`result`, `error`) + + await this.handleError(transaction, err) + ;(err as any)[HANDLED_EXECUTION_ERROR] = true + throw err + } + }, + { + parentContext: toSpanContext(transaction.spanContext), + } + ) + } catch (error) { + if ( + error instanceof Error && + (error as any)[HANDLED_EXECUTION_ERROR] === true + ) { + return + } + + throw error + } + } + + private async runMutationFn(transaction: OfflineTransaction): Promise { + const mutationFn = this.config.mutationFns[transaction.mutationFnName] + + if (!mutationFn) { + const errorMessage = `Unknown mutation function: ${transaction.mutationFnName}` + + if (this.config.onUnknownMutationFn) { + this.config.onUnknownMutationFn(transaction.mutationFnName, transaction) + } + + throw new NonRetriableError(errorMessage) + } + + // Mutations are already PendingMutation objects with collections attached + // from the deserializer, so we can use them directly + const transactionWithMutations = { + id: transaction.id, + mutations: transaction.mutations, + metadata: transaction.metadata ?? {}, + } + + await mutationFn({ + transaction: transactionWithMutations as any, + idempotencyKey: transaction.idempotencyKey, + }) + } + + private async handleError( + transaction: OfflineTransaction, + error: Error + ): Promise { + return withNestedSpan( + `transaction.handleError`, + { + "transaction.id": transaction.id, + "error.name": error.name, + "error.message": error.message, + }, + async (span) => { + const shouldRetry = this.retryPolicy.shouldRetry( + error, + transaction.retryCount + ) + + span.setAttribute(`shouldRetry`, shouldRetry) + + if (!shouldRetry) { + this.scheduler.markCompleted(transaction) + await this.outbox.remove(transaction.id) + console.warn( + `Transaction ${transaction.id} failed permanently:`, + error + ) + + span.setAttribute(`result`, `permanent_failure`) + // Signal permanent failure to the waiting transaction + this.offlineExecutor.rejectTransaction(transaction.id, error) + return + } + + const delay = this.retryPolicy.calculateDelay(transaction.retryCount) + const updatedTransaction: OfflineTransaction = { + ...transaction, + retryCount: transaction.retryCount + 1, + nextAttemptAt: Date.now() + delay, + lastError: { + name: error.name, + message: error.message, + stack: error.stack, + }, + } + + span.setAttribute(`retryDelay`, delay) + span.setAttribute(`nextRetryCount`, updatedTransaction.retryCount) + + this.scheduler.markFailed(transaction) + this.scheduler.updateTransaction(updatedTransaction) + + try { + await this.outbox.update(transaction.id, updatedTransaction) + span.setAttribute(`result`, `scheduled_retry`) + } catch (persistError) { + span.recordException(persistError as Error) + span.setAttribute(`result`, `persist_failed`) + throw persistError + } + + // Schedule retry timer + this.scheduleNextRetry() + } + ) + } + + async loadPendingTransactions(): Promise { + const transactions = await this.outbox.getAll() + let filteredTransactions = transactions + + if (this.config.beforeRetry) { + filteredTransactions = this.config.beforeRetry(transactions) + } + + for (const transaction of filteredTransactions) { + this.scheduler.schedule(transaction) + } + + // Reset retry delays for all loaded transactions so they can run immediately + this.resetRetryDelays() + + // Schedule retry timer for loaded transactions + this.scheduleNextRetry() + + const removedTransactions = transactions.filter( + (tx) => !filteredTransactions.some((filtered) => filtered.id === tx.id) + ) + + if (removedTransactions.length > 0) { + await this.outbox.removeMany(removedTransactions.map((tx) => tx.id)) + } + } + + clear(): void { + this.scheduler.clear() + this.clearRetryTimer() + } + + getPendingCount(): number { + return this.scheduler.getPendingCount() + } + + private scheduleNextRetry(): void { + // Clear existing timer + this.clearRetryTimer() + + // Find the earliest retry time among pending transactions + const earliestRetryTime = this.getEarliestRetryTime() + + if (earliestRetryTime === null) { + return // No transactions pending retry + } + + const delay = Math.max(0, earliestRetryTime - Date.now()) + + this.retryTimer = setTimeout(() => { + this.executeAll().catch((error) => { + console.warn(`Failed to execute retry batch:`, error) + }) + }, delay) + } + + private getEarliestRetryTime(): number | null { + const allTransactions = this.scheduler.getAllPendingTransactions() + + if (allTransactions.length === 0) { + return null + } + + return Math.min(...allTransactions.map((tx) => tx.nextAttemptAt)) + } + + private clearRetryTimer(): void { + if (this.retryTimer) { + clearTimeout(this.retryTimer) + this.retryTimer = null + } + } + + getRunningCount(): number { + return this.scheduler.getRunningCount() + } + + resetRetryDelays(): void { + const allTransactions = this.scheduler.getAllPendingTransactions() + const updatedTransactions = allTransactions.map((transaction) => ({ + ...transaction, + nextAttemptAt: Date.now(), + })) + + this.scheduler.updateTransactions(updatedTransactions) + } +} diff --git a/packages/offline-transactions/src/index.ts b/packages/offline-transactions/src/index.ts new file mode 100644 index 000000000..ca76ed259 --- /dev/null +++ b/packages/offline-transactions/src/index.ts @@ -0,0 +1,47 @@ +// Main API +export { OfflineExecutor, startOfflineExecutor } from "./OfflineExecutor" + +// Types +export type { + OfflineTransaction, + OfflineConfig, + StorageAdapter, + RetryPolicy, + LeaderElection, + OnlineDetector, + CreateOfflineTransactionOptions, + CreateOfflineActionOptions, + SerializedError, + SerializedMutation, +} from "./types" + +export { NonRetriableError } from "./types" + +// Storage adapters +export { IndexedDBAdapter } from "./storage/IndexedDBAdapter" +export { LocalStorageAdapter } from "./storage/LocalStorageAdapter" + +// Retry policies +export { DefaultRetryPolicy } from "./retry/RetryPolicy" +export { BackoffCalculator } from "./retry/BackoffCalculator" + +// Coordination +export { WebLocksLeader } from "./coordination/WebLocksLeader" +export { BroadcastChannelLeader } from "./coordination/BroadcastChannelLeader" + +// Connectivity +export { DefaultOnlineDetector } from "./connectivity/OnlineDetector" + +// API components +export { OfflineTransaction as OfflineTransactionAPI } from "./api/OfflineTransaction" +export { createOfflineAction } from "./api/OfflineAction" + +// Outbox management +export { OutboxManager } from "./outbox/OutboxManager" +export { TransactionSerializer } from "./outbox/TransactionSerializer" + +// Execution engine +export { KeyScheduler } from "./executor/KeyScheduler" +export { TransactionExecutor } from "./executor/TransactionExecutor" + +// Replay diff --git a/packages/offline-transactions/src/outbox/OutboxManager.ts b/packages/offline-transactions/src/outbox/OutboxManager.ts new file mode 100644 index 000000000..9f99195fc --- /dev/null +++ b/packages/offline-transactions/src/outbox/OutboxManager.ts @@ -0,0 +1,141 @@ +import { withSpan } from "../telemetry/tracer" +import { TransactionSerializer } from "./TransactionSerializer" +import type { OfflineTransaction, StorageAdapter } from "../types" +import type { Collection } from "@tanstack/db" + +export class OutboxManager { + private storage: StorageAdapter + private serializer: TransactionSerializer + private keyPrefix = `tx:` + + constructor( + storage: StorageAdapter, + collections: Record + ) { + this.storage = storage + this.serializer = new TransactionSerializer(collections) + } + + private getStorageKey(id: string): string { + return `${this.keyPrefix}${id}` + } + + async add(transaction: OfflineTransaction): Promise { + return withSpan( + `outbox.add`, + { + "transaction.id": transaction.id, + "transaction.mutationFnName": transaction.mutationFnName, + "transaction.keyCount": transaction.keys.length, + }, + async () => { + const key = this.getStorageKey(transaction.id) + const serialized = this.serializer.serialize(transaction) + await this.storage.set(key, serialized) + } + ) + } + + async get(id: string): Promise { + return withSpan(`outbox.get`, { "transaction.id": id }, async (span) => { + const key = this.getStorageKey(id) + const data = await this.storage.get(key) + + if (!data) { + span.setAttribute(`result`, `not_found`) + return null + } + + try { + const transaction = this.serializer.deserialize(data) + span.setAttribute(`result`, `found`) + return transaction + } catch (error) { + console.warn(`Failed to deserialize transaction ${id}:`, error) + span.setAttribute(`result`, `deserialize_error`) + return null + } + }) + } + + async getAll(): Promise> { + return withSpan(`outbox.getAll`, {}, async (span) => { + const keys = await this.storage.keys() + const transactionKeys = keys.filter((key) => + key.startsWith(this.keyPrefix) + ) + + span.setAttribute(`transactionCount`, transactionKeys.length) + + const transactions: Array = [] + + for (const key of transactionKeys) { + const data = await this.storage.get(key) + if (data) { + try { + const transaction = this.serializer.deserialize(data) + transactions.push(transaction) + } catch (error) { + console.warn( + `Failed to deserialize transaction from key ${key}:`, + error + ) + } + } + } + + return transactions.sort( + (a, b) => a.createdAt.getTime() - b.createdAt.getTime() + ) + }) + } + + async getByKeys(keys: Array): Promise> { + const allTransactions = await this.getAll() + const keySet = new Set(keys) + + return allTransactions.filter((transaction) => + transaction.keys.some((key) => keySet.has(key)) + ) + } + + async update( + id: string, + updates: Partial + ): Promise { + return withSpan(`outbox.update`, { "transaction.id": id }, async () => { + const existing = await this.get(id) + if (!existing) { + throw new Error(`Transaction ${id} not found`) + } + + const updated = { ...existing, ...updates } + await this.add(updated) + }) + } + + async remove(id: string): Promise { + return withSpan(`outbox.remove`, { "transaction.id": id }, async () => { + const key = this.getStorageKey(id) + await this.storage.delete(key) + }) + } + + async removeMany(ids: Array): Promise { + return withSpan(`outbox.removeMany`, { count: ids.length }, async () => { + await Promise.all(ids.map((id) => this.remove(id))) + }) + } + + async clear(): Promise { + const keys = await this.storage.keys() + const transactionKeys = keys.filter((key) => key.startsWith(this.keyPrefix)) + + await Promise.all(transactionKeys.map((key) => this.storage.delete(key))) + } + + async count(): Promise { + const keys = await this.storage.keys() + return keys.filter((key) => key.startsWith(this.keyPrefix)).length + } +} diff --git a/packages/offline-transactions/src/outbox/TransactionSerializer.ts b/packages/offline-transactions/src/outbox/TransactionSerializer.ts new file mode 100644 index 000000000..f2a19bd7d --- /dev/null +++ b/packages/offline-transactions/src/outbox/TransactionSerializer.ts @@ -0,0 +1,163 @@ +import type { + OfflineTransaction, + SerializedError, + SerializedMutation, + SerializedOfflineTransaction, +} from "../types" +import type { Collection, PendingMutation } from "@tanstack/db" + +export class TransactionSerializer { + private collections: Record + private collectionIdToKey: Map + + constructor(collections: Record) { + this.collections = collections + // Create reverse lookup from collection.id to registry key + this.collectionIdToKey = new Map() + for (const [key, collection] of Object.entries(collections)) { + this.collectionIdToKey.set(collection.id, key) + } + } + + serialize(transaction: OfflineTransaction): string { + const serialized: SerializedOfflineTransaction = { + ...transaction, + createdAt: transaction.createdAt, + mutations: transaction.mutations.map((mutation) => + this.serializeMutation(mutation) + ), + } + // Convert the whole object to JSON, handling dates + return JSON.stringify(serialized, (key, value) => { + if (value instanceof Date) { + return value.toISOString() + } + return value + }) + } + + deserialize(data: string): OfflineTransaction { + const parsed: SerializedOfflineTransaction = JSON.parse( + data, + (key, value) => { + // Parse ISO date strings back to Date objects + if ( + typeof value === `string` && + /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value) + ) { + return new Date(value) + } + return value + } + ) + + return { + ...parsed, + mutations: parsed.mutations.map((mutationData) => + this.deserializeMutation(mutationData) + ), + } + } + + private serializeMutation(mutation: PendingMutation): SerializedMutation { + const registryKey = this.collectionIdToKey.get(mutation.collection.id) + if (!registryKey) { + throw new Error( + `Collection with id ${mutation.collection.id} not found in registry` + ) + } + + return { + globalKey: mutation.globalKey, + type: mutation.type, + modified: this.serializeValue(mutation.modified), + original: this.serializeValue(mutation.original), + collectionId: registryKey, // Store registry key instead of collection.id + } + } + + private deserializeMutation(data: SerializedMutation): PendingMutation { + const collection = this.collections[data.collectionId] + if (!collection) { + throw new Error(`Collection with id ${data.collectionId} not found`) + } + + // Create a partial PendingMutation - we can't fully reconstruct it but + // we provide what we can. The executor will need to handle the rest. + return { + globalKey: data.globalKey, + type: data.type as any, + modified: this.deserializeValue(data.modified), + original: this.deserializeValue(data.original), + collection, + // These fields would need to be reconstructed by the executor + mutationId: ``, // Will be regenerated + key: null, // Will be extracted from the data + changes: {}, // Will be recalculated + metadata: undefined, + syncMetadata: {}, + optimistic: true, + createdAt: new Date(), + updatedAt: new Date(), + } as PendingMutation + } + + private serializeValue(value: any): any { + if (value === null || value === undefined) { + return value + } + + if (value instanceof Date) { + return { __type: `Date`, value: value.toISOString() } + } + + if (typeof value === `object`) { + const result: any = Array.isArray(value) ? [] : {} + for (const key in value) { + if (value.hasOwnProperty(key)) { + result[key] = this.serializeValue(value[key]) + } + } + return result + } + + return value + } + + private deserializeValue(value: any): any { + if (value === null || value === undefined) { + return value + } + + if (typeof value === `object` && value.__type === `Date`) { + return new Date(value.value) + } + + if (typeof value === `object`) { + const result: any = Array.isArray(value) ? [] : {} + for (const key in value) { + if (value.hasOwnProperty(key)) { + result[key] = this.deserializeValue(value[key]) + } + } + return result + } + + return value + } + + serializeError(error: Error): SerializedError { + return { + name: error.name, + message: error.message, + stack: error.stack, + } + } + + deserializeError(data: SerializedError): Error { + const error = new Error(data.message) + error.name = data.name + error.stack = data.stack + return error + } +} diff --git a/packages/offline-transactions/src/retry/BackoffCalculator.ts b/packages/offline-transactions/src/retry/BackoffCalculator.ts new file mode 100644 index 000000000..be2236278 --- /dev/null +++ b/packages/offline-transactions/src/retry/BackoffCalculator.ts @@ -0,0 +1,13 @@ +export class BackoffCalculator { + private jitter: boolean + + constructor(jitter = true) { + this.jitter = jitter + } + + calculate(retryCount: number): number { + const baseDelay = Math.min(1000 * Math.pow(2, retryCount), 60000) + const jitterMultiplier = this.jitter ? Math.random() * 0.3 : 0 + return Math.floor(baseDelay * (1 + jitterMultiplier)) + } +} diff --git a/packages/offline-transactions/src/retry/NonRetriableError.ts b/packages/offline-transactions/src/retry/NonRetriableError.ts new file mode 100644 index 000000000..04253277c --- /dev/null +++ b/packages/offline-transactions/src/retry/NonRetriableError.ts @@ -0,0 +1 @@ +export { NonRetriableError } from "../types" diff --git a/packages/offline-transactions/src/retry/RetryPolicy.ts b/packages/offline-transactions/src/retry/RetryPolicy.ts new file mode 100644 index 000000000..1730db8c4 --- /dev/null +++ b/packages/offline-transactions/src/retry/RetryPolicy.ts @@ -0,0 +1,41 @@ +import { NonRetriableError } from "../types" +import { BackoffCalculator } from "./BackoffCalculator" +import type { RetryPolicy } from "../types" + +export class DefaultRetryPolicy implements RetryPolicy { + private backoffCalculator: BackoffCalculator + private maxRetries: number + + constructor(maxRetries = 10, jitter = true) { + this.backoffCalculator = new BackoffCalculator(jitter) + this.maxRetries = maxRetries + } + + calculateDelay(retryCount: number): number { + return this.backoffCalculator.calculate(retryCount) + } + + shouldRetry(error: Error, retryCount: number): boolean { + if (retryCount >= this.maxRetries) { + return false + } + + if (error instanceof NonRetriableError) { + return false + } + + if (error.name === `AbortError`) { + return false + } + + if (error.message.includes(`401`) || error.message.includes(`403`)) { + return false + } + + if (error.message.includes(`422`) || error.message.includes(`400`)) { + return false + } + + return true + } +} diff --git a/packages/offline-transactions/src/storage/IndexedDBAdapter.ts b/packages/offline-transactions/src/storage/IndexedDBAdapter.ts new file mode 100644 index 000000000..027ac4f11 --- /dev/null +++ b/packages/offline-transactions/src/storage/IndexedDBAdapter.ts @@ -0,0 +1,119 @@ +import { BaseStorageAdapter } from "./StorageAdapter" + +export class IndexedDBAdapter extends BaseStorageAdapter { + private dbName: string + private storeName: string + private db: IDBDatabase | null = null + + constructor(dbName = `offline-transactions`, storeName = `transactions`) { + super() + this.dbName = dbName + this.storeName = storeName + } + + private async openDB(): Promise { + if (this.db) { + return this.db + } + + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, 1) + + request.onerror = () => reject(request.error) + request.onsuccess = () => { + this.db = request.result + resolve(this.db) + } + + request.onupgradeneeded = (event) => { + const db = (event.target as IDBOpenDBRequest).result + if (!db.objectStoreNames.contains(this.storeName)) { + db.createObjectStore(this.storeName) + } + } + }) + } + + private async getStore( + mode: IDBTransactionMode = `readonly` + ): Promise { + const db = await this.openDB() + const transaction = db.transaction([this.storeName], mode) + return transaction.objectStore(this.storeName) + } + + async get(key: string): Promise { + try { + const store = await this.getStore(`readonly`) + return new Promise((resolve, reject) => { + const request = store.get(key) + request.onerror = () => reject(request.error) + request.onsuccess = () => resolve(request.result ?? null) + }) + } catch (error) { + console.warn(`IndexedDB get failed:`, error) + return null + } + } + + async set(key: string, value: string): Promise { + try { + const store = await this.getStore(`readwrite`) + return new Promise((resolve, reject) => { + const request = store.put(value, key) + request.onerror = () => reject(request.error) + request.onsuccess = () => resolve() + }) + } catch (error) { + if ( + error instanceof DOMException && + error.name === `QuotaExceededError` + ) { + throw new Error( + `Storage quota exceeded. Consider clearing old transactions.` + ) + } + throw error + } + } + + async delete(key: string): Promise { + try { + const store = await this.getStore(`readwrite`) + return new Promise((resolve, reject) => { + const request = store.delete(key) + request.onerror = () => reject(request.error) + request.onsuccess = () => resolve() + }) + } catch (error) { + console.warn(`IndexedDB delete failed:`, error) + } + } + + async keys(): Promise> { + try { + const store = await this.getStore(`readonly`) + return new Promise((resolve, reject) => { + const request = store.getAllKeys() + request.onerror = () => reject(request.error) + request.onsuccess = () => resolve(request.result as Array) + }) + } catch (error) { + console.warn(`IndexedDB keys failed:`, error) + return [] + } + } + + async clear(): Promise { + try { + const store = await this.getStore(`readwrite`) + return new Promise((resolve, reject) => { + const request = store.clear() + request.onerror = () => reject(request.error) + request.onsuccess = () => resolve() + }) + } catch (error) { + console.warn(`IndexedDB clear failed:`, error) + } + } +} diff --git a/packages/offline-transactions/src/storage/LocalStorageAdapter.ts b/packages/offline-transactions/src/storage/LocalStorageAdapter.ts new file mode 100644 index 000000000..90daa83ee --- /dev/null +++ b/packages/offline-transactions/src/storage/LocalStorageAdapter.ts @@ -0,0 +1,79 @@ +import { BaseStorageAdapter } from "./StorageAdapter" + +export class LocalStorageAdapter extends BaseStorageAdapter { + private prefix: string + + constructor(prefix = `offline-tx:`) { + super() + this.prefix = prefix + } + + private getKey(key: string): string { + return `${this.prefix}${key}` + } + + get(key: string): Promise { + try { + return Promise.resolve(localStorage.getItem(this.getKey(key))) + } catch (error) { + console.warn(`localStorage get failed:`, error) + return Promise.resolve(null) + } + } + + set(key: string, value: string): Promise { + try { + localStorage.setItem(this.getKey(key), value) + return Promise.resolve() + } catch (error) { + if ( + error instanceof DOMException && + error.name === `QuotaExceededError` + ) { + return Promise.reject( + new Error( + `Storage quota exceeded. Consider clearing old transactions.` + ) + ) + } + return Promise.reject(error) + } + } + + delete(key: string): Promise { + try { + localStorage.removeItem(this.getKey(key)) + return Promise.resolve() + } catch (error) { + console.warn(`localStorage delete failed:`, error) + return Promise.resolve() + } + } + + keys(): Promise> { + try { + const keys: Array = [] + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i) + if (key && key.startsWith(this.prefix)) { + keys.push(key.slice(this.prefix.length)) + } + } + return Promise.resolve(keys) + } catch (error) { + console.warn(`localStorage keys failed:`, error) + return Promise.resolve([]) + } + } + + async clear(): Promise { + try { + const keys = await this.keys() + for (const key of keys) { + localStorage.removeItem(this.getKey(key)) + } + } catch (error) { + console.warn(`localStorage clear failed:`, error) + } + } +} diff --git a/packages/offline-transactions/src/storage/StorageAdapter.ts b/packages/offline-transactions/src/storage/StorageAdapter.ts new file mode 100644 index 000000000..2f63aa4d7 --- /dev/null +++ b/packages/offline-transactions/src/storage/StorageAdapter.ts @@ -0,0 +1,11 @@ +import type { StorageAdapter } from "../types" + +export abstract class BaseStorageAdapter implements StorageAdapter { + abstract get(key: string): Promise + abstract set(key: string, value: string): Promise + abstract delete(key: string): Promise + abstract keys(): Promise> + abstract clear(): Promise +} + +export { type StorageAdapter } diff --git a/packages/offline-transactions/src/telemetry/tracer.ts b/packages/offline-transactions/src/telemetry/tracer.ts new file mode 100644 index 000000000..d12acda2e --- /dev/null +++ b/packages/offline-transactions/src/telemetry/tracer.ts @@ -0,0 +1,151 @@ +import { SpanStatusCode, context, trace } from "@opentelemetry/api" +import type { Span, SpanContext } from "@opentelemetry/api" + +const TRACER = trace.getTracer(`@tanstack/offline-transactions`, `0.0.1`) + +export interface SpanAttrs { + [key: string]: string | number | boolean | undefined +} + +interface WithSpanOptions { + parentContext?: SpanContext +} + +function getParentContext(options?: WithSpanOptions) { + if (options?.parentContext) { + const parentSpan = trace.wrapSpanContext(options.parentContext) + return trace.setSpan(context.active(), parentSpan) + } + + return context.active() +} + +/** + * Lightweight span wrapper with error handling. + * Uses OpenTelemetry API which is no-op when tracing is disabled. + * + * By default, creates spans at the current context level (siblings). + * Use withNestedSpan if you want parent-child relationships. + */ +export async function withSpan( + name: string, + attrs: SpanAttrs, + fn: (span: Span) => Promise, + options?: WithSpanOptions +): Promise { + const parentCtx = getParentContext(options) + const span = TRACER.startSpan(name, undefined, parentCtx) + + // Filter out undefined attributes + const filteredAttrs: Record = {} + for (const [key, value] of Object.entries(attrs)) { + if (value !== undefined) { + filteredAttrs[key] = value + } + } + + span.setAttributes(filteredAttrs) + + try { + const result = await fn(span) + span.setStatus({ code: SpanStatusCode.OK }) + return result + } catch (error) { + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error instanceof Error ? error.message : String(error), + }) + span.recordException(error as Error) + throw error + } finally { + span.end() + } +} + +/** + * Like withSpan but propagates context so child spans nest properly. + * Use this when you want operations inside fn to be child spans. + */ +export async function withNestedSpan( + name: string, + attrs: SpanAttrs, + fn: (span: Span) => Promise, + options?: WithSpanOptions +): Promise { + const parentCtx = getParentContext(options) + const span = TRACER.startSpan(name, undefined, parentCtx) + + // Filter out undefined attributes + const filteredAttrs: Record = {} + for (const [key, value] of Object.entries(attrs)) { + if (value !== undefined) { + filteredAttrs[key] = value + } + } + + span.setAttributes(filteredAttrs) + + // Set the span as active context so child spans nest properly + const ctx = trace.setSpan(parentCtx, span) + + try { + // Execute the function within the span's context + const result = await context.with(ctx, () => fn(span)) + span.setStatus({ code: SpanStatusCode.OK }) + return result + } catch (error) { + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error instanceof Error ? error.message : String(error), + }) + span.recordException(error as Error) + throw error + } finally { + span.end() + } +} + +/** + * Creates a synchronous span for non-async operations + */ +export function withSyncSpan( + name: string, + attrs: SpanAttrs, + fn: (span: Span) => T, + options?: WithSpanOptions +): T { + const parentCtx = getParentContext(options) + const span = TRACER.startSpan(name, undefined, parentCtx) + + // Filter out undefined attributes + const filteredAttrs: Record = {} + for (const [key, value] of Object.entries(attrs)) { + if (value !== undefined) { + filteredAttrs[key] = value + } + } + + span.setAttributes(filteredAttrs) + + try { + const result = fn(span) + span.setStatus({ code: SpanStatusCode.OK }) + return result + } catch (error) { + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error instanceof Error ? error.message : String(error), + }) + span.recordException(error as Error) + throw error + } finally { + span.end() + } +} + +/** + * Get the current tracer instance + */ +export function getTracer() { + return TRACER +} diff --git a/packages/offline-transactions/src/types.ts b/packages/offline-transactions/src/types.ts new file mode 100644 index 000000000..4e58efcd7 --- /dev/null +++ b/packages/offline-transactions/src/types.ts @@ -0,0 +1,133 @@ +import type { + Collection, + MutationFnParams, + PendingMutation, +} from "@tanstack/db" + +// Extended mutation function that includes idempotency key +export type OfflineMutationFnParams< + T extends object = Record, +> = MutationFnParams & { + idempotencyKey: string +} + +export type OfflineMutationFn> = ( + params: OfflineMutationFnParams +) => Promise + +// Simplified mutation structure for serialization +export interface SerializedMutation { + globalKey: string + type: string + modified: any + original: any + collectionId: string +} + +export interface SerializedError { + name: string + message: string + stack?: string +} + +export interface SerializedSpanContext { + traceId: string + spanId: string + traceFlags: number + traceState?: string +} + +// In-memory representation with full PendingMutation objects +export interface OfflineTransaction { + id: string + mutationFnName: string + mutations: Array + keys: Array + idempotencyKey: string + createdAt: Date + retryCount: number + nextAttemptAt: number + lastError?: SerializedError + metadata?: Record + spanContext?: SerializedSpanContext + version: 1 +} + +// Serialized representation for storage +export interface SerializedOfflineTransaction { + id: string + mutationFnName: string + mutations: Array + keys: Array + idempotencyKey: string + createdAt: Date + retryCount: number + nextAttemptAt: number + lastError?: SerializedError + metadata?: Record + spanContext?: SerializedSpanContext + version: 1 +} + +export interface OfflineConfig { + collections: Record + mutationFns: Record + storage?: StorageAdapter + maxConcurrency?: number + jitter?: boolean + beforeRetry?: ( + transactions: Array + ) => Array + onUnknownMutationFn?: (name: string, tx: OfflineTransaction) => void + onLeadershipChange?: (isLeader: boolean) => void + leaderElection?: LeaderElection + otel?: { + endpoint: string + headers?: Record + } +} + +export interface StorageAdapter { + get: (key: string) => Promise + set: (key: string, value: string) => Promise + delete: (key: string) => Promise + keys: () => Promise> + clear: () => Promise +} + +export interface RetryPolicy { + calculateDelay: (retryCount: number) => number + shouldRetry: (error: Error, retryCount: number) => boolean +} + +export interface LeaderElection { + requestLeadership: () => Promise + releaseLeadership: () => void + isLeader: () => boolean + onLeadershipChange: (callback: (isLeader: boolean) => void) => () => void +} + +export interface OnlineDetector { + subscribe: (callback: () => void) => () => void + notifyOnline: () => void +} + +export interface CreateOfflineTransactionOptions { + id?: string + mutationFnName: string + autoCommit?: boolean + idempotencyKey?: string + metadata?: Record +} + +export interface CreateOfflineActionOptions { + mutationFnName: string + onMutate: (variables: T) => void +} + +export class NonRetriableError extends Error { + constructor(message: string) { + super(message) + this.name = `NonRetriableError` + } +} diff --git a/packages/offline-transactions/tests/OfflineExecutor.test.ts b/packages/offline-transactions/tests/OfflineExecutor.test.ts new file mode 100644 index 000000000..da8c8bbb6 --- /dev/null +++ b/packages/offline-transactions/tests/OfflineExecutor.test.ts @@ -0,0 +1,76 @@ +import { beforeEach, describe, expect, it, vi } from "vitest" +import { LocalStorageAdapter, startOfflineExecutor } from "../src/index" +import type { OfflineConfig } from "../src/types" + +describe(`OfflineExecutor`, () => { + let mockCollection: any + let mockMutationFn: any + let config: OfflineConfig + + beforeEach(() => { + mockCollection = { + id: `test-collection`, + insert: vi.fn(), + update: vi.fn(), + delete: vi.fn(), + } + + mockMutationFn = vi.fn().mockResolvedValue(undefined) + + config = { + collections: { + "test-collection": mockCollection, + }, + mutationFns: { + syncData: mockMutationFn, + }, + storage: new LocalStorageAdapter(), + } + }) + + it(`should create an offline executor`, () => { + const executor = startOfflineExecutor(config) + + expect(executor).toBeDefined() + expect(executor.isOfflineEnabled).toBeDefined() + }) + + it(`should create offline transactions`, () => { + const executor = startOfflineExecutor(config) + + const transaction = executor.createOfflineTransaction({ + mutationFnName: `syncData`, + }) + + expect(transaction).toBeDefined() + expect(transaction.id).toBeDefined() + }) + + it(`should create offline actions`, () => { + const executor = startOfflineExecutor(config) + + const action = executor.createOfflineAction({ + mutationFnName: `syncData`, + onMutate: (data: any) => { + mockCollection.insert(data) + }, + }) + + expect(action).toBeDefined() + expect(typeof action).toBe(`function`) + }) + + it(`should return empty outbox initially`, async () => { + const executor = startOfflineExecutor(config) + + const transactions = await executor.peekOutbox() + + expect(transactions).toEqual([]) + }) + + it(`should dispose cleanly`, () => { + const executor = startOfflineExecutor(config) + + expect(() => executor.dispose()).not.toThrow() + }) +}) diff --git a/packages/offline-transactions/tests/harness.ts b/packages/offline-transactions/tests/harness.ts new file mode 100644 index 000000000..dd47153ac --- /dev/null +++ b/packages/offline-transactions/tests/harness.ts @@ -0,0 +1,271 @@ +import { createCollection } from "@tanstack/db" +import { startOfflineExecutor } from "../src/index" +import type { ChangeMessage, Collection, PendingMutation } from "@tanstack/db" +import type { + LeaderElection, + OfflineConfig, + OfflineMutationFnParams, + StorageAdapter, +} from "../src/types" + +export class FakeStorageAdapter implements StorageAdapter { + private store = new Map() + + async get(key: string): Promise { + return Promise.resolve(this.store.has(key) ? this.store.get(key)! : null) + } + + async set(key: string, value: string): Promise { + this.store.set(key, value) + return Promise.resolve() + } + + async delete(key: string): Promise { + this.store.delete(key) + return Promise.resolve() + } + + async keys(): Promise> { + return Promise.resolve(Array.from(this.store.keys())) + } + + async clear(): Promise { + this.store.clear() + return Promise.resolve() + } + + snapshot(): Record { + return Object.fromEntries(this.store.entries()) + } +} + +export interface TestItem { + id: string + value: string + completed: boolean + updatedAt: Date +} + +interface SyncController { + begin: () => void + write: (message: Omit, `key`>) => void + commit: () => void + markReady: () => void +} + +class FakeLeaderElection implements LeaderElection { + private listeners = new Set<(isLeader: boolean) => void>() + private leader = true + + // eslint-disable-next-line + async requestLeadership(): Promise { + this.notify(this.leader) + return this.leader + } + + releaseLeadership(): void { + this.leader = false + this.notify(false) + } + + isLeader(): boolean { + return this.leader + } + + onLeadershipChange(callback: (isLeader: boolean) => void): () => void { + this.listeners.add(callback) + callback(this.leader) + return () => { + this.listeners.delete(callback) + } + } + + setLeader(isLeader: boolean): void { + this.leader = isLeader + this.notify(isLeader) + } + + private notify(isLeader: boolean): void { + for (const listener of this.listeners) { + listener(isLeader) + } + } +} + +type TestMutationFn = ( + params: OfflineMutationFnParams & { attempt: number } +) => Promise + +interface TestOfflineEnvironmentOptions { + mutationFnName?: string + mutationFn?: TestMutationFn + storage?: FakeStorageAdapter + config?: Partial +} + +function createDefaultCollection(): { + collection: Collection + controller: SyncController +} { + let controller!: SyncController + + const collection = createCollection({ + id: `test-items`, + getKey: (item) => item.id, + startSync: true, + sync: { + sync: (params) => { + controller = { + begin: params.begin, + write: params.write, + commit: params.commit, + markReady: params.markReady, + } + params.markReady() + }, + }, + }) + + return { collection, controller } +} + +export function createTestOfflineEnvironment( + options: TestOfflineEnvironmentOptions = {} +): { + executor: ReturnType + storage: FakeStorageAdapter + collection: Collection + mutationFnName: string + mutationCalls: Array + waitForLeader: () => Promise + leader: FakeLeaderElection + serverState: Map + applyMutations: (mutations: Array>) => void +} { + const mutationFnName = options.mutationFnName ?? `syncData` + const storage = options.storage ?? new FakeStorageAdapter() + const mutationCalls: Array = [] + const attemptCounter = new Map() + + const { collection, controller } = createDefaultCollection() + const serverState = new Map() + + const applyMutations = (mutations: Array>) => { + controller.begin() + + for (const mutation of mutations) { + switch (mutation.type) { + case `insert`: { + const value = mutation.modified + serverState.set(value.id, value) + controller.write({ type: `insert`, value }) + break + } + case `update`: { + const value = mutation.modified + serverState.set(value.id, value) + controller.write({ type: `update`, value }) + break + } + case `delete`: { + const original = mutation.original as TestItem | undefined + const fallbackIdFromKey = + (typeof mutation.key === `string` ? mutation.key : undefined) ?? + mutation.globalKey.split(`:`).pop() + const id = original?.id ?? fallbackIdFromKey + + if (!id) { + throw new Error( + `Unable to determine id for delete mutation ${mutation.globalKey}` + ) + } + + const previousValue = serverState.get(id) + serverState.delete(id) + + const emittedValue: TestItem = previousValue ?? { + id, + value: original?.value ?? ``, + completed: original?.completed ?? false, + updatedAt: original?.updatedAt ?? new Date(), + } + + controller.write({ + type: `delete`, + value: emittedValue, + }) + break + } + } + } + + controller.commit() + controller.markReady() + } + + const defaultMutation: TestMutationFn = (params) => { + const mutations = params.transaction.mutations as Array< + PendingMutation + > + + applyMutations(mutations) + + return { ok: true, mutations } + } + + const mutationFn: TestMutationFn = options.mutationFn ?? defaultMutation + + const leader = new FakeLeaderElection() + + const wrappedMutation = async ( + params: OfflineMutationFnParams + ): Promise => { + const currentAttempt = (attemptCounter.get(params.idempotencyKey) ?? 0) + 1 + attemptCounter.set(params.idempotencyKey, currentAttempt) + const extendedParams = { ...params, attempt: currentAttempt } + mutationCalls.push(extendedParams) + return mutationFn(extendedParams) + } + + const config: OfflineConfig = { + collections: { + ...(options.config?.collections ?? {}), + [collection.id]: collection, + }, + mutationFns: { + ...(options.config?.mutationFns ?? {}), + [mutationFnName]: wrappedMutation, + }, + storage, + maxConcurrency: options.config?.maxConcurrency, + jitter: options.config?.jitter, + beforeRetry: options.config?.beforeRetry, + onUnknownMutationFn: options.config?.onUnknownMutationFn, + onLeadershipChange: options.config?.onLeadershipChange, + leaderElection: options.config?.leaderElection ?? leader, + } + + const executor = startOfflineExecutor(config) + + const waitForLeader = async () => { + const start = Date.now() + while (!executor.isOfflineEnabled) { + if (Date.now() - start > 1000) { + throw new Error(`Executor did not become leader within timeout`) + } + await new Promise((resolve) => setTimeout(resolve, 10)) + } + } + + return { + executor, + storage, + collection, + mutationFnName, + mutationCalls, + waitForLeader, + leader, + serverState, + applyMutations, + } +} diff --git a/packages/offline-transactions/tests/offline-e2e.test.ts b/packages/offline-transactions/tests/offline-e2e.test.ts new file mode 100644 index 000000000..57277d7bc --- /dev/null +++ b/packages/offline-transactions/tests/offline-e2e.test.ts @@ -0,0 +1,443 @@ +import { describe, expect, it } from "vitest" +import { NonRetriableError } from "../src/types" +import { FakeStorageAdapter, createTestOfflineEnvironment } from "./harness" +import type { TestItem } from "./harness" +import type { OfflineMutationFnParams } from "../src/types" +import type { PendingMutation } from "@tanstack/db" + +const flushMicrotasks = () => new Promise((resolve) => setTimeout(resolve, 0)) + +const waitUntil = async ( + predicate: () => boolean | Promise, + timeoutMs = 5000, + intervalMs = 20 +) => { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + if (await predicate()) { + return + } + await new Promise((resolve) => setTimeout(resolve, intervalMs)) + } + throw new Error(`Timed out waiting for condition`) +} + +describe(`offline executor end-to-end`, () => { + it(`resolves waiting promises for successful transactions`, async () => { + const env = createTestOfflineEnvironment() + + await env.waitForLeader() + + const offlineTx = env.executor.createOfflineTransaction({ + mutationFnName: env.mutationFnName, + autoCommit: false, + }) + + const waitPromise = env.executor.waitForTransactionCompletion(offlineTx.id) + + const now = new Date() + offlineTx.mutate(() => { + env.collection.insert({ + id: `item-1`, + value: `hello`, + completed: false, + updatedAt: now, + }) + }) + + await offlineTx.commit() + + await expect(waitPromise).resolves.toBeUndefined() + + const outboxEntries = await env.executor.peekOutbox() + expect(outboxEntries).toEqual([]) + + expect(env.mutationCalls.length).toBeGreaterThanOrEqual(1) + const call = env.mutationCalls[env.mutationCalls.length - 1]! + expect(call.transaction.mutations).toHaveLength(1) + expect(call.transaction.mutations[0].key).toBe(`item-1`) + const stored = env.collection.get(`item-1`) + expect(stored?.value).toBe(`hello`) + expect(env.serverState.get(`item-1`)?.value).toBe(`hello`) + + env.executor.dispose() + }) + + it(`retries queued transactions when backend resumes`, async () => { + let online = false + const env = createTestOfflineEnvironment({ + mutationFn: (params) => { + const runtimeOnline = online + const mutations = params.transaction.mutations as Array< + PendingMutation + > + if (!runtimeOnline) { + throw new Error(`offline`) + } + env.applyMutations(mutations) + return { ok: true, mutations } + }, + }) + + await env.waitForLeader() + + const offlineTx = env.executor.createOfflineTransaction({ + mutationFnName: env.mutationFnName, + autoCommit: false, + }) + + const now = new Date() + offlineTx.mutate(() => { + env.collection.insert({ + id: `queued-item`, + value: `queued`, + completed: false, + updatedAt: now, + }) + }) + + // Commit should not throw for retriable errors - it persists to outbox + const commitPromise = offlineTx.commit() + + // Wait a bit for the transaction to be processed + await flushMicrotasks() + + // Check that the transaction was attempted once + expect(env.mutationCalls.length).toBe(1) + + // Check that the transaction is in the outbox (persisted for retry) + let outboxEntries = await env.executor.peekOutbox() + expect(outboxEntries.length).toBe(1) + expect(outboxEntries[0].id).toBe(offlineTx.id) + + // Now bring the system back online + online = true + env.executor.notifyOnline() + + // Wait for the retry to succeed + await waitUntil(() => env.mutationCalls.length >= 2) + + // The original commit promise should now resolve + await expect(commitPromise).resolves.toBeDefined() + + // Check that the transaction completed successfully + outboxEntries = await env.executor.peekOutbox() + expect(outboxEntries).toEqual([]) + + outboxEntries = await env.executor.peekOutbox() + expect(outboxEntries).toEqual([]) + expect(env.mutationCalls.length).toBeGreaterThanOrEqual(2) + expect(env.serverState.get(`queued-item`)?.value).toBe(`queued`) + + env.executor.dispose() + }) + + it(`rejects waiting promises for permanent failures and rolls back optimistic state`, async () => { + const error = new NonRetriableError(`permanent`) + const env = createTestOfflineEnvironment({ + mutationFn: () => { + throw error + }, + }) + + await env.waitForLeader() + + const offlineTx = env.executor.createOfflineTransaction({ + mutationFnName: env.mutationFnName, + autoCommit: false, + }) + + const waitPromise = env.executor.waitForTransactionCompletion(offlineTx.id) + + offlineTx.mutate(() => { + env.collection.insert({ + id: `perm-item`, + value: `nope`, + completed: false, + updatedAt: new Date(), + }) + }) + + await expect(offlineTx.commit()).rejects.toThrow(`permanent`) + await expect(waitPromise).rejects.toThrow(`permanent`) + + const outboxEntries = await env.executor.peekOutbox() + expect(outboxEntries).toEqual([]) + expect(env.collection.get(`perm-item`)).toBeUndefined() + expect(env.serverState.get(`perm-item`)).toBeUndefined() + + env.executor.dispose() + }) + + it(`replays persisted transactions on startup`, async () => { + const storage = new FakeStorageAdapter() + + const offlineErrorEnv = createTestOfflineEnvironment({ + storage, + mutationFn: () => { + throw new Error(`offline`) + }, + }) + + await offlineErrorEnv.waitForLeader() + + const offlineTx = offlineErrorEnv.executor.createOfflineTransaction({ + mutationFnName: offlineErrorEnv.mutationFnName, + autoCommit: false, + }) + + offlineTx.mutate(() => { + offlineErrorEnv.collection.insert({ + id: `persisted`, + value: `from-outbox`, + completed: false, + updatedAt: new Date(), + }) + }) + + // Start the commit - it will persist to outbox and keep retrying + // We don't await it because it will never complete (mutation always fails) + offlineTx.commit() + + // Wait for the transaction to be persisted to outbox + await waitUntil(async () => { + const pendingEntries = await offlineErrorEnv.executor.peekOutbox() + return pendingEntries.length === 1 + }, 5000) + + // Verify it's in the outbox + const outboxEntries = await offlineErrorEnv.executor.peekOutbox() + expect(outboxEntries.length).toBe(1) + expect(outboxEntries[0].id).toBe(offlineTx.id) + + offlineErrorEnv.executor.dispose() + + const replayEnv = createTestOfflineEnvironment({ + storage, + mutationFn: (params: OfflineMutationFnParams & { attempt: number }) => { + const mutations = params.transaction.mutations as Array< + PendingMutation + > + replayEnv.applyMutations(mutations) + return { ok: true, mutations } + }, + }) + + await replayEnv.waitForLeader() + await waitUntil(async () => { + const entries = await replayEnv.executor.peekOutbox() + return entries.length === 0 + }) + expect(replayEnv.serverState.get(`persisted`)?.value).toBe(`from-outbox`) + + replayEnv.executor.dispose() + }) + + it(`serializes transactions targeting the same key`, async () => { + const pendingResolvers: Array<() => void> = [] + const env = createTestOfflineEnvironment({ + mutationFn: async (params) => { + const mutations = params.transaction.mutations as Array< + PendingMutation + > + + await new Promise((resolve) => { + pendingResolvers.push(() => { + env.applyMutations(mutations) + resolve() + }) + }) + + return { ok: true, mutations } + }, + }) + + await env.waitForLeader() + + const firstTx = env.executor.createOfflineTransaction({ + mutationFnName: env.mutationFnName, + autoCommit: false, + }) + const waitFirst = env.executor.waitForTransactionCompletion(firstTx.id) + firstTx.mutate(() => { + env.collection.insert({ + id: `shared`, + value: `v1`, + completed: false, + updatedAt: new Date(), + }) + }) + const commitFirst = firstTx.commit() + + await flushMicrotasks() + expect(env.mutationCalls.length).toBe(1) + expect(pendingResolvers.length).toBe(1) + + const secondTx = env.executor.createOfflineTransaction({ + mutationFnName: env.mutationFnName, + autoCommit: false, + }) + const waitSecond = env.executor.waitForTransactionCompletion(secondTx.id) + secondTx.mutate(() => { + env.collection.update(`shared`, (draft) => { + draft.value = `v2` + draft.updatedAt = new Date() + }) + }) + const commitSecond = secondTx.commit() + + await flushMicrotasks() + expect(env.mutationCalls.length).toBe(1) + expect(pendingResolvers.length).toBe(1) + + pendingResolvers.shift()?.() + await commitFirst + await waitFirst + await waitUntil(() => env.mutationCalls.length >= 2) + expect(pendingResolvers.length).toBe(1) + + pendingResolvers.shift()?.() + await commitSecond + await waitSecond + await waitUntil(() => env.serverState.get(`shared`)?.value === `v2`) + + env.executor.dispose() + }) + + it(`processes mutations sequentially regardless of keys`, async () => { + const pendingResolvers: Array<() => void> = [] + // eslint-disable-next-line prefer-const + let env: ReturnType | undefined + + const deferredMutation = async ( + params: OfflineMutationFnParams & { attempt: number } + ) => { + const runtimeEnv = env + if (!runtimeEnv) { + throw new Error(`env not initialized`) + } + + const mutations = params.transaction.mutations as Array< + PendingMutation + > + + await new Promise((resolve) => { + pendingResolvers.push(() => { + runtimeEnv.applyMutations(mutations) + resolve() + }) + }) + + return { ok: true, mutations } + } + + env = createTestOfflineEnvironment({ + mutationFn: deferredMutation, + }) + + const runtimeEnv = env + + await runtimeEnv.waitForLeader() + + const firstTx = runtimeEnv.executor.createOfflineTransaction({ + mutationFnName: runtimeEnv.mutationFnName, + autoCommit: false, + }) + const waitFirst = runtimeEnv.executor.waitForTransactionCompletion( + firstTx.id + ) + firstTx.mutate(() => { + runtimeEnv.collection.insert({ + id: `first`, + value: `1`, + completed: false, + updatedAt: new Date(), + }) + }) + const commitFirst = firstTx.commit() + + const secondTx = runtimeEnv.executor.createOfflineTransaction({ + mutationFnName: runtimeEnv.mutationFnName, + autoCommit: false, + }) + const waitSecond = runtimeEnv.executor.waitForTransactionCompletion( + secondTx.id + ) + secondTx.mutate(() => { + runtimeEnv.collection.insert({ + id: `second`, + value: `2`, + completed: false, + updatedAt: new Date(), + }) + }) + const commitSecond = secondTx.commit() + + await flushMicrotasks() + // With sequential processing, only one transaction executes at a time + expect(runtimeEnv.mutationCalls.length).toBe(1) + expect(pendingResolvers.length).toBe(1) + + // Resolve the first transaction + pendingResolvers.shift()?.() + // Wait for the second transaction to start + await waitUntil(() => runtimeEnv.mutationCalls.length >= 2) + expect(pendingResolvers.length).toBe(1) + + // Resolve the second transaction + pendingResolvers.shift()?.() + await Promise.all([commitFirst, commitSecond, waitFirst, waitSecond]) + + expect(runtimeEnv.serverState.get(`first`)?.value).toBe(`1`) + expect(runtimeEnv.serverState.get(`second`)?.value).toBe(`2`) + + runtimeEnv.executor.dispose() + }) + + it(`executes transactions online-only when not leader`, async () => { + const env = createTestOfflineEnvironment() + + // Set this tab to not be leader + env.leader.setLeader(false) + + // Give the executor a moment to react to leadership change + await flushMicrotasks() + + // Should not be offline enabled when not leader + expect(env.executor.isOfflineEnabled).toBe(false) + + const offlineTx = env.executor.createOfflineTransaction({ + mutationFnName: env.mutationFnName, + autoCommit: false, + }) + + const now = new Date() + offlineTx.mutate(() => { + env.collection.insert({ + id: `non-leader-item`, + value: `online-only`, + completed: false, + updatedAt: now, + }) + }) + + // Should execute immediately online without persisting to outbox + await offlineTx.commit() + + // Should have called the mutation function + expect(env.mutationCalls.length).toBe(1) + const call = env.mutationCalls[0]! + expect(call.transaction.mutations).toHaveLength(1) + expect(call.transaction.mutations[0].key).toBe(`non-leader-item`) + + // Should have applied to both local and server state + expect(env.collection.get(`non-leader-item`)?.value).toBe(`online-only`) + expect(env.serverState.get(`non-leader-item`)?.value).toBe(`online-only`) + + // Should NOT have persisted to outbox + const outboxEntries = await env.executor.peekOutbox() + expect(outboxEntries).toEqual([]) + + env.executor.dispose() + }) +}) diff --git a/packages/offline-transactions/tests/setup.ts b/packages/offline-transactions/tests/setup.ts new file mode 100644 index 000000000..be67b1894 --- /dev/null +++ b/packages/offline-transactions/tests/setup.ts @@ -0,0 +1,67 @@ +import { vi } from "vitest" + +// Mock browser APIs that might not be available in test environment +Object.defineProperty(global, `crypto`, { + value: { + randomUUID: () => Math.random().toString(36).substring(2, 15), + }, +}) + +Object.defineProperty(global, `navigator`, { + value: { + onLine: true, + locks: { + request: vi.fn().mockResolvedValue(false), + }, + }, +}) + +Object.defineProperty(global, `BroadcastChannel`, { + value: vi.fn().mockImplementation(() => ({ + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + postMessage: vi.fn(), + close: vi.fn(), + })), +}) + +Object.defineProperty(global, `indexedDB`, { + value: { + open: vi.fn().mockReturnValue({ + onerror: null, + onsuccess: null, + onupgradeneeded: null, + result: null, + error: new Error(`IndexedDB not available in test environment`), + }), + }, +}) + +Object.defineProperty(global, `localStorage`, { + value: { + getItem: vi.fn(), + setItem: vi.fn(), + removeItem: vi.fn(), + key: vi.fn(), + length: 0, + }, +}) + +Object.defineProperty(global, `document`, { + value: { + visibilityState: `visible`, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + }, +}) + +Object.defineProperty(global, `window`, { + value: { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + setTimeout: global.setTimeout, + clearTimeout: global.clearTimeout, + setInterval: global.setInterval, + clearInterval: global.clearInterval, + }, +}) diff --git a/packages/offline-transactions/tsconfig.json b/packages/offline-transactions/tsconfig.json new file mode 100644 index 000000000..648131b1e --- /dev/null +++ b/packages/offline-transactions/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "." + }, + "include": ["src/**/*", "tests/**/*", "*.ts"], + "exclude": ["dist", "node_modules"] +} diff --git a/packages/offline-transactions/vite.config.ts b/packages/offline-transactions/vite.config.ts new file mode 100644 index 000000000..c7968f28a --- /dev/null +++ b/packages/offline-transactions/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig, mergeConfig } from "vitest/config" +import { tanstackViteConfig } from "@tanstack/config/vite" +import packageJson from "./package.json" + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: `./tests`, + environment: `jsdom`, + coverage: { enabled: true, provider: `istanbul`, include: [`src/**/*`] }, + typecheck: { enabled: true }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: `./src/index.ts`, + srcDir: `./src`, + }) +) diff --git a/packages/offline-transactions/vitest.config.ts b/packages/offline-transactions/vitest.config.ts new file mode 100644 index 000000000..197dd46ae --- /dev/null +++ b/packages/offline-transactions/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config" + +export default defineConfig({ + test: { + globals: true, + environment: `jsdom`, + setupFiles: [`./tests/setup.ts`], + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee0d19ba2..01b098f65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,64 +4,72 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@tanstack/db': workspace:* + '@tanstack/query-db-collection': workspace:* + '@tanstack/react-db': workspace:* + '@tanstack/offline-transactions': workspace:* + +pnpmfileChecksum: sha256-PWDKLEtYr7WAzwKAKmFednYERF5OFDKcRonW93aOwc8= + importers: .: devDependencies: '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@22.18.8) + version: 2.29.7(@types/node@22.18.6) '@eslint/js': specifier: ^9.36.0 version: 9.36.0 '@stylistic/eslint-plugin': specifier: ^4.4.1 - version: 4.4.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 4.4.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0(encoding@0.1.13) '@tanstack/config': specifier: ^0.20.3 - version: 0.20.3(@types/node@22.18.8)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.20.3(@types/node@22.18.6)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(rollup@4.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.8.0 - version: 6.9.0 + version: 6.8.0 '@types/node': specifier: ^22.18.1 - version: 22.18.8 + version: 22.18.6 '@types/react': specifier: ^19.1.15 - version: 19.1.16 + version: 19.2.0 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.16) + version: 19.1.9(@types/react@19.2.0) '@types/use-sync-external-store': specifier: ^1.5.0 version: 1.5.0 '@typescript-eslint/eslint-plugin': specifier: ^8.45.0 - version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^5.0.3 + version: 5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: specifier: ^9.36.0 - version: 9.36.0(jiti@2.6.0) + version: 9.36.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + version: 10.1.8(eslint@9.36.0(jiti@2.6.1)) eslint-import-resolver-typescript: specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0)) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.5.4 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2) + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.36.0(jiti@2.6.0)) + version: 7.37.5(eslint@9.36.0(jiti@2.6.1)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -70,7 +78,7 @@ importers: version: 27.0.0(postcss@8.5.6) knip: specifier: ^5.64.1 - version: 5.64.1(@types/node@22.18.8)(typescript@5.9.3) + version: 5.64.1(@types/node@22.18.6)(typescript@5.9.2) lint-staged: specifier: ^15.5.2 version: 15.5.2 @@ -97,13 +105,13 @@ importers: version: 0.2.15 typescript: specifier: ^5.9.2 - version: 5.9.3 + version: 5.9.2 vite: - specifier: ^6.3.6 - version: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^7.1.7 + version: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) zod: specifier: ^3.25.76 version: 3.25.76 @@ -146,10 +154,10 @@ importers: devDependencies: '@angular/build': specifier: ^20.3.3 - version: 20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@2.6.0)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.17)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + version: 20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.5.2)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.17)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@angular/cli': specifier: ^20.3.3 - version: 20.3.3(@types/node@24.6.1)(chokidar@4.0.3) + version: 20.3.3(@types/node@24.5.2)(chokidar@4.0.3) '@angular/compiler-cli': specifier: ^20.3.2 version: 20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3) @@ -187,53 +195,144 @@ importers: specifier: ~5.8.2 version: 5.8.3 + examples/react/offline-transactions: + dependencies: + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.56.0 + version: 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': + specifier: ^0.56.0 + version: 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fetch': + specifier: ^0.56.0 + version: 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^1.29.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': + specifier: ^1.29.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.29.0 + version: 1.37.0 + '@tanstack/offline-transactions': + specifier: workspace:* + version: link:../../../packages/offline-transactions + '@tanstack/query-db-collection': + specifier: workspace:* + version: link:../../../packages/query-db-collection + '@tanstack/react-db': + specifier: workspace:* + version: link:../../../packages/react-db + '@tanstack/react-query': + specifier: ^5.89.0 + version: 5.89.0(react@19.1.1) + '@tanstack/react-router': + specifier: ^1.131.47 + version: 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-router-devtools': + specifier: ^1.131.47 + version: 1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.31)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)(tiny-invariant@1.3.3) + '@tanstack/react-start': + specifier: ^1.131.47 + version: 1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(rolldown@1.0.0-beta.38)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + react: + specifier: ^19.0.0 + version: 19.1.1 + react-dom: + specifier: ^19.0.0 + version: 19.1.1(react@19.1.1) + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 + zod: + specifier: ^3.24.2 + version: 3.25.76 + devDependencies: + '@types/node': + specifier: ^22.5.4 + version: 22.18.6 + '@types/react': + specifier: ^19.0.8 + version: 19.1.13 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.1.9(@types/react@19.1.13) + '@vitejs/plugin-react': + specifier: ^5.0.3 + version: 5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.21(postcss@8.5.6) + chokidar: + specifier: ^4.0.3 + version: 4.0.3 + postcss: + specifier: ^8.5.1 + version: 8.5.6 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + typescript: + specifier: ^5.7.2 + version: 5.9.2 + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + examples/react/projects: dependencies: '@tailwindcss/vite': specifier: ^4.1.13 - version: 4.1.13(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.13(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/query-core': specifier: ^5.90.2 version: 5.90.2 '@tanstack/query-db-collection': - specifier: ^0.2.24 + specifier: workspace:* version: link:../../../packages/query-db-collection '@tanstack/react-db': - specifier: ^0.1.25 + specifier: workspace:* version: link:../../../packages/react-db '@tanstack/react-router': specifier: ^1.132.25 - version: 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-router-devtools': specifier: ^1.132.25 - version: 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.27)(@types/node@24.6.1)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + version: 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.31)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/react-router-with-query': specifier: ^1.130.17 - version: 1.130.17(@tanstack/react-query@5.90.2(react@19.1.1))(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.27)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.130.17(@tanstack/react-query@5.89.0(react@19.1.1))(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.31)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-start': specifier: ^1.132.25 - version: 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: ^1.132.25 - version: 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@trpc/client': specifier: ^11.6.0 - version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3) + version: 11.6.0(@trpc/server@11.6.0(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': specifier: ^11.6.0 - version: 11.6.0(typescript@5.9.3) + version: 11.6.0(typescript@5.9.2) better-auth: specifier: ^1.3.23 version: 1.3.24(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9) dotenv: specifier: ^17.2.2 - version: 17.2.3 + version: 17.2.2 drizzle-orm: specifier: ^0.44.5 - version: 0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) + version: 0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) drizzle-zod: specifier: ^0.8.3 - version: 0.8.3(drizzle-orm@0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11) + version: 0.8.3(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11) pg: specifier: ^8.16.3 version: 8.16.3 @@ -248,17 +347,17 @@ importers: version: 4.1.13 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.11 version: 4.1.11 devDependencies: '@eslint/compat': specifier: ^1.4.0 - version: 1.4.0(eslint@9.36.0(jiti@2.6.0)) + version: 1.4.0(eslint@9.36.0(jiti@2.6.1)) '@eslint/js': specifier: ^9.36.0 version: 9.36.0 @@ -267,25 +366,25 @@ importers: version: 10.4.1 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/pg': specifier: ^8.15.5 version: 8.15.5 '@types/react': specifier: ^19.1.15 - version: 19.1.16 + version: 19.2.0 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.16) + version: 19.1.9(@types/react@19.2.0) '@typescript-eslint/eslint-plugin': specifier: ^8.45.0 - version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -294,16 +393,16 @@ importers: version: 0.31.5 eslint: specifier: ^9.36.0 - version: 9.36.0(jiti@2.6.0) + version: 9.36.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + version: 10.1.8(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-prettier: specifier: ^5.5.4 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2) + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.36.0(jiti@2.6.0)) + version: 7.37.5(eslint@9.36.0(jiti@2.6.1)) globals: specifier: ^16.4.0 version: 16.4.0 @@ -318,10 +417,10 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.3 + version: 5.9.2 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -342,10 +441,10 @@ importers: version: link:../../../packages/react-db '@tanstack/react-router': specifier: ^1.132.25 - version: 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-start': specifier: ^1.132.25 - version: 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: workspace:^ version: link:../../../packages/trailbase-db-collection @@ -354,10 +453,10 @@ importers: version: 2.8.5 drizzle-orm: specifier: ^0.44.5 - version: 0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) + version: 0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) drizzle-zod: specifier: ^0.8.3 - version: 0.8.3(drizzle-orm@0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11) + version: 0.8.3(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11) express: specifier: ^4.21.2 version: 4.21.2 @@ -378,7 +477,7 @@ importers: version: 0.7.4 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.11 version: 4.1.11 @@ -388,7 +487,7 @@ importers: version: 9.36.0 '@tailwindcss/vite': specifier: ^4.1.13 - version: 4.1.13(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.13(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -397,43 +496,43 @@ importers: version: 4.17.23 '@types/node': specifier: ^24.5.2 - version: 24.6.1 + version: 24.5.2 '@types/pg': specifier: ^8.15.5 version: 8.15.5 '@types/react': specifier: ^19.1.15 - version: 19.1.16 + version: 19.2.0 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.16) + version: 19.1.9(@types/react@19.2.0) '@typescript-eslint/eslint-plugin': specifier: ^8.45.0 - version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^5.0.3 - version: 5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.0.3(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) concurrently: specifier: ^9.2.1 version: 9.2.1 dotenv: specifier: ^17.2.2 - version: 17.2.3 + version: 17.2.2 drizzle-kit: specifier: ^0.31.5 version: 0.31.5 eslint: specifier: ^9.36.0 - version: 9.36.0(jiti@2.6.0) + version: 9.36.0(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.36.0(jiti@2.6.0)) + version: 5.2.0(eslint@9.36.0(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.22 - version: 0.4.22(eslint@9.36.0(jiti@2.6.0)) + version: 0.4.23(eslint@9.36.0(jiti@2.6.1)) pg: specifier: ^8.16.3 version: 8.16.3 @@ -442,10 +541,10 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.3 + version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) examples/solid/todo: dependencies: @@ -456,17 +555,17 @@ importers: specifier: ^5.90.2 version: 5.90.2 '@tanstack/query-db-collection': - specifier: ^0.2.22 + specifier: workspace:* version: link:../../../packages/query-db-collection '@tanstack/solid-db': specifier: ^0.1.23 version: link:../../../packages/solid-db '@tanstack/solid-router': specifier: ^1.132.25 - version: 1.132.27(solid-js@1.9.9) + version: 1.132.31(solid-js@1.9.9) '@tanstack/solid-start': specifier: ^1.132.25 - version: 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(solid-js@1.9.9)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(solid-js@1.9.9)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/trailbase-db-collection': specifier: ^0.1.23 version: link:../../../packages/trailbase-db-collection @@ -475,10 +574,10 @@ importers: version: 2.8.5 drizzle-orm: specifier: ^0.44.5 - version: 0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) + version: 0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) drizzle-zod: specifier: ^0.8.3 - version: 0.8.3(drizzle-orm@0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@3.25.76) + version: 0.8.3(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11) express: specifier: ^4.21.2 version: 4.21.2 @@ -496,14 +595,14 @@ importers: version: 0.7.4 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) devDependencies: '@eslint/js': specifier: ^9.36.0 version: 9.36.0 '@tailwindcss/vite': specifier: ^4.1.13 - version: 4.1.13(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.13(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/cors': specifier: ^2.8.19 version: 2.8.19 @@ -512,16 +611,16 @@ importers: version: 4.17.23 '@types/node': specifier: ^22.18.1 - version: 22.18.8 + version: 22.18.6 '@types/pg': specifier: ^8.15.5 version: 8.15.5 '@typescript-eslint/eslint-plugin': specifier: ^8.45.0 - version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^8.45.0 - version: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -533,10 +632,10 @@ importers: version: 0.31.5 eslint: specifier: ^9.36.0 - version: 9.36.0(jiti@2.6.0) + version: 9.36.0(jiti@2.6.1) eslint-plugin-solid: specifier: ^0.14.5 - version: 0.14.5(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + version: 0.14.5(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) pg: specifier: ^8.16.3 version: 8.16.3 @@ -545,13 +644,13 @@ importers: version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.3 + version: 5.9.2 vite: - specifier: ^6.3.6 - version: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^7.1.7 + version: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/angular-db: dependencies: @@ -576,7 +675,7 @@ importers: version: 19.2.15(@angular/common@19.2.15(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.15)(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.15(@angular/common@19.2.15(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.15(rxjs@7.8.2)(zone.js@0.15.1))) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) rxjs: specifier: ^7.8.2 version: 7.8.2 @@ -594,11 +693,11 @@ importers: version: link:../db-ivm typescript: specifier: '>=4.7' - version: 5.9.3 + version: 5.9.2 devDependencies: '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) arktype: specifier: ^2.1.22 version: 2.1.22 @@ -616,14 +715,14 @@ importers: version: 1.8.1 typescript: specifier: '>=4.7' - version: 5.9.3 + version: 5.9.2 devDependencies: '@types/debug': specifier: ^4.1.12 version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/electric-db-collection: dependencies: @@ -648,7 +747,29 @@ importers: version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + + packages/offline-transactions: + dependencies: + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@tanstack/db': + specifier: workspace:* + version: link:../db + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.19.17 + eslint: + specifier: ^8.57.0 + version: 8.57.1 + typescript: + specifier: ^5.5.4 + version: 5.9.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/query-db-collection: dependencies: @@ -660,14 +781,14 @@ importers: version: link:../db typescript: specifier: '>=4.7' - version: 5.9.3 + version: 5.9.2 devDependencies: '@tanstack/query-core': specifier: ^5.90.2 version: 5.90.2 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/react-db: dependencies: @@ -683,19 +804,19 @@ importers: version: 1.0.10 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': specifier: ^19.1.15 - version: 19.1.16 + version: 19.2.0 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.16) + version: 19.1.9(@types/react@19.2.0) '@types/use-sync-external-store': specifier: ^1.5.0 version: 1.5.0 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) react: specifier: ^19.1.1 version: 19.1.1 @@ -722,14 +843,14 @@ importers: version: 16.19.1(rxjs@7.8.2)(socks@2.8.7) typescript: specifier: '>=4.7' - version: 5.9.3 + version: 5.9.2 devDependencies: '@types/debug': specifier: ^4.1.12 version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/solid-db: dependencies: @@ -748,7 +869,7 @@ importers: version: 0.8.10(solid-js@1.9.9) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) jsdom: specifier: ^27.0.0 version: 27.0.0(postcss@8.5.6) @@ -757,10 +878,10 @@ importers: version: 1.9.9 vite-plugin-solid: specifier: ^2.11.8 - version: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/svelte-db: dependencies: @@ -770,22 +891,22 @@ importers: devDependencies: '@sveltejs/package': specifier: ^2.5.4 - version: 2.5.4(svelte@5.39.7)(typescript@5.9.3) + version: 2.5.4(svelte@5.39.8)(typescript@5.9.2) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.1 - version: 6.2.1(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 6.2.1(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) publint: specifier: ^0.3.13 version: 0.3.13 svelte: specifier: ^5.39.6 - version: 5.39.7 + version: 5.39.8 svelte-check: specifier: ^4.3.2 - version: 4.3.2(picomatch@4.0.3)(svelte@5.39.7)(typescript@5.9.3) + version: 4.3.2(picomatch@4.0.3)(svelte@5.39.8)(typescript@5.9.2) packages/trailbase-db-collection: dependencies: @@ -806,14 +927,14 @@ importers: version: 0.7.4 typescript: specifier: '>=4.7' - version: 5.9.3 + version: 5.9.2 devDependencies: '@types/debug': specifier: ^4.1.12 version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/vue-db: dependencies: @@ -826,13 +947,13 @@ importers: version: 1.0.10 '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + version: 5.2.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vue: specifier: ^3.5.22 - version: 3.5.22(typescript@5.9.3) + version: 3.5.22(typescript@5.9.2) packages: @@ -1079,11 +1200,11 @@ packages: '@ark/util@0.49.0': resolution: {integrity: sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA==} - '@asamuzakjp/css-color@4.0.5': - resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + '@asamuzakjp/css-color@4.0.4': + resolution: {integrity: sha512-cKjSKvWGmAziQWbCouOsFwb14mp1betm8Y7Fn+yglDMUUu3r9DCbJ9iJbeFDenLMqFbIMC0pQP8K+B8LAxX3OQ==} - '@asamuzakjp/dom-selector@6.5.7': - resolution: {integrity: sha512-cvdTPsi2qC1c22UppvuVmx/PDwuc6+QQkwt9OnwQD6Uotbh//tb2XDF0OoK2V0F4b8d02LIwNp3BieaDMAhIhA==} + '@asamuzakjp/dom-selector@6.5.5': + resolution: {integrity: sha512-kI2MX9pmImjxWT8nxDZY+MuN6r1jJGe7WxizEbsAEPB/zxfW5wYLIiPG1v3UKgEOOP8EsDkp0ZL99oRFAdPM8g==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -1320,6 +1441,10 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1868,10 +1993,18 @@ packages: resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.36.0': resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2117,10 +2250,19 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -2268,6 +2410,9 @@ packages: '@types/node': optional: true + '@ioredis/commands@1.4.0': + resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -2298,6 +2443,9 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -2361,6 +2509,11 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true + '@microsoft/api-extractor-model@7.29.6': resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} @@ -2381,8 +2534,8 @@ packages: resolution: {integrity: sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==} engines: {node: '>=18'} - '@mongodb-js/saslprep@1.3.1': - resolution: {integrity: sha512-6nZrq5kfAz0POWyhljnbWQQJQ5uT8oE2ddX303q1uY0tWsivWKgBDXBBvuFPwOqRRalXJuVO9EjOdVtuhLX0zg==} + '@mongodb-js/saslprep@1.3.0': + resolution: {integrity: sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==} '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} @@ -2526,12 +2679,12 @@ packages: '@napi-rs/wasm-runtime@1.0.5': resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} - '@noble/ciphers@2.0.1': - resolution: {integrity: sha512-xHK3XHPUW8DTAobU+G0XT+/w+JLM7/8k1UFdB5xg/zTFPnFCobhftzw8wl4Lw2aq/Rvir5pxfZV5fEazmeCJ2g==} + '@noble/ciphers@2.0.0': + resolution: {integrity: sha512-j/l6jpnpaIBM87cAYPJzi/6TgqmBv9spkqPyCXvRYsu5uxqh6tPJZDnD85yo8VWqzTuTQPgfv7NgT63u7kbwAQ==} engines: {node: '>= 20.19.0'} - '@noble/hashes@2.0.1': - resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + '@noble/hashes@2.0.0': + resolution: {integrity: sha512-h8VUBlE8R42+XIDO229cgisD287im3kdY6nbNZJFjc6ZvKIXPYXe6Vc/t+kyjFdMFyt5JpapzTsEg8n63w5/lw==} engines: {node: '>= 20.19.0'} '@nodelib/fs.scandir@2.1.5': @@ -2602,6 +2755,112 @@ packages: resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} engines: {node: '>=8.0'} + '@opentelemetry/api-logs@0.56.0': + resolution: {integrity: sha512-Wr39+94UNNG3Ei9nv3pHd4AJ63gq5nSemMRpCd8fPwDL9rN3vK26lzxfH27mw16XzOSO+TpyQwBAMaLxaPWG0g==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@1.29.0': + resolution: {integrity: sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.56.0': + resolution: {integrity: sha512-vqVuJvcwameA0r0cNrRzrZqPLB0otS+95g0XkZdiKOXUo81wYdY6r4kyrwz4nSChqTBEFm0lqi/H2OWGboOa6g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fetch@0.56.0': + resolution: {integrity: sha512-jKlO8hPwId7I9dNyoBQSzSe5+q4j2cDvDHuM2pJUe6MITRKrATe9IqkJRFZ0+vdFG3gO5NMX4yFqNZ/E4zmLYg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.56.0': + resolution: {integrity: sha512-2KkGBKE+FPXU1F0zKww+stnlUxUTlBvLCiWdP63Z9sqXYeNI/ziNzsxAp4LAdUcTQmXjw1IWgvm5CAb/BHy99w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.56.0': + resolution: {integrity: sha512-eURvv0fcmBE+KE1McUeRo+u0n18ZnUeSc7lDlW/dzlqFYasEbsztTK4v0Qf8C4vEY+aMTjPKUxBG0NX2Te3Pmw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.56.0': + resolution: {integrity: sha512-kVkH/W2W7EpgWWpyU5VnnjIdSD7Y7FljQYObAQSKdRcejiwMj2glypZtUdfq1LTJcv4ht0jyTrw1D3CCxssNtQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/resources@1.29.0': + resolution: {integrity: sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.56.0': + resolution: {integrity: sha512-OS0WPBJF++R/cSl+terUjQH5PebloidB1Jbbecgg2rnCmQbTST9xsRes23bLfDQVRvmegmHqDh884h0aRdJyLw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.29.0': + resolution: {integrity: sha512-MkVtuzDjXZaUJSuJlHn6BSXjcQlMvHcsDV7LjY4P6AJeffMa4+kIGDjzsCf6DkAh6Vqlwag5EWEam3KZOX5Drw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.29.0': + resolution: {integrity: sha512-hEOpAYLKXF3wGJpXOtWsxEtqBgde0SCv+w+jvr3/UusR4ll3QrENEGnSl1WDCyRrpqOQ5NCNOvZch9UFVa7MnQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-web@1.29.0': + resolution: {integrity: sha512-PQVtJ76dsZ7HYBSlgZGIuxFtnKXxNbyHzMnRUxww7V2/6V/qtQN+cvNkqwPVffrUfbvClOnejo08NezAE1y+6g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-web@1.30.1': + resolution: {integrity: sha512-AUo2e+1uyTGMB36VlbvBqnCogVzQhpC7dRcVVdCrt+cFHLpFRRJcd45J2obGTgs0XiAwNLyq5bhkW3JF2NZA+A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} + engines: {node: '>=14'} + '@oxc-project/types@0.89.0': resolution: {integrity: sha512-yuo+ECPIW5Q9mSeNmCDC2im33bfKuwW18mwkaHMQh8KakHYDzj4ci/q7wxf2qS3dMlVVCIyrs3kFtH5LmnlYnw==} @@ -2760,6 +3019,12 @@ packages: cpu: [x64] os: [linux] + '@parcel/watcher-wasm@2.5.1': + resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + '@parcel/watcher-win32-arm64@2.5.1': resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} engines: {node: '>= 10.0.0'} @@ -2818,6 +3083,9 @@ packages: '@peculiar/x509@1.14.0': resolution: {integrity: sha512-Yc4PDxN3OrxUPiXgU63c+ZRXKGE8YKF2McTciYhUHFtHVB0KMnjeFSU0qpztGhsp4P0uKix4+J2xEpIEDu8oXg==} + '@petamoriken/float16@3.9.2': + resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2826,6 +3094,15 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -2943,8 +3220,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-beta.35': + resolution: {integrity: sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==} '@rolldown/pluginutils@1.0.0-beta.38': resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} @@ -2952,6 +3229,69 @@ packages: '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} + 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-commonjs@28.0.6': + resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} + 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.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + 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.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + 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@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -2961,113 +3301,118 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.3': - resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==} + '@rollup/rollup-android-arm-eabi@4.52.0': + resolution: {integrity: sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.3': - resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} + '@rollup/rollup-android-arm64@4.52.0': + resolution: {integrity: sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.3': - resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} + '@rollup/rollup-darwin-arm64@4.50.2': + resolution: {integrity: sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.52.0': + resolution: {integrity: sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.3': - resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} + '@rollup/rollup-darwin-x64@4.52.0': + resolution: {integrity: sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.3': - resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} + '@rollup/rollup-freebsd-arm64@4.52.0': + resolution: {integrity: sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.3': - resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} + '@rollup/rollup-freebsd-x64@4.52.0': + resolution: {integrity: sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.3': - resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': + resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.3': - resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} + '@rollup/rollup-linux-arm-musleabihf@4.52.0': + resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.3': - resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} + '@rollup/rollup-linux-arm64-gnu@4.52.0': + resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.3': - resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} + '@rollup/rollup-linux-arm64-musl@4.52.0': + resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.3': - resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} + '@rollup/rollup-linux-loong64-gnu@4.52.0': + resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.3': - resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.0': + resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.3': - resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} + '@rollup/rollup-linux-riscv64-gnu@4.52.0': + resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.3': - resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} + '@rollup/rollup-linux-riscv64-musl@4.52.0': + resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.3': - resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} + '@rollup/rollup-linux-s390x-gnu@4.52.0': + resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.3': - resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} + '@rollup/rollup-linux-x64-gnu@4.52.0': + resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.3': - resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} + '@rollup/rollup-linux-x64-musl@4.52.0': + resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.3': - resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} + '@rollup/rollup-openharmony-arm64@4.52.0': + resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.3': - resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} + '@rollup/rollup-win32-arm64-msvc@4.52.0': + resolution: {integrity: sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.3': - resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} + '@rollup/rollup-win32-ia32-msvc@4.52.0': + resolution: {integrity: sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.3': - resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} + '@rollup/rollup-win32-x64-gnu@4.52.0': + resolution: {integrity: sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.3': - resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} + '@rollup/rollup-win32-x64-msvc@4.52.0': + resolution: {integrity: sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==} cpu: [x64] os: [win32] @@ -3137,6 +3482,14 @@ packages: resolution: {integrity: sha512-Inmfye5opZXe3HI0GaksqBnQiM7glcNySoG6DH1GgkO1Lh9dvuV4XSV9DK02DReUVX39HpcDob9nxHELjECoQw==} engines: {node: '>=20.0.0'} + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -3235,6 +3588,9 @@ packages: '@solidjs/router': optional: true + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -3250,8 +3606,8 @@ packages: peerDependencies: eslint: '>=9.0.0' - '@sveltejs/acorn-typescript@1.0.6': - resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: acorn: ^8.9.0 @@ -3375,8 +3731,14 @@ packages: resolution: {integrity: sha512-RDz7vI1FSkocPda882nhEQoshU5F2bB5hTV/gXtB6krm/LTqMpK18ngvKtI1gbSd2RbsKCFtpJxqag3lvPgzgg==} engines: {node: '>=18'} - '@tanstack/directive-functions-plugin@1.132.21': - resolution: {integrity: sha512-gNUBOtto6FpCtloBISnBK7OH0GJZsEom4L8IHoRdV2td9F9qodHuuewsOeExtNnCQXfL3b5CfCeFNDlREr/urg==} + '@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.132.31': + resolution: {integrity: sha512-u6TaLhTmllnvINZAoc1r7TbZ0H1IgnqGpoN0pUvWrqpKuunAugZO7fwD1TeYApGyB/RmSWarHMMkNbDffvlJvQ==} engines: {node: '>=12'} peerDependencies: vite: '>=6.0.0 || >=7.0.0' @@ -3385,27 +3747,42 @@ packages: resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} engines: {node: '>=18'} - '@tanstack/history@1.132.21': - resolution: {integrity: sha512-5ziPz3YarKU5cBJoEJ4muV8cy+5W4oWdJMqW7qosMrK5fb9Qfm+QWX+kO3emKJMu4YOUofVu3toEuuD3x1zXKw==} + '@tanstack/history@1.131.2': + resolution: {integrity: sha512-cs1WKawpXIe+vSTeiZUuSBy8JFjEuDgdMKZFRLKwQysKo8y2q6Q1HvS74Yw+m5IhOW1nTZooa6rlgdfXcgFAaw==} + engines: {node: '>=12'} + + '@tanstack/history@1.132.31': + resolution: {integrity: sha512-UCHM2uS0t/uSszqPEo+SBSSoQVeQ+LlOWAVBl5SA7+AedeAbKafIPjFn8huZCXNLAYb0WKV2+wETr7lDK9uz7g==} engines: {node: '>=12'} '@tanstack/publish-config@0.2.1': resolution: {integrity: sha512-URVXmXwlZXL75AFyvyOORef1tv2f16dEaFntwLYnBHoKLQMxyWYRzQrnXooxO1xf+GidJuDSZSC6Rc9UX1aK7g==} engines: {node: '>=18'} + '@tanstack/query-core@5.89.0': + resolution: {integrity: sha512-joFV1MuPhSLsKfTzwjmPDrp8ENfZ9N23ymFu07nLfn3JCkSHy0CFgsyhHTJOmWaumC/WiNIKM0EJyduCF/Ih/Q==} + '@tanstack/query-core@5.90.2': resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} - '@tanstack/react-query@5.90.2': - resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} + '@tanstack/react-query@5.89.0': + resolution: {integrity: sha512-SXbtWSTSRXyBOe80mszPxpEbaN4XPRUp/i0EfQK1uyj3KCk/c8FuPJNIRwzOVe/OU3rzxrYtiNabsAmk1l714A==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.132.27': - resolution: {integrity: sha512-qLSRWw281HWg+QZtv3MCx3jIoKzY4t4XciWoLOcHZy9W1BKnFu3epI/jXMMvQ/VW9p0OzF69fQXtTFDx2ODCgA==} + '@tanstack/react-router-devtools@1.131.47': + resolution: {integrity: sha512-lbDUXLvShxC0cjIjzAAUtd+VzLPDJfiEAACykvGnW5dywBD/w20z7Hd8Jx8l/LrYOCI+EY8C6+0UxlnVqF5bdQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.132.27 + '@tanstack/react-router': ^1.131.47 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-router-devtools@1.132.31': + resolution: {integrity: sha512-EiO+t6s1K8igqqtxCO0GLG6KoJgaIsv9JAZMcJV+z/BspElGQwGDBzTtWYcHd9NOP2Yw7OCkAhM8ihwMbzWJNQ==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/react-router': ^1.132.31 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -3419,50 +3796,109 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.132.27': - resolution: {integrity: sha512-fxSm1kxrtl3dQslqqKgYnIbQf7qW4fyWXKQhZYCWBFHO2GT11DWPZTNkTXw5YifOpw2RTmYJBH3C44t1HF95Cw==} + '@tanstack/react-router@1.131.47': + resolution: {integrity: sha512-yS5rUPjCvWRg+CZRnY7irKiNZEhLeIsNlwuhIdnIX2K7jU9gOc7pOIT8JI2Vo6IAhh/Mr+7aILKLPYxwTRnS5A==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-router@1.132.31': + resolution: {integrity: sha512-bgYgffI9TQhi8Zc/I5DMQEO4WOcDNtSll66Eb3/+k3iuI59ovVB/CiVCGjqdT8+2YBBj2x0saRDjsF00vj5+Yg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.131.47': + resolution: {integrity: sha512-+UrOvMMK6nf2x9u5PEW8+shx++DdpuZtxVrxXotgiFlyTuDSjNslRP+inlxgrxAWo1lZAZ5ewwL1PCiK1rA3jg==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.132.27': - resolution: {integrity: sha512-Y7usVckKyxoSvToASs7iA48MDFHwdwWXcnWR3VrF7xE11BQX9FBZMC0zoj+mBEuew6tuRik7s4NOMT7FQQH0HQ==} + '@tanstack/react-start-client@1.132.31': + resolution: {integrity: sha512-yop9TMqLZ2GHLgjw7i5r/jye4PzOgsHMlJYw/wCvwnWiDv3wLDnfdNJaW4YEhaAsUvBvGgje/KuYPiCMhinNjA==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.132.27': - resolution: {integrity: sha512-ZdUQymY33X8B4pcuqEskVljN4TH3J1miJKd6hCsMLcuA4YoYhkUYsEi5JczjKdVSa8E8flXegt/0ACpc0la7rA==} + '@tanstack/react-start-plugin@1.131.47': + resolution: {integrity: sha512-NNXgw/JvEXDPoS43A7dONnuNSYDuN0/JtQMVqsQHiSyu/izsCZ3nOpJ43GjECdbvGyajOAlvRhPQ0JWDUTgHPA==} + engines: {node: '>=12'} + peerDependencies: + '@vitejs/plugin-react': '>=4.3.4' + vite: '>=6.0.0' + + '@tanstack/react-start-server@1.131.47': + resolution: {integrity: sha512-eLrIzEy1DqlrGH7zuucUaID2PLsNeyi3KjcdxWD9Eb9/LfXbRRMqzExKqQrdixg03HhZVbXzmmCJS/rw+HaChw==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-server@1.132.31': + resolution: {integrity: sha512-LYjYaR4SeapahBquP1RYL/kWL/BoFfTdIwGqxMT+ZjPmNST169k1vD1yUrcGiPL28bYL6Sw75lBRylDfQmNNnQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.132.27': - resolution: {integrity: sha512-fVpszyUtF982qhYjo899oCcUFcd2kb3Iu1X2DpoIHhqrOVUqwLzGNSQTTVEOKT6PFX2Q2/7ci3BKN1Awb/rdWw==} + '@tanstack/react-start@1.131.47': + resolution: {integrity: sha512-DrZvRD6gcPVcnV/zExczzhTNfwUhV4eZ9sWcahoI5Lb8xMGNu/Z1gmGxzi5HSLl50lHnDq2uy3aN66cO+YiFpQ==} + engines: {node: '>=12'} + peerDependencies: + '@vitejs/plugin-react': '>=4.3.4' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=6.0.0' + + '@tanstack/react-start@1.132.31': + resolution: {integrity: sha512-dv2XjvVQdFodMqjh7fIcTdYX75IdISpsz5Qd7KoKbmIZbLzRfFH3Tuas8gBB2aWAFTM14pLgx1uQ71Bbp9qDnA==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' vite: '>=7.0.0' + '@tanstack/react-store@0.7.5': + resolution: {integrity: sha512-A+WZtEnHZpvbKXm8qR+xndNKywBLez2KKKKEQc7w0Qs45GvY1LpRI3BTZNmELwEVim8+Apf99iEDH2J+MUIzlQ==} + 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/react-store@0.7.7': resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} 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.132.27': - resolution: {integrity: sha512-mNx+nba7mXc7sJdX+kYH4rSW8f7Jx/+0hPOkX4XAnqiq7I1ng3gGqmGuf4+2BYTG2aD+aTSPExUPczy9VNgRfQ==} + '@tanstack/router-core@1.131.47': + resolution: {integrity: sha512-ixwowt//SLvnuMoInSxSNCJ41J3S53FLgw8tu5MyXftZ9d7cVOnHoAuSOhKNJNyBDTC2JODC3w/4EH3KDMj6ew==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.132.27': - resolution: {integrity: sha512-TE+chd5aSx+tURjIFPhVYNh+hUuKWjoYcP0BYCkcKp3zLN9VfMZh+bKVn1b44jsFUr6gzkbbctBQRZ+Z6oUm6Q==} + '@tanstack/router-core@1.132.31': + resolution: {integrity: sha512-74W+J5N1NuPcuWDwsBAjCgK4ahtIRaB51KdegYrD1AeSNqiV4u8KzOzHKAAZD01UipQApUbpJbzFrHq0XQ9BHw==} + engines: {node: '>=12'} + + '@tanstack/router-devtools-core@1.131.47': + resolution: {integrity: sha512-XKeTfZcy5RmlPUUYkidIeK/KIfjSWo1cFp0P9L+LleclbVa6pkIfjocSHqUiHM5wGlxkbC5EzZfLBqs2xTinuA==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/router-core': ^1.131.47 + csstype: ^3.0.10 + solid-js: '>=1.9.5' + tiny-invariant: ^1.3.3 + peerDependenciesMeta: + csstype: + optional: true + + '@tanstack/router-devtools-core@1.132.31': + resolution: {integrity: sha512-GwymJRm21hkluQMjOkXn+mBNPMyWlpzQut8mqEObh1cnF3zUsYT5YkCFV8ePA0jb/YVdjK/AfCAgSlhyIa09IA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.132.27 + '@tanstack/router-core': ^1.132.31 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -3470,16 +3906,41 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.132.27': - resolution: {integrity: sha512-dlW33RGxgG0mBF8vRqUs5CeId6wOf4qY6GmT2Pv6NgCVtrD7wsMSM1BasIRufNIxRT6FVnE7rztMy9wN7oCaKg==} + '@tanstack/router-generator@1.131.47': + resolution: {integrity: sha512-h0CAwc7s9MuU1awM8hAo/Iqfy33TtMCHuq40Ipq8bWUlElnp2qym0EkWEcQ6geDha1d/rgnu4pexlxEgwmKxbA==} + engines: {node: '>=12'} + + '@tanstack/router-generator@1.132.31': + resolution: {integrity: sha512-6Ys47sBR3jxet3CaqnF/ykV44R8HLQoT5ZbDqi6f2At6TXYe/+VELRSApC+cq1yjVJwp6Ot5Hm6mYWewh69bdQ==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.131.47': + resolution: {integrity: sha512-YWdVzwikSJG6BaqOHPUzBCn5ePOBF8fBmR+hBvYp5GKvVRay99vyAIy5ANYWXbWFcIyR8WFUQrbGBk/ysdEmFA==} engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.131.47 + 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.132.27': - resolution: {integrity: sha512-0mo+jdgO7L5hOPGyrmKtyy20ZUfX4LwN30IXS7mhsaSHbZub+XLS3Ta6mDxNLmOXAJLPI3Gc90yI8jVwhizv5Q==} + '@tanstack/router-plugin@1.132.31': + resolution: {integrity: sha512-5/n6VxA6tFLFyewjl1+Av0Qsxmr/WpnAR2UlccS7ZaYli3bvNPJSZd3dy9EphEAXeSbqvFT29nQ/ox8EmGTonQ==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.132.27 + '@tanstack/react-router': ^1.132.31 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.8 webpack: '>=5.92.0' @@ -3495,34 +3956,42 @@ packages: webpack: optional: true - '@tanstack/router-utils@1.132.21': - resolution: {integrity: sha512-d9MvyhdPaKN78hQOss89bayiv/HR/7FpVHuKTNGEzzYrBWDVIUBd0yMNaBxQBpTg6NuNxtZ01ZJS5VkbedbzJw==} + '@tanstack/router-utils@1.131.2': + resolution: {integrity: sha512-sr3x0d2sx9YIJoVth0QnfEcAcl+39sQYaNQxThtHmRpyeFYNyM2TTH+Ud3TNEnI3bbzmLYEUD+7YqB987GzhDA==} engines: {node: '>=12'} - '@tanstack/server-functions-plugin@1.132.21': - resolution: {integrity: sha512-QV5sHy3yKMzDinWdRCeg/PwIys95myvxVRllopc0ht4WDOewZW/kNYBq8buvJUhgN4adj4YCV+HJsXwW4YrxZQ==} + '@tanstack/router-utils@1.132.31': + resolution: {integrity: sha512-uf8mQ3wV58K8TL5XXBoWhkYxmCV7LLWbbf6AvcxdhnCnBNmXBGlY+T8RdsRnXyI2Iyp2HfHaVZ+8H3CEQedXfw==} engines: {node: '>=12'} - '@tanstack/solid-router@1.132.27': - resolution: {integrity: sha512-d1JfRvl53wJpoOsqStSX5ATCWegSWo7ygrwT+uRvXIebG3fsriGHWkL0u39U515fIYX9Br3PU2iKNk5eShCgtA==} + '@tanstack/server-functions-plugin@1.131.2': + resolution: {integrity: sha512-hWsaSgEZAVyzHg8+IcJWCEtfI9ZSlNELErfLiGHG9XCHEXMegFWsrESsKHlASzJqef9RsuOLDl+1IMPIskwdDw==} engines: {node: '>=12'} - peerDependencies: - solid-js: ^1.9.5 - '@tanstack/solid-start-client@1.132.27': - resolution: {integrity: sha512-z4l3GKornTJGKaxWN3P6Ah0Cz8O8OHwLEArz0aMk4/3qbWbSl9F+U72kdyuAwt9nLHOqPszBwuKLN2pjGaE1kw==} - engines: {node: '>=22.12.0'} + '@tanstack/server-functions-plugin@1.132.31': + resolution: {integrity: sha512-XjkW0cE6bJXswJwncM8DImjqBqNG8v4GSR+ZFuYkmasXs26dNyS5cucMU4+egS3YC0sNyksCBdD35XrnGlRWLQ==} + engines: {node: '>=12'} + + '@tanstack/solid-router@1.132.31': + resolution: {integrity: sha512-XcNA++HIOZdKndlfKQc+snOlV6eZ27vjFbWEZbOd9etM4uETRf6fqf6WH3cB956cN2Z+hEs8/ozbUM98r8WUhw==} + engines: {node: '>=12'} + peerDependencies: + solid-js: ^1.9.5 + + '@tanstack/solid-start-client@1.132.31': + resolution: {integrity: sha512-8sxR0nff2SSaR4vNugBW00XUr4EaYlzFsR0lrI7YBHMBOfN6c0ZwgLYFxJMR9+8qcWrSS4kzIZsEYRsaSfGQ2g==} + engines: {node: '>=22.12.0'} peerDependencies: solid-js: '>=1.0.0' - '@tanstack/solid-start-server@1.132.27': - resolution: {integrity: sha512-O6gMoSB8pYKR5egw9GOI4zcvUwORgYh/iBOlFfRmSNupdJeTLKNxeb4KEmH7C+YI6qNoWtVlV0aiSO1bG8FKkg==} + '@tanstack/solid-start-server@1.132.31': + resolution: {integrity: sha512-PBgsW3By8E0/TyniMnymOcMgwt2Za+G7UTPH61rzD59AE0Jy/jZ8ZY/rzNq9v1LRCfSJMe2LXblOE+CK2/B3Jw==} engines: {node: '>=22.12.0'} peerDependencies: solid-js: ^1.0.0 - '@tanstack/solid-start@1.132.27': - resolution: {integrity: sha512-Z+xXtamLQCNxHI2xM3fXs31nW03wmxhGN+P2BpdZSeQ+6XtSTaYeZXAKdfpmQ4Yfzp5miWQXoN1w1rGGNU9Qjw==} + '@tanstack/solid-start@1.132.31': + resolution: {integrity: sha512-SsJq3gq6xzh98AyogRTIKFWsQK9f3aq3jiVM9PVx7W3a7RslgGLE6opIQkK6jRJ77qCnNwIrguqrj34zAOm6yA==} engines: {node: '>=22.12.0'} peerDependencies: solid-js: '>=1.0.0' @@ -3533,27 +4002,60 @@ packages: peerDependencies: solid-js: ^1.6.0 - '@tanstack/start-client-core@1.132.27': - resolution: {integrity: sha512-YUqsdFT6YlYwXKO72ghvRBCzvX5OLdhW/KBP/rMVKcEzSbS/CEPbhds2ljmNQkKkCxsb/imJHsvdflM0waMrHA==} + '@tanstack/start-client-core@1.131.47': + resolution: {integrity: sha512-48pFszyEmO9RxA+MqGGL50/Eyase+nha4e3JOaYpVhHPUzybOWurURz2zF5OG6/DAQxQztUPOn0nHUS9qUXOxg==} + engines: {node: '>=12'} + + '@tanstack/start-client-core@1.132.31': + resolution: {integrity: sha512-Zf2f2uUFr5bN8+AGp4pG8lws1tqkANjzjcKzsLGi+uyoe4R9+SavjlDLtqmRLkUqDFZvkVEDNumwCVMxKPeVBw==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.132.27': - resolution: {integrity: sha512-LxvOzFAiKRCHJ2+ebelByVc9fyAg+CLYue3V2IP4HNyjwLAvKHsbt+ljgs+gxJDPgvR/3KgEoqIzDWeMF5mumg==} + '@tanstack/start-plugin-core@1.131.47': + resolution: {integrity: sha512-X5k2JGNvh6blOlkYcFVDL2OE7UIDXvBodx2uir87woqhJlQnq5YNnbe/avrhSmXCuzkPEG4yw7wDe8o4gjdzww==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + + '@tanstack/start-plugin-core@1.132.31': + resolution: {integrity: sha512-JyRI0AgNDoY14KZeNLBj1gdX0uKdvY1bt0bBoZjDt8i7LEf5KKt0uA9s4To9KKHR8V0KORO9cNyrgNwxp7hwhg==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.132.27': - resolution: {integrity: sha512-BIBFpmAqECur+5mbG6ZcGjlg93q4qpkwiwRDUmpiBRRWQxG4IYprjQ8ajzCar1yqedB1tqEhRpbkaBNnLIu+oQ==} + '@tanstack/start-server-core@1.131.47': + resolution: {integrity: sha512-VxTmJUiVAlKhlse58SWzx4ZqDZR8QTzoKp75woupoA+e1+c7T+odchhEyD4XSDT6GV9ssI6Eoy+bg+ZF45a2ig==} + engines: {node: '>=12'} + + '@tanstack/start-server-core@1.132.31': + resolution: {integrity: sha512-Lujmr1mPRrXsXYgEbaOj5kxRYW6QKhma7w9/+7IoQxl8QTVHtIZ+b40BAt18rDZDn9c1M+fp7MGYmCTGDCMtOw==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.132.27': - resolution: {integrity: sha512-4WomOGK7KPsnwoMXWT/bxNGRiaoyryEOm1ho44AsbRRD4IjpB+U5vWtT2Sho9grHMjlm4iaOrbklxKfeGhVqGg==} + '@tanstack/start-server-functions-client@1.131.47': + resolution: {integrity: sha512-xKuP8TTRSDBptC0uWtCkFQtBNi0dqdL/dUNbZZdjOBQczBZChBpyNP48a/wMfSTL4eE7rGidKOoiIkD+BqHrOQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-fetcher@1.131.47': + resolution: {integrity: sha512-bHaetA5YJuCYDg5Qphkr5M4zn5ohe80Ih9DcN4m7AJrsB8GOnaSJrzyrU63BsT/xYpHOtrXRKfLTQlvBkZwDhQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-server@1.131.2': + resolution: {integrity: sha512-u67d6XspczlC/dYki/Id28oWsTjkZMJhDqO4E23U3rHs8eYgxvMBHKqdeqWgOyC+QWT9k6ze1pJmbv+rmc3wOQ==} + engines: {node: '>=12'} + + '@tanstack/start-storage-context@1.131.47': + resolution: {integrity: sha512-7ZPgCnUdLGnkoWSwHTc8l0T4aZ4a5/B3QPR6QVfbinwik+1HqGqFHKcq1/aTYISS0xJoH8reoB53x8ueVK1tHw==} + engines: {node: '>=12'} + + '@tanstack/start-storage-context@1.132.31': + resolution: {integrity: sha512-CH+/SI+lHijZZw6P1VnOeoKDeUVzVZ1Wmhx4QrH8UYQNkTARFdkWOuLDItevDs91BrgtywV/N+Vs4YsOnNnjYw==} engines: {node: '>=22.12.0'} '@tanstack/store@0.7.0': resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} + '@tanstack/store@0.7.5': + resolution: {integrity: sha512-qd/OjkjaFRKqKU4Yjipaen/EOB9MyEg6Wr9fW103RBPACf1ZcKhbhcu2S5mj5IgdPib6xFIgCUti/mKVkl+fRw==} + '@tanstack/store@0.7.7': resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} @@ -3561,8 +4063,12 @@ packages: resolution: {integrity: sha512-3miLBNiyWX54bQKBNnh7Fj6otWX8ZDiU6/ffOsNnikwBdKjFkA7ddrBtC5/JQkLCE6CBIqcJvtNIwI+DZu4y1Q==} engines: {node: '>=18'} - '@tanstack/virtual-file-routes@1.132.21': - resolution: {integrity: sha512-+eT+vxZnf2/QPr9ci5aPn7i3MnVyWYNG2DUqiKJXGi7EvuFrXV9r8zDK40QfUTNGdCg9F880YOVe3cTwMCO0zw==} + '@tanstack/virtual-file-routes@1.131.2': + resolution: {integrity: sha512-VEEOxc4mvyu67O+Bl0APtYjwcNRcL9it9B4HKbNgcBTIOEalhk+ufBl4kiqc8WP1sx1+NAaiS+3CcJBhrqaSRg==} + engines: {node: '>=12'} + + '@tanstack/virtual-file-routes@1.132.31': + resolution: {integrity: sha512-rxS8Cm2nIXroLqkm9pE/8X2lFNuvcTIIiFi5VH4PwzvKscAuaW3YRMN1WmaGDI2mVEn+GLaoY6Kc3jOczL5i4w==} engines: {node: '>=12'} '@tanstack/vite-config@0.3.0': @@ -3573,8 +4079,8 @@ packages: resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.9.0': - resolution: {integrity: sha512-QHdxYMJ0YPGKYofMc6zYvo7LOViVhdc6nPg/OtM2cf9MQrwEcTxFCs7d/GJ5eSyPkHzOiBkc/KfLdFJBHzldtQ==} + '@testing-library/jest-dom@6.8.0': + resolution: {integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/react@16.3.0': @@ -3620,6 +4126,9 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__code-frame@7.0.6': + resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3698,11 +4207,14 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.18.8': - resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + '@types/node@20.19.17': + resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} - '@types/node@24.6.1': - resolution: {integrity: sha512-ljvjjs3DNXummeIaooB4cLBKg2U6SPI6Hjra/9rRIy7CpM0HpLtG9HptkMKAb4HYWy5S7HUvJEuWgr/y0U8SHw==} + '@types/node@22.18.6': + resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} + + '@types/node@24.5.2': + resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} @@ -3718,8 +4230,14 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.16': - resolution: {integrity: sha512-WBM/nDbEZmDUORKnh5i1bTnAz6vTohUf9b8esSMu+b24+srbaxa04UbJgWx78CVfNXA20sNu0odEIluZDFdCog==} + '@types/react@19.1.13': + resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} + + '@types/react@19.2.0': + resolution: {integrity: sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} @@ -3727,6 +4245,9 @@ packages: '@types/serve-static@1.15.8': resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/simple-peer@9.11.8': resolution: {integrity: sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw==} @@ -3745,6 +4266,14 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@typescript-eslint/eslint-plugin@8.44.0': + resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.44.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/eslint-plugin@8.45.0': resolution: {integrity: sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3753,6 +4282,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.44.0': + resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.45.0': resolution: {integrity: sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3760,22 +4296,51 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.44.0': + resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.45.0': resolution: {integrity: sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.44.0': + resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.45.0': resolution: {integrity: sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.44.0': + resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/tsconfig-utils@8.44.1': + resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.45.0': resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.44.0': + resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.45.0': resolution: {integrity: sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3783,16 +4348,37 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.44.0': + resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.44.1': + resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.45.0': resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.44.0': + resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.45.0': resolution: {integrity: sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.44.0': + resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.45.0': resolution: {integrity: sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3800,10 +4386,17 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.44.0': + resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.45.0': resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -3899,15 +4492,20 @@ packages: cpu: [x64] os: [win32] + '@vercel/nft@0.30.1': + resolution: {integrity: sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g==} + engines: {node: '>=18'} + hasBin: true + '@vitejs/plugin-basic-ssl@2.1.0': resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: vite: ^6.0.0 || ^7.0.0 - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@5.0.3': + resolution: {integrity: sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3967,9 +4565,15 @@ packages: '@volar/typescript@2.4.23': resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + '@vue/compiler-core@3.5.21': + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} + '@vue/compiler-core@3.5.22': resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + '@vue/compiler-dom@3.5.21': + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} + '@vue/compiler-dom@3.5.22': resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} @@ -4004,6 +4608,9 @@ packages: peerDependencies: vue: 3.5.22 + '@vue/shared@3.5.21': + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + '@vue/shared@3.5.22': resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} @@ -4018,6 +4625,10 @@ packages: 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'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -4026,6 +4637,11 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + 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: @@ -4076,8 +4692,8 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@7.1.1: - resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} + ansi-escapes@7.1.0: + resolution: {integrity: sha512-YdhtCd19sKRKfAAUsrcC1wzm4JuzJoiX4pOJqIoW2qmKj5WzG/dL8uUJ0361zaXtHqK7gEhOwtAtz7t3Yq3X5g==} engines: {node: '>=18'} ansi-regex@5.0.1: @@ -4100,8 +4716,8 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@4.2.0: - resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} engines: {node: '>=14'} any-promise@1.3.0: @@ -4111,6 +4727,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==} @@ -4190,6 +4814,12 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -4205,6 +4835,14 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.7.1: + resolution: {integrity: sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-dead-code-elimination@1.0.10: resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} @@ -4225,6 +4863,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.7.0: + resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -4232,8 +4873,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.9: - resolution: {integrity: sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==} + baseline-browser-mapping@2.8.6: + resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} hasBin: true beasties@0.3.5: @@ -4287,6 +4928,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4320,6 +4964,10 @@ packages: resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} engines: {node: '>=16.20.1'} + 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==} @@ -4330,6 +4978,14 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.3.0: + resolution: {integrity: sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -4358,8 +5014,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001746: - resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} @@ -4407,6 +5063,12 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -4423,6 +5085,10 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -4438,6 +5104,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -4456,6 +5126,9 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + 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'} @@ -4468,12 +5141,22 @@ 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==} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + compatx@0.2.0: + resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + computeds@0.0.1: resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} @@ -4488,10 +5171,17 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + connect@3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -4519,6 +5209,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} @@ -4537,10 +5230,30 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + 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@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} + engines: {node: '>=18.0'} + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -4549,6 +5262,9 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} @@ -4614,6 +5330,29 @@ packages: resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} engines: {node: '>=4.0'} + db0@0.3.2: + resolution: {integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==} + 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 + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -4668,6 +5407,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -4675,6 +5418,10 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + 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'} @@ -4683,6 +5430,9 @@ 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} @@ -4696,8 +5446,8 @@ packages: engines: {node: '>=0.10'} hasBin: true - detect-libc@2.1.1: - resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} dexie@4.0.10: @@ -4724,6 +5474,10 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -4750,12 +5504,16 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + dotenv@17.2.2: + resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} engines: {node: '>=12'} drizzle-kit@0.31.5: @@ -4864,14 +5622,17 @@ 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.228: - resolution: {integrity: sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==} + electron-to-chromium@1.5.221: + resolution: {integrity: sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ==} emoji-regex@10.5.0: resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} @@ -4931,6 +5692,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -4941,6 +5706,9 @@ packages: err-code@3.0.1: resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -5007,6 +5775,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} @@ -5086,8 +5858,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.22: - resolution: {integrity: sha512-atkAG6QaJMGoTLc4MDAP+rqZcfwQuTIh2IqHWFLy2TEjxr0MOK+5BSG4RzL2564AAPpZkDRsZXAUz68kjnU6Ug==} + eslint-plugin-react-refresh@0.4.23: + resolution: {integrity: sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==} peerDependencies: eslint: '>=8.40' @@ -5104,6 +5876,10 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 typescript: '>=4.8.4' + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5116,6 +5892,12 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + eslint@9.36.0: resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5133,6 +5915,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -5171,12 +5957,20 @@ packages: resolution: {integrity: sha512-Vi6aIiAmakzx81JAwhw8L988aSX5a3ZqqVjHyZa9xFU6P4oT1IotoDreWtjNlS+fvEnASvyIQT565nmkOtns/Q==} engines: {node: '>=16'} + 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==} eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -5229,6 +6023,9 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + 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'} @@ -5264,10 +6061,17 @@ packages: fetchdts@0.1.7: resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: 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'} @@ -5295,6 +6099,10 @@ packages: firebase@11.10.0: resolution: {integrity: sha512-nKBXoDzF0DrXTBQJlZa+sbC5By99ysYU1D6PkMRYknm0nCW7rJly47q492Ht7Ndz5MeYSBuboKuhS1e6mFC03w==} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -5377,16 +6185,17 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gel@2.1.1: + resolution: {integrity: sha512-Newg9X7mRYskoBjSw70l1YnJ/ZGbq64VPyR821H5WVkTGpHG2O0mQILxCeUhxdYERLFY9B4tUyKLyf3uMTjtKw==} + engines: {node: '>= 18.0.0'} + hasBin: true + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} generate-object-property@1.2.0: resolution: {integrity: sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==} - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -5410,6 +6219,9 @@ packages: 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'} @@ -5429,6 +6241,10 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5448,6 +6264,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -5468,6 +6288,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -5496,6 +6320,16 @@ packages: resolution: {integrity: sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==} engines: {node: '>= 10.x'} + 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.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + h3@2.0.0-beta.4: resolution: {integrity: sha512-/JdwHUGuHjbBXAVxQN7T7QeI9cVlhsqMKVNFHebZVs9RoEYH85Ogh9O1DEy/1ZiJkmMwa1gNg6bBcGhc1Itjdg==} engines: {node: '>=20.11.1'} @@ -5536,6 +6370,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@8.1.0: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} @@ -5582,10 +6419,17 @@ packages: 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.1.7: + resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -5636,6 +6480,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@1.14.4: + resolution: {integrity: sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -5670,6 +6517,10 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + ioredis@5.7.0: + resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} + engines: {node: '>=12.22.0'} + ip-address@10.0.1: resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} @@ -5678,6 +6529,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} @@ -5721,6 +6575,16 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -5741,8 +6605,8 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -5753,6 +6617,11 @@ packages: resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} engines: {node: '>=8'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} @@ -5761,6 +6630,9 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-my-ip-valid@1.0.1: resolution: {integrity: sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==} @@ -5783,6 +6655,10 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -5792,6 +6668,9 @@ packages: is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} @@ -5811,6 +6690,10 @@ packages: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} 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} @@ -5863,6 +6746,21 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + 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==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -5870,6 +6768,10 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} + isbot@5.1.30: + resolution: {integrity: sha512-3wVJEonAns1OETX83uWsk5IAne2S5zfDcntD2hbtU23LelSqNXzXs9zKjMPOLMzroCgIjCfjYAEHrd2D6FOkiA==} + engines: {node: '>=18'} + isbot@5.1.31: resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} engines: {node: '>=18'} @@ -5931,8 +6833,12 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.6.0: - resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true jju@1.4.0: @@ -6056,6 +6962,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + knip@5.64.1: resolution: {integrity: sha512-80XnLsyeXuyxj1F4+NBtQFHxaRH0xWRw8EKwfQ6EkVZZ0bSz/kqqan08k/Qg8ajWsFPhFq+0S2RbLCBGIQtuOg==} engines: {node: '>=18.18.0'} @@ -6064,6 +6974,9 @@ packages: '@types/node': '>=18' typescript: '>=5.0.4 <7' + knitwork@1.2.0: + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + known-css-properties@0.30.0: resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} @@ -6074,6 +6987,10 @@ packages: resolution: {integrity: sha512-u/cAuTL4DRIiO2/g4vNGRgklEKNIj5Q3CG7RoUB5DV5SfEC2hMvPxKi0GWPmnzwL2ryIeud2VTcEEmqzTzEPNw==} engines: {node: '>=20.0.0'} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -6157,6 +7074,10 @@ packages: engines: {node: '>=18.12.0'} hasBin: true + listhen@1.9.0: + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + hasBin: true + listr2@8.3.3: resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} @@ -6173,6 +7094,10 @@ packages: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -6187,10 +7112,16 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. @@ -6226,11 +7157,14 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6353,6 +7287,16 @@ packages: engines: {node: '>=4.0.0'} 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@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -6378,6 +7322,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -6421,8 +7369,8 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - minizlib@3.1.0: - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} mitt@3.0.1: @@ -6437,9 +7385,17 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mongodb-connection-string-url@3.0.2: resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} @@ -6533,16 +7489,32 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + nitropack@2.12.6: + resolution: {integrity: sha512-DEq31s0SP4/Z5DIoVBRo9DbWFPWwIoYD4cQMEz7eE+iJMiAP+1k9A3B9kcc6Ihc0jDJmfUcHYyh6h2XlynCx6g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + nkeys.js@1.1.0: resolution: {integrity: sha512-tB/a0shZL5UZWSwsoeyqfTszONTt4k2YS0tuQioMOD180+MbombYVgzDUYHlx+gejYK6rgf08n/2Df99WY0Sxg==} engines: {node: '>=10.0.0'} + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + 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} @@ -6552,15 +7524,26 @@ packages: encoding: optional: true + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-gyp@11.4.2: resolution: {integrity: sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} + node-releases@2.0.21: resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} @@ -6597,8 +7580,8 @@ packages: resolution: {integrity: sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==} engines: {node: ^20.17.0 || >=22.9.0} - npm-packlist@10.0.2: - resolution: {integrity: sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==} + npm-packlist@10.0.1: + resolution: {integrity: sha512-vaC03b2PqJA6QqmwHi1jNU8fAPXEnnyv4j/W4PVfgm24C4/zZGSVut3z0YUeN0WIFCo1oGOL02+6LbvFK7JL4Q==} engines: {node: ^20.17.0 || >=22.9.0} npm-pick-manifest@10.0.0: @@ -6620,7 +7603,12 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-assign@4.1.1: + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6656,6 +7644,15 @@ packages: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} + ofetch@1.4.1: + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + + ohash@1.1.6: + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -6675,6 +7672,10 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -6780,6 +7781,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -6820,6 +7824,13 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -6827,6 +7838,9 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + pg-cloudflare@1.2.7: resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} @@ -6900,6 +7914,9 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -6986,6 +8003,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@7.0.1: + resolution: {integrity: sha512-285/jRCYIbMGDciDdrw0KPNC4LKEEwz/bwErcYNxSJOi4CpGUuLpb9gQpg3XJP0XYj9ldSRluXxih4lX2YN8Xw==} + 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} @@ -6994,6 +8015,13 @@ packages: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} + 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-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} @@ -7053,6 +8081,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -7068,6 +8099,9 @@ packages: resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} engines: {node: '>= 0.10'} + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + react-dom@19.1.1: resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} peerDependencies: @@ -7094,10 +8128,20 @@ 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'} @@ -7121,6 +8165,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'} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -7143,6 +8195,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -7196,8 +8252,21 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x - rollup@4.52.3: - resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==} + rollup-plugin-visualizer@6.0.3: + resolution: {integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x || ^1.0.0-beta + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup@4.52.0: + resolution: {integrity: sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7234,6 +8303,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -7289,6 +8361,9 @@ packages: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + seroval-plugins@1.3.3: resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} engines: {node: '>=10'} @@ -7299,6 +8374,9 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} + serve-placeholder@2.0.2: + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -7384,6 +8462,9 @@ packages: resolution: {integrity: sha512-ZnwyTnmXoUOPClkOA37JWIyFxCoozMGHmhk/p7XbTREI554XXCnBAn3BMX8UsqkhSzQ9eNQsq4U+jnImEIppsQ==} hasBin: true + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + shx@0.4.0: resolution: {integrity: sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==} engines: {node: '>=18'} @@ -7429,6 +8510,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@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -7441,6 +8526,9 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + smol-toml@1.4.2: resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} engines: {node: '>= 18'} @@ -7515,8 +8603,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - srvx@0.8.9: - resolution: {integrity: sha512-wYc3VLZHRzwYrWJhkEqkhLb31TI0SOkfYZDkUhXdp3NoCnNS0FqajiQszZZjfow/VYEuc6Q5sZh9nM6kPy2NBQ==} + srvx@0.8.7: + resolution: {integrity: sha512-g3+15LlwVOGL2QpoTPZlvRjg+9a5Tx/69CatXjFP6txvhIaW2FmGyzJfb8yft5wyfGddvJmP/Yx+e/uNDMRSLQ==} engines: {node: '>=20.16.0'} hasBin: true @@ -7531,6 +8619,9 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -7558,6 +8649,9 @@ packages: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -7593,6 +8687,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + 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==} @@ -7628,8 +8725,8 @@ packages: resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} engines: {node: '>=14.16'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} style-to-object@1.0.9: resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} @@ -7639,6 +8736,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@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -7659,14 +8760,14 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 typescript: '>=5.0.0' - svelte2tsx@0.7.44: - resolution: {integrity: sha512-opuH+bCboss0/ncxnfAO+qt0IAprxc8OqwuC7otafWeO5CHjJ6UAAwvQmu/+xjpCSarX8pQKydXQuoJmbCDcTg==} + svelte2tsx@0.7.43: + resolution: {integrity: sha512-TtxMuk520th4ZEvUQrhbDAyyQ1I+kc5dZCA4ChOLlbVXZfqenrY45iTH27DpLyx/u4STEz8O3hkGm5goTS8JhQ==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@5.39.7: - resolution: {integrity: sha512-lfeYLzyl4AWqd5ysgIoZ6lsY2D8C151+hF8eOU3Gsq1OqYdn6LJBh5FA1cCSbf9/rxCg5ETta8jhM9acrfELZg==} + svelte@5.39.8: + resolution: {integrity: sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==} engines: {node: '>=18'} symbol-tree@3.2.4: @@ -7676,6 +8777,13 @@ packages: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -7688,12 +8796,15 @@ packages: resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - tar@7.5.1: - resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} temporal-polyfill@0.3.0: @@ -7706,14 +8817,25 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + engines: {node: '>=10'} + hasBin: true + test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -7736,6 +8858,9 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -7847,6 +8972,14 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -7889,8 +9022,8 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x - typescript-eslint@8.45.0: - resolution: {integrity: sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==} + typescript-eslint@8.44.0: + resolution: {integrity: sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -7906,8 +9039,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -7921,6 +9054,9 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -7928,16 +9064,33 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + unctx@2.4.1: + resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.13.0: - resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} + undici-types@7.12.0: + resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} undici@7.16.0: resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + unenv@2.0.0-rc.21: + resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unimport@5.3.0: + resolution: {integrity: sha512-cty7t1DESgm0OPfCy9oyn5u9B5t0tMW6tH6bXTjAGIO3SkJsbg/DXYHjrPrUKqultqbAAoltAfYsuu/FEDocjg==} + engines: {node: '>=18.12.0'} + unique-filename@4.0.0: resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -7961,6 +9114,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-utils@0.3.0: + resolution: {integrity: sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==} + engines: {node: '>=20.19.0'} + unplugin@2.3.10: resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} @@ -7968,12 +9125,88 @@ packages: unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + unstorage@1.17.1: + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} + 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.0.3 || ^7.0.0 + '@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.0.1 + 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.3.11: + resolution: {integrity: sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -8052,46 +9285,6 @@ packages: vite: optional: true - vite@6.3.6: - resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.1.5: resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8316,6 +9509,11 @@ 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 + which@5.0.0: resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -8439,6 +9637,12 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.11: + resolution: {integrity: sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==} + z-schema@6.0.2: resolution: {integrity: sha512-9fQb2ZhpMD0ZQXYw0ll5ya6uLQm3Xtt4DXY2RV3QO1QVI4ihSzSWirlgkDsMgGg4qK0EV4tLOJgRSH2bn0cbIw==} engines: {node: '>=16.0.0'} @@ -8447,6 +9651,10 @@ packages: zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod-to-json-schema@3.24.6: resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: @@ -8584,7 +9792,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular/build@20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.6.1)(chokidar@4.0.3)(jiti@2.6.0)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.17)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)': + '@angular/build@20.3.3(@angular/compiler-cli@20.3.2(@angular/compiler@20.3.2)(typescript@5.8.3))(@angular/compiler@20.3.2)(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.2(@angular/common@20.3.2(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@24.5.2)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(lightningcss@1.30.1)(postcss@8.5.6)(tailwindcss@3.4.17)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.6)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2003.3(chokidar@4.0.3) @@ -8593,8 +9801,8 @@ snapshots: '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.14(@types/node@24.6.1) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.5(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@inquirer/confirm': 5.1.14(@types/node@24.5.2) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.5(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) beasties: 0.3.5 browserslist: 4.26.2 esbuild: 0.25.9 @@ -8614,7 +9822,7 @@ snapshots: tinyglobby: 0.2.14 tslib: 2.8.1 typescript: 5.8.3 - vite: 7.1.5(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.5(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) watchpack: 2.4.4 optionalDependencies: '@angular/core': 20.3.2(@angular/compiler@20.3.2)(rxjs@7.8.2)(zone.js@0.15.1) @@ -8623,7 +9831,7 @@ snapshots: lmdb: 3.4.2 postcss: 8.5.6 tailwindcss: 3.4.17 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - chokidar @@ -8637,13 +9845,13 @@ snapshots: - tsx - yaml - '@angular/cli@20.3.3(@types/node@24.6.1)(chokidar@4.0.3)': + '@angular/cli@20.3.3(@types/node@24.5.2)(chokidar@4.0.3)': dependencies: '@angular-devkit/architect': 0.2003.3(chokidar@4.0.3) '@angular-devkit/core': 20.3.3(chokidar@4.0.3) '@angular-devkit/schematics': 20.3.3(chokidar@4.0.3) - '@inquirer/prompts': 7.8.2(@types/node@24.6.1) - '@listr2/prompt-adapter-inquirer': 3.0.1(@inquirer/prompts@7.8.2(@types/node@24.6.1))(@types/node@24.6.1)(listr2@9.0.1) + '@inquirer/prompts': 7.8.2(@types/node@24.5.2) + '@listr2/prompt-adapter-inquirer': 3.0.1(@inquirer/prompts@7.8.2(@types/node@24.5.2))(@types/node@24.5.2)(listr2@9.0.1) '@modelcontextprotocol/sdk': 1.17.3 '@schematics/angular': 20.3.3(chokidar@4.0.3) '@yarnpkg/lockfile': 1.1.0 @@ -8754,21 +9962,20 @@ snapshots: '@ark/util@0.49.0': {} - '@asamuzakjp/css-color@4.0.5': + '@asamuzakjp/css-color@4.0.4': dependencies: '@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) '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 + lru-cache: 11.2.1 - '@asamuzakjp/dom-selector@6.5.7': + '@asamuzakjp/dom-selector@6.5.5': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.2 '@asamuzakjp/nwsapi@2.3.9': {} @@ -9055,7 +10262,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@22.18.8)': + '@changesets/cli@2.29.7(@types/node@22.18.6)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -9071,7 +10278,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@22.18.8) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.6) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -9177,6 +10384,10 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + '@colors/colors@1.5.0': {} '@commitlint/parse@19.8.1': @@ -9220,7 +10431,7 @@ snapshots: dependencies: '@microsoft/fetch-event-source': 2.0.1 optionalDependencies: - '@rollup/rollup-darwin-arm64': 4.52.3 + '@rollup/rollup-darwin-arm64': 4.50.2 '@emnapi/core@1.5.0': dependencies: @@ -9470,18 +10681,23 @@ snapshots: '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.6.0))': + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.6.1))': dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.4.0(eslint@9.36.0(jiti@2.6.0))': + '@eslint/compat@1.4.0(eslint@9.36.0(jiti@2.6.1))': dependencies: '@eslint/core': 0.16.0 optionalDependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) '@eslint/config-array@0.21.0': dependencies: @@ -9501,6 +10717,20 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 @@ -9515,6 +10745,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.36.0': {} '@eslint/object-schema@2.1.6': {} @@ -9851,7 +11083,7 @@ snapshots: '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.15 - '@types/node': 24.6.1 + '@types/node': 22.18.6 '@grpc/proto-loader@0.7.15': dependencies: @@ -9869,148 +11101,160 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@inquirer/ansi@1.0.0': {} - '@inquirer/checkbox@4.2.4(@types/node@24.6.1)': + '@inquirer/checkbox@4.2.4(@types/node@24.5.2)': dependencies: '@inquirer/ansi': 1.0.0 - '@inquirer/core': 10.2.2(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/type': 3.0.8(@types/node@24.5.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/confirm@5.1.14(@types/node@24.6.1)': + '@inquirer/confirm@5.1.14(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/confirm@5.1.18(@types/node@24.6.1)': + '@inquirer/confirm@5.1.18(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/core@10.2.2(@types/node@24.6.1)': + '@inquirer/core@10.2.2(@types/node@24.5.2)': dependencies: '@inquirer/ansi': 1.0.0 '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/type': 3.0.8(@types/node@24.5.2) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/editor@4.2.20(@types/node@24.6.1)': + '@inquirer/editor@4.2.20(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/external-editor': 1.0.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/external-editor': 1.0.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/expand@4.0.20(@types/node@24.6.1)': + '@inquirer/expand@4.0.20(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/external-editor@1.0.2(@types/node@22.18.8)': + '@inquirer/external-editor@1.0.2(@types/node@22.18.6)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.6 - '@inquirer/external-editor@1.0.2(@types/node@24.6.1)': + '@inquirer/external-editor@1.0.2(@types/node@24.5.2)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.2.4(@types/node@24.6.1)': + '@inquirer/input@4.2.4(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/number@3.0.20(@types/node@24.6.1)': + '@inquirer/number@3.0.20(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/password@4.0.20(@types/node@24.6.1)': + '@inquirer/password@4.0.20(@types/node@24.5.2)': dependencies: '@inquirer/ansi': 1.0.0 - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 - - '@inquirer/prompts@7.8.2(@types/node@24.6.1)': - dependencies: - '@inquirer/checkbox': 4.2.4(@types/node@24.6.1) - '@inquirer/confirm': 5.1.18(@types/node@24.6.1) - '@inquirer/editor': 4.2.20(@types/node@24.6.1) - '@inquirer/expand': 4.0.20(@types/node@24.6.1) - '@inquirer/input': 4.2.4(@types/node@24.6.1) - '@inquirer/number': 3.0.20(@types/node@24.6.1) - '@inquirer/password': 4.0.20(@types/node@24.6.1) - '@inquirer/rawlist': 4.1.8(@types/node@24.6.1) - '@inquirer/search': 3.1.3(@types/node@24.6.1) - '@inquirer/select': 4.3.4(@types/node@24.6.1) + '@types/node': 24.5.2 + + '@inquirer/prompts@7.8.2(@types/node@24.5.2)': + dependencies: + '@inquirer/checkbox': 4.2.4(@types/node@24.5.2) + '@inquirer/confirm': 5.1.18(@types/node@24.5.2) + '@inquirer/editor': 4.2.20(@types/node@24.5.2) + '@inquirer/expand': 4.0.20(@types/node@24.5.2) + '@inquirer/input': 4.2.4(@types/node@24.5.2) + '@inquirer/number': 3.0.20(@types/node@24.5.2) + '@inquirer/password': 4.0.20(@types/node@24.5.2) + '@inquirer/rawlist': 4.1.8(@types/node@24.5.2) + '@inquirer/search': 3.1.3(@types/node@24.5.2) + '@inquirer/select': 4.3.4(@types/node@24.5.2) optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/rawlist@4.1.8(@types/node@24.6.1)': + '@inquirer/rawlist@4.1.8(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/search@3.1.3(@types/node@24.6.1)': + '@inquirer/search@3.1.3(@types/node@24.5.2)': dependencies: - '@inquirer/core': 10.2.2(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/type': 3.0.8(@types/node@24.5.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/select@4.3.4(@types/node@24.6.1)': + '@inquirer/select@4.3.4(@types/node@24.5.2)': dependencies: '@inquirer/ansi': 1.0.0 - '@inquirer/core': 10.2.2(@types/node@24.6.1) + '@inquirer/core': 10.2.2(@types/node@24.5.2) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/type': 3.0.8(@types/node@24.5.2) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 - '@inquirer/type@3.0.8(@types/node@24.6.1)': + '@inquirer/type@3.0.8(@types/node@24.5.2)': optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 + + '@ioredis/commands@1.4.0': {} '@isaacs/balanced-match@4.0.1': {} @@ -10045,6 +11289,11 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -10062,10 +11311,10 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} - '@listr2/prompt-adapter-inquirer@3.0.1(@inquirer/prompts@7.8.2(@types/node@24.6.1))(@types/node@24.6.1)(listr2@9.0.1)': + '@listr2/prompt-adapter-inquirer@3.0.1(@inquirer/prompts@7.8.2(@types/node@24.5.2))(@types/node@24.5.2)(listr2@9.0.1)': dependencies: - '@inquirer/prompts': 7.8.2(@types/node@24.6.1) - '@inquirer/type': 3.0.8(@types/node@24.6.1) + '@inquirer/prompts': 7.8.2(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.5.2) listr2: 9.0.1 transitivePeerDependencies: - '@types/node' @@ -10107,23 +11356,36 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.29.6(@types/node@22.18.8)': + '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.0 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 8.1.0 + semver: 7.7.2 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@microsoft/api-extractor-model@7.29.6(@types/node@22.18.6)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.18.8) + '@rushstack/node-core-library': 5.7.0(@types/node@22.18.6) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@22.18.8)': + '@microsoft/api-extractor@7.47.7(@types/node@22.18.6)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@22.18.8) + '@microsoft/api-extractor-model': 7.29.6(@types/node@22.18.6) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.18.8) + '@rushstack/node-core-library': 5.7.0(@types/node@22.18.6) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@22.18.8) - '@rushstack/ts-command-line': 4.22.6(@types/node@22.18.8) + '@rushstack/terminal': 0.14.0(@types/node@22.18.6) + '@rushstack/ts-command-line': 4.22.6(@types/node@22.18.6) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -10161,7 +11423,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@mongodb-js/saslprep@1.3.1': + '@mongodb-js/saslprep@1.3.0': dependencies: sparse-bitfield: 3.0.3 @@ -10269,9 +11531,9 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@noble/ciphers@2.0.1': {} + '@noble/ciphers@2.0.0': {} - '@noble/hashes@2.0.1': {} + '@noble/hashes@2.0.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -10363,6 +11625,127 @@ snapshots: '@oozcitak/util@8.3.8': {} + '@opentelemetry/api-logs@0.56.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/core@1.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/exporter-trace-otlp-http@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.29.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/instrumentation-fetch@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.56.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.14.4 + require-in-the-middle: 7.5.2 + semver: 7.7.2 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.56.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.56.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.29.0(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + + '@opentelemetry/resources@1.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-logs@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.56.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.29.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@1.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.29.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@1.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-web@1.29.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.29.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-web@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/semantic-conventions@1.28.0': {} + + '@opentelemetry/semantic-conventions@1.37.0': {} + '@oxc-project/types@0.89.0': {} '@oxc-resolver/binding-android-arm-eabi@11.8.4': @@ -10454,6 +11837,11 @@ snapshots: '@parcel/watcher-linux-x64-musl@2.5.1': optional: true + '@parcel/watcher-wasm@2.5.1': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 + '@parcel/watcher-win32-arm64@2.5.1': optional: true @@ -10483,7 +11871,6 @@ snapshots: '@parcel/watcher-win32-arm64': 2.5.1 '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 - optional: true '@peculiar/asn1-android@2.5.0': dependencies: @@ -10581,11 +11968,26 @@ snapshots: tslib: 2.8.1 tsyringe: 4.10.0 + '@petamoriken/float16@3.9.2': + optional: true + '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.2.9': {} + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.1.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.2': {} + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -10655,87 +12057,145 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/pluginutils@1.0.0-beta.35': {} '@rolldown/pluginutils@1.0.0-beta.38': {} '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rollup/pluginutils@5.3.0(rollup@4.52.3)': + '@rollup/plugin-alias@5.1.1(rollup@4.52.0)': + optionalDependencies: + rollup: 4.52.0 + + '@rollup/plugin-commonjs@28.0.6(rollup@4.52.0)': dependencies: - '@types/estree': 1.0.8 + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + commondir: 1.0.1 estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.3 + rollup: 4.52.0 - '@rollup/rollup-android-arm-eabi@4.52.3': - optional: true - - '@rollup/rollup-android-arm64@4.52.3': - optional: true + '@rollup/plugin-inject@5.0.5(rollup@4.52.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + estree-walker: 2.0.2 + magic-string: 0.30.19 + optionalDependencies: + rollup: 4.52.0 - '@rollup/rollup-darwin-arm64@4.52.3': - optional: true + '@rollup/plugin-json@6.1.0(rollup@4.52.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + optionalDependencies: + rollup: 4.52.0 - '@rollup/rollup-darwin-x64@4.52.3': - optional: true + '@rollup/plugin-node-resolve@16.0.1(rollup@4.52.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.52.0 - '@rollup/rollup-freebsd-arm64@4.52.3': - optional: true + '@rollup/plugin-replace@6.0.2(rollup@4.52.0)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + magic-string: 0.30.19 + optionalDependencies: + rollup: 4.52.0 + + '@rollup/plugin-terser@0.4.4(rollup@4.52.0)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.44.0 + optionalDependencies: + rollup: 4.52.0 + + '@rollup/pluginutils@5.3.0(rollup@4.52.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.0 + + '@rollup/rollup-android-arm-eabi@4.52.0': + optional: true + + '@rollup/rollup-android-arm64@4.52.0': + optional: true - '@rollup/rollup-freebsd-x64@4.52.3': + '@rollup/rollup-darwin-arm64@4.50.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + '@rollup/rollup-darwin-arm64@4.52.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.3': + '@rollup/rollup-darwin-x64@4.52.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.3': + '@rollup/rollup-freebsd-arm64@4.52.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.3': + '@rollup/rollup-freebsd-x64@4.52.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.3': + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.3': + '@rollup/rollup-linux-arm-musleabihf@4.52.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.3': + '@rollup/rollup-linux-arm64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.3': + '@rollup/rollup-linux-arm64-musl@4.52.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.3': + '@rollup/rollup-linux-loong64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.3': + '@rollup/rollup-linux-ppc64-gnu@4.52.0': optional: true - '@rollup/rollup-linux-x64-musl@4.52.3': + '@rollup/rollup-linux-riscv64-gnu@4.52.0': optional: true - '@rollup/rollup-openharmony-arm64@4.52.3': + '@rollup/rollup-linux-riscv64-musl@4.52.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.3': + '@rollup/rollup-linux-s390x-gnu@4.52.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.3': + '@rollup/rollup-linux-x64-gnu@4.52.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.3': + '@rollup/rollup-linux-x64-musl@4.52.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.3': + '@rollup/rollup-openharmony-arm64@4.52.0': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@22.18.8)': + '@rollup/rollup-win32-arm64-msvc@4.52.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.0': + optional: true + + '@rushstack/node-core-library@5.7.0(@types/node@22.18.6)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -10746,23 +12206,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.6 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@22.18.8)': + '@rushstack/terminal@0.14.0(@types/node@22.18.6)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.18.8) + '@rushstack/node-core-library': 5.7.0(@types/node@22.18.6) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.6 - '@rushstack/ts-command-line@4.22.6(@types/node@22.18.8)': + '@rushstack/ts-command-line@4.22.6(@types/node@22.18.6)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.18.8) + '@rushstack/terminal': 0.14.0(@types/node@22.18.6) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -10834,6 +12294,10 @@ snapshots: '@peculiar/asn1-x509': 2.5.0 '@peculiar/x509': 1.14.0 + '@sindresorhus/is@7.1.0': {} + + '@sindresorhus/merge-streams@2.3.0': {} + '@socket.io/component-emitter@3.1.2': {} '@solid-devtools/debugger@0.28.1(solid-js@1.9.9)': @@ -10954,12 +12418,14 @@ snapshots: '@testing-library/dom': 10.4.1 solid-js: 1.9.9 + '@speed-highlight/core@1.2.7': {} + '@standard-schema/spec@1.0.0': {} - '@stylistic/eslint-plugin@4.4.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + '@stylistic/eslint-plugin@4.4.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - eslint: 9.36.0(jiti@2.6.0) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -10968,49 +12434,49 @@ snapshots: - supports-color - typescript - '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.6.0))': + '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) - '@typescript-eslint/types': 8.45.0 - eslint: 9.36.0(jiti@2.6.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.1)) + '@typescript-eslint/types': 8.44.1 + eslint: 9.36.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 picomatch: 4.0.3 - '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: acorn: 8.15.0 - '@sveltejs/package@2.5.4(svelte@5.39.7)(typescript@5.9.3)': + '@sveltejs/package@2.5.4(svelte@5.39.8)(typescript@5.9.2)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 semver: 7.7.2 - svelte: 5.39.7 - svelte2tsx: 0.7.44(svelte@5.39.7)(typescript@5.9.3) + svelte: 5.39.8 + svelte2tsx: 0.7.43(svelte@5.39.8)(typescript@5.9.2) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) debug: 4.4.3 - svelte: 5.39.7 - vite: 6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + svelte: 5.39.8 + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.39.7)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(svelte@5.39.8)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) debug: 4.4.3 deepmerge: 4.3.1 magic-string: 0.30.19 - svelte: 5.39.7 - vite: 6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + svelte: 5.39.8 + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -11025,7 +12491,7 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 - jiti: 2.6.0 + jiti: 2.5.1 lightningcss: 1.30.1 magic-string: 0.30.19 source-map-js: 1.2.1 @@ -11069,8 +12535,8 @@ snapshots: '@tailwindcss/oxide@4.1.13': dependencies: - detect-libc: 2.1.1 - tar: 7.5.1 + detect-libc: 2.1.0 + tar: 7.4.3 optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.1.13 '@tailwindcss/oxide-darwin-arm64': 4.1.13 @@ -11085,26 +12551,26 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.13 '@tailwindcss/oxide-win32-x64-msvc': 4.1.13 - '@tailwindcss/vite@4.1.13(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.13(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.13 '@tailwindcss/oxide': 4.1.13 tailwindcss: 4.1.13 - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@tailwindcss/vite@4.1.13(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.13(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.13 '@tailwindcss/oxide': 4.1.13 tailwindcss: 4.1.13 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@tanstack/config@0.20.3(@types/node@22.18.8)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(rollup@4.52.3)(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/config@0.20.3(@types/node@22.18.6)(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(rollup@4.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@tanstack/publish-config': 0.2.1 - '@tanstack/typedoc-config': 0.2.1(typescript@5.9.3) - '@tanstack/vite-config': 0.3.0(@types/node@22.18.8)(rollup@4.52.3)(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/typedoc-config': 0.2.1(typescript@5.9.2) + '@tanstack/vite-config': 0.3.0(@types/node@22.18.6)(rollup@4.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -11115,41 +12581,54 @@ snapshots: - typescript - vite - '@tanstack/directive-functions-plugin@1.132.21(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-utils': 1.131.2 + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@tanstack/directive-functions-plugin@1.132.31(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-utils': 1.132.21 + '@tanstack/router-utils': 1.132.31 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/directive-functions-plugin@1.132.21(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.132.31(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-utils': 1.132.21 + '@tanstack/router-utils': 1.132.31 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@eslint/js': 9.36.0 - '@stylistic/eslint-plugin': 5.4.0(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)) - eslint-plugin-n: 17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.4.0(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1)) + eslint-plugin-n: 17.23.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) globals: 16.4.0 - typescript-eslint: 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.6.0)) + typescript-eslint: 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + vue-eslint-parser: 10.2.0(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint @@ -11157,7 +12636,9 @@ snapshots: - supports-color - typescript - '@tanstack/history@1.132.21': {} + '@tanstack/history@1.131.2': {} + + '@tanstack/history@1.132.31': {} '@tanstack/publish-config@0.2.1': dependencies: @@ -11168,20 +12649,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@tanstack/query-core@5.89.0': {} + '@tanstack/query-core@5.90.2': {} - '@tanstack/react-query@5.90.2(react@19.1.1)': + '@tanstack/react-query@5.89.0(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.90.2 + '@tanstack/query-core': 5.89.0 react: 19.1.1 - '@tanstack/react-router-devtools@1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.27)(@types/node@24.6.1)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.31)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.9)(tiny-invariant@1.3.3)': + dependencies: + '@tanstack/react-router': 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-devtools-core': 1.131.47(@tanstack/router-core@1.132.31)(csstype@3.1.3)(solid-js@1.9.9)(tiny-invariant@1.3.3) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + transitivePeerDependencies: + - '@tanstack/router-core' + - csstype + - solid-js + - tiny-invariant + + '@tanstack/react-router-devtools@1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.31)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-devtools-core': 1.132.27(@tanstack/router-core@1.132.27)(@types/node@24.6.1)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-devtools-core': 1.132.31(@tanstack/router-core@1.132.31)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -11199,60 +12694,180 @@ snapshots: - tsx - yaml - '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.90.2(react@19.1.1))(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.27)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.89.0(react@19.1.1))(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.132.31)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/react-query': 5.89.0(react@19.1.1) + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/react-query': 5.90.2(react@19.1.1) - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-core': 1.132.27 + '@tanstack/history': 1.131.2 + '@tanstack/react-store': 0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.131.47 + isbot: 5.1.30 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 - '@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/history': 1.132.21 + '@tanstack/history': 1.132.31 '@tanstack/react-store': 0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-core': 1.132.27 + '@tanstack/router-core': 1.132.31 isbot: 5.1.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-start-client@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/react-router': 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.131.47 + '@tanstack/start-client-core': 1.131.47 + cookie-es: 1.2.2 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-client@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-core': 1.132.27 - '@tanstack/start-client-core': 1.132.27 + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.31 + '@tanstack/start-client-core': 1.132.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@tanstack/react-start-plugin@1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.38)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tanstack/start-plugin-core': 1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.38)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitejs/plugin-react': 5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + pathe: 2.0.3 + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + zod: 3.25.76 + 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 + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-start-server@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@tanstack/history': 1.132.21 - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-core': 1.132.27 - '@tanstack/start-client-core': 1.132.27 - '@tanstack/start-server-core': 1.132.27 + '@tanstack/history': 1.131.2 + '@tanstack/react-router': 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.131.47 + '@tanstack/start-client-core': 1.131.47 + '@tanstack/start-server-core': 1.131.47 + h3: 1.13.0 + isbot: 5.1.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@tanstack/react-start-server@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-core': 1.132.31 + '@tanstack/start-client-core': 1.132.31 + '@tanstack/start-server-core': 1.132.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/react-start@1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(rolldown@1.0.0-beta.38)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tanstack/react-start-client': 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-start-plugin': 1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.38)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-start-server': 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/start-server-functions-client': 1.131.47(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-functions-server': 1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitejs/plugin-react': 5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + 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 + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-start@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/react-start-client': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/react-start-server': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@tanstack/router-utils': 1.132.21 - '@tanstack/start-client-core': 1.132.27 - '@tanstack/start-plugin-core': 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.27 + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-start-client': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/react-start-server': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@tanstack/router-utils': 1.132.31 + '@tanstack/start-client-core': 1.132.31 + '@tanstack/start-plugin-core': 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.132.31 pathe: 2.0.3 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -11260,6 +12875,13 @@ snapshots: - vite-plugin-solid - webpack + '@tanstack/react-store@0.7.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@tanstack/store': 0.7.5 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + use-sync-external-store: 1.5.0(react@19.1.1) + '@tanstack/react-store@0.7.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/store': 0.7.7 @@ -11267,9 +12889,19 @@ snapshots: react-dom: 19.1.1(react@19.1.1) use-sync-external-store: 1.5.0(react@19.1.1) - '@tanstack/router-core@1.132.27': + '@tanstack/router-core@1.131.47': + dependencies: + '@tanstack/history': 1.131.2 + '@tanstack/store': 0.7.7 + cookie-es: 1.2.2 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-core@1.132.31': dependencies: - '@tanstack/history': 1.132.21 + '@tanstack/history': 1.132.31 '@tanstack/store': 0.7.7 cookie-es: 2.0.0 seroval: 1.3.2 @@ -11277,14 +12909,24 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.132.27(@tanstack/router-core@1.132.27)(@types/node@24.6.1)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.131.47(@tanstack/router-core@1.132.31)(csstype@3.1.3)(solid-js@1.9.9)(tiny-invariant@1.3.3)': + dependencies: + '@tanstack/router-core': 1.132.31 + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.9 + tiny-invariant: 1.3.3 + optionalDependencies: + csstype: 3.1.3 + + '@tanstack/router-devtools-core@1.132.31(@tanstack/router-core@1.132.31)(@types/node@24.5.2)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.132.27 + '@tanstack/router-core': 1.132.31 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.9 tiny-invariant: 1.3.3 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -11300,11 +12942,24 @@ snapshots: - tsx - yaml - '@tanstack/router-generator@1.132.27': + '@tanstack/router-generator@1.131.47': + dependencies: + '@tanstack/router-core': 1.131.47 + '@tanstack/router-utils': 1.131.2 + '@tanstack/virtual-file-routes': 1.131.2 + prettier: 3.6.2 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.20.6 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-generator@1.132.31': dependencies: - '@tanstack/router-core': 1.132.27 - '@tanstack/router-utils': 1.132.21 - '@tanstack/virtual-file-routes': 1.132.21 + '@tanstack/router-core': 1.132.31 + '@tanstack/router-utils': 1.132.31 + '@tanstack/virtual-file-routes': 1.132.31 prettier: 3.6.2 recast: 0.23.11 source-map: 0.7.6 @@ -11313,7 +12968,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-core': 1.131.47 + '@tanstack/router-generator': 1.131.47 + '@tanstack/router-utils': 1.131.2 + '@tanstack/virtual-file-routes': 1.131.2 + babel-dead-code-elimination: 1.0.10 + chokidar: 3.6.0 + unplugin: 2.3.10 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -11321,22 +12999,22 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.27 - '@tanstack/router-generator': 1.132.27 - '@tanstack/router-utils': 1.132.21 - '@tanstack/virtual-file-routes': 1.132.21 + '@tanstack/router-core': 1.132.31 + '@tanstack/router-generator': 1.132.31 + '@tanstack/router-utils': 1.132.31 + '@tanstack/virtual-file-routes': 1.132.31 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -11344,35 +13022,62 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/router-core': 1.132.27 - '@tanstack/router-generator': 1.132.27 - '@tanstack/router-utils': 1.132.21 - '@tanstack/virtual-file-routes': 1.132.21 + '@tanstack/router-core': 1.132.31 + '@tanstack/router-generator': 1.132.31 + '@tanstack/router-utils': 1.132.31 + '@tanstack/virtual-file-routes': 1.132.31 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid: 2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-router': 1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.131.2': + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + ansis: 4.1.0 + diff: 8.0.2 transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.132.21': + '@tanstack/router-utils@1.132.31': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - ansis: 4.2.0 + ansis: 4.1.0 diff: 8.0.2 fast-glob: 3.3.3 pathe: 2.0.3 transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.132.21(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/directive-functions-plugin': 1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/server-functions-plugin@1.132.31(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -11381,14 +13086,14 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.132.21(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.132.31(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/server-functions-plugin@1.132.21(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.132.31(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.4 @@ -11397,58 +13102,58 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - '@tanstack/directive-functions-plugin': 1.132.21(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.132.31(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/solid-router@1.132.27(solid-js@1.9.9)': + '@tanstack/solid-router@1.132.31(solid-js@1.9.9)': dependencies: '@solid-devtools/logger': 0.9.11(solid-js@1.9.9) '@solid-primitives/refs': 1.1.2(solid-js@1.9.9) '@solidjs/meta': 0.29.4(solid-js@1.9.9) - '@tanstack/history': 1.132.21 - '@tanstack/router-core': 1.132.27 + '@tanstack/history': 1.132.31 + '@tanstack/router-core': 1.132.31 '@tanstack/solid-store': 0.7.0(solid-js@1.9.9) isbot: 5.1.31 solid-js: 1.9.9 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/solid-start-client@1.132.27(solid-js@1.9.9)': + '@tanstack/solid-start-client@1.132.31(solid-js@1.9.9)': dependencies: - '@tanstack/router-core': 1.132.27 - '@tanstack/solid-router': 1.132.27(solid-js@1.9.9) - '@tanstack/start-client-core': 1.132.27 + '@tanstack/router-core': 1.132.31 + '@tanstack/solid-router': 1.132.31(solid-js@1.9.9) + '@tanstack/start-client-core': 1.132.31 solid-js: 1.9.9 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/solid-start-server@1.132.27(solid-js@1.9.9)': + '@tanstack/solid-start-server@1.132.31(solid-js@1.9.9)': dependencies: '@solidjs/meta': 0.29.4(solid-js@1.9.9) - '@tanstack/history': 1.132.21 - '@tanstack/router-core': 1.132.27 - '@tanstack/solid-router': 1.132.27(solid-js@1.9.9) - '@tanstack/start-client-core': 1.132.27 - '@tanstack/start-server-core': 1.132.27 + '@tanstack/history': 1.132.31 + '@tanstack/router-core': 1.132.31 + '@tanstack/solid-router': 1.132.31(solid-js@1.9.9) + '@tanstack/start-client-core': 1.132.31 + '@tanstack/start-server-core': 1.132.31 solid-js: 1.9.9 transitivePeerDependencies: - crossws - '@tanstack/solid-start@1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(solid-js@1.9.9)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/solid-start@1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(solid-js@1.9.9)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/solid-router': 1.132.27(solid-js@1.9.9) - '@tanstack/solid-start-client': 1.132.27(solid-js@1.9.9) - '@tanstack/solid-start-server': 1.132.27(solid-js@1.9.9) - '@tanstack/start-client-core': 1.132.27 - '@tanstack/start-plugin-core': 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.27 + '@tanstack/solid-router': 1.132.31(solid-js@1.9.9) + '@tanstack/solid-start-client': 1.132.31(solid-js@1.9.9) + '@tanstack/solid-start-server': 1.132.31(solid-js@1.9.9) + '@tanstack/start-client-core': 1.132.31 + '@tanstack/start-plugin-core': 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.132.31 pathe: 2.0.3 solid-js: 1.9.9 - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - '@tanstack/react-router' @@ -11462,35 +13167,100 @@ snapshots: '@tanstack/store': 0.7.0 solid-js: 1.9.9 - '@tanstack/start-client-core@1.132.27': + '@tanstack/start-client-core@1.131.47': + dependencies: + '@tanstack/router-core': 1.131.47 + '@tanstack/start-storage-context': 1.131.47 + cookie-es: 1.2.2 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/start-client-core@1.132.31': dependencies: - '@tanstack/router-core': 1.132.27 - '@tanstack/start-storage-context': 1.132.27 + '@tanstack/router-core': 1.132.31 + '@tanstack/start-storage-context': 1.132.31 seroval: 1.3.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.38)(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-core': 1.131.47 + '@tanstack/router-generator': 1.131.47 + '@tanstack/router-plugin': 1.131.47(@tanstack/react-router@1.131.47(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.131.2 + '@tanstack/server-functions-plugin': 1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.131.47 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + babel-dead-code-elimination: 1.0.10 + cheerio: 1.1.2 + h3: 1.13.0 + nitropack: 2.12.6(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.38) + pathe: 2.0.3 + ufo: 1.6.1 + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + xmlbuilder2: 3.1.1 + zod: 3.25.76 + 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 + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/start-plugin-core@1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 '@babel/types': 7.28.4 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.132.27 - '@tanstack/router-generator': 1.132.27 - '@tanstack/router-plugin': 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/router-utils': 1.132.21 - '@tanstack/server-functions-plugin': 1.132.21(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.27 + '@tanstack/router-core': 1.132.31 + '@tanstack/router-generator': 1.132.31 + '@tanstack/router-plugin': 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.132.31 + '@tanstack/server-functions-plugin': 1.132.31(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.132.31 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 pathe: 2.0.3 - srvx: 0.8.9 + srvx: 0.8.7 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -11501,27 +13271,27 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.4 '@babel/types': 7.28.4 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.132.27 - '@tanstack/router-generator': 1.132.27 - '@tanstack/router-plugin': 1.132.27(@tanstack/react-router@1.132.27(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/router-utils': 1.132.21 - '@tanstack/server-functions-plugin': 1.132.21(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.132.27 + '@tanstack/router-core': 1.132.31 + '@tanstack/router-generator': 1.132.31 + '@tanstack/router-plugin': 1.132.31(@tanstack/react-router@1.132.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.132.31 + '@tanstack/server-functions-plugin': 1.132.31(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.132.31 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 pathe: 2.0.3 - srvx: 0.8.9 + srvx: 0.8.7 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -11532,42 +13302,83 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.132.27': + '@tanstack/start-server-core@1.131.47': + dependencies: + '@tanstack/history': 1.131.2 + '@tanstack/router-core': 1.131.47 + '@tanstack/start-client-core': 1.131.47 + '@tanstack/start-storage-context': 1.131.47 + h3: 1.13.0 + isbot: 5.1.31 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + unctx: 2.4.1 + + '@tanstack/start-server-core@1.132.31': dependencies: - '@tanstack/history': 1.132.21 - '@tanstack/router-core': 1.132.27 - '@tanstack/start-client-core': 1.132.27 - '@tanstack/start-storage-context': 1.132.27 + '@tanstack/history': 1.132.31 + '@tanstack/router-core': 1.132.31 + '@tanstack/start-client-core': 1.132.31 + '@tanstack/start-storage-context': 1.132.31 h3-v2: h3@2.0.0-beta.4 seroval: 1.3.2 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.132.27': + '@tanstack/start-server-functions-client@1.131.47(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tanstack/server-functions-plugin': 1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-functions-fetcher': 1.131.47 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-server-functions-fetcher@1.131.47': + dependencies: + '@tanstack/router-core': 1.131.47 + '@tanstack/start-client-core': 1.131.47 + + '@tanstack/start-server-functions-server@1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tanstack/server-functions-plugin': 1.131.2(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-storage-context@1.131.47': dependencies: - '@tanstack/router-core': 1.132.27 + '@tanstack/router-core': 1.131.47 + + '@tanstack/start-storage-context@1.132.31': + dependencies: + '@tanstack/router-core': 1.132.31 '@tanstack/store@0.7.0': {} + '@tanstack/store@0.7.5': {} + '@tanstack/store@0.7.7': {} - '@tanstack/typedoc-config@0.2.1(typescript@5.9.3)': + '@tanstack/typedoc-config@0.2.1(typescript@5.9.2)': dependencies: - typedoc: 0.27.9(typescript@5.9.3) - typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))) - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) + typedoc: 0.27.9(typescript@5.9.2) + typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) transitivePeerDependencies: - typescript - '@tanstack/virtual-file-routes@1.132.21': {} + '@tanstack/virtual-file-routes@1.131.2': {} + + '@tanstack/virtual-file-routes@1.132.31': {} - '@tanstack/vite-config@0.3.0(@types/node@22.18.8)(rollup@4.52.3)(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/vite-config@0.3.0(@types/node@22.18.6)(rollup@4.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.3) - vite-plugin-dts: 4.2.3(@types/node@22.18.8)(rollup@4.52.3)(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.9.0(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.0) + vite-plugin-dts: 4.2.3(@types/node@22.18.6)(rollup@4.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.9.0(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -11586,7 +13397,7 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.9.0': + '@testing-library/jest-dom@6.8.0': dependencies: '@adobe/css-tools': 4.4.4 aria-query: 5.3.2 @@ -11595,24 +13406,24 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.16))(@types/react@19.1.16)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.16 - '@types/react-dom': 19.1.9(@types/react@19.1.16) + '@types/react': 19.2.0 + '@types/react-dom': 19.1.9(@types/react@19.2.0) - '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.3))(typescript@5.9.3)': + '@trpc/client@11.6.0(@trpc/server@11.6.0(typescript@5.9.2))(typescript@5.9.2)': dependencies: - '@trpc/server': 11.6.0(typescript@5.9.3) - typescript: 5.9.3 + '@trpc/server': 11.6.0(typescript@5.9.2) + typescript: 5.9.2 - '@trpc/server@11.6.0(typescript@5.9.3)': + '@trpc/server@11.6.0(typescript@5.9.2)': dependencies: - typescript: 5.9.3 + typescript: 5.9.2 '@tufjs/canonical-json@2.0.0': {} @@ -11630,6 +13441,8 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/babel__code-frame@7.0.6': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.4 @@ -11654,7 +13467,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@types/chai@5.2.2': dependencies: @@ -11666,15 +13479,15 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 24.6.1 + '@types/node': 22.18.6 '@types/cors@2.8.19': dependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@types/debug@4.1.12': dependencies: @@ -11686,14 +13499,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 24.6.1 + '@types/node': 22.18.6 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -11729,17 +13542,21 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.18.8': + '@types/node@20.19.17': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.18.6': dependencies: undici-types: 6.21.0 - '@types/node@24.6.1': + '@types/node@24.5.2': dependencies: - undici-types: 7.13.0 + undici-types: 7.12.0 '@types/pg@8.15.5': dependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -11747,28 +13564,40 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.1.9(@types/react@19.1.16)': + '@types/react-dom@19.1.9(@types/react@19.1.13)': + dependencies: + '@types/react': 19.1.13 + + '@types/react-dom@19.1.9(@types/react@19.2.0)': + dependencies: + '@types/react': 19.2.0 + + '@types/react@19.1.13': dependencies: - '@types/react': 19.1.16 + csstype: 3.1.3 - '@types/react@19.1.16': + '@types/react@19.2.0': dependencies: csstype: 3.1.3 + '@types/resolve@1.20.2': {} + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.6.1 + '@types/node': 24.5.2 '@types/send': 0.17.5 + '@types/shimmer@1.2.0': {} + '@types/simple-peer@9.11.8': dependencies: - '@types/node': 24.6.1 + '@types/node': 22.18.6 '@types/unist@3.0.3': {} @@ -11782,73 +13611,156 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.6.1 + '@types/node': 22.18.6 + + '@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/type-utils': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + eslint: 9.36.0(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.45.0 - '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.45.0 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 + eslint: 9.36.0(jiti@2.6.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.45.0 '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3 - eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.3 + eslint: 9.36.0(jiti@2.6.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.45.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.44.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) + '@typescript-eslint/types': 8.44.1 + debug: 4.4.3 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.45.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) '@typescript-eslint/types': 8.45.0 debug: 4.4.3 - typescript: 5.9.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@8.44.0': + dependencies: + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/scope-manager@8.45.0': dependencies: '@typescript-eslint/types': 8.45.0 '@typescript-eslint/visitor-keys': 8.45.0 - '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: - typescript: 5.9.3 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + debug: 4.4.3 + eslint: 9.36.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) debug: 4.4.3 - eslint: 9.36.0(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + eslint: 9.36.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.44.0': {} + + '@typescript-eslint/types@8.44.1': {} + '@typescript-eslint/types@8.45.0': {} - '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.44.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2) + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.45.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.45.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.45.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.9.2) '@typescript-eslint/types': 8.45.0 '@typescript-eslint/visitor-keys': 8.45.0 debug: 4.4.3 @@ -11856,27 +13768,45 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.45.0 '@typescript-eslint/types': 8.45.0 - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.3 + '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@8.44.0': + dependencies: + '@typescript-eslint/types': 8.44.0 + eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.45.0': dependencies: '@typescript-eslint/types': 8.45.0 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -11936,23 +13866,54 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.5(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vercel/nft@0.30.1(encoding@0.1.13)(rollup@4.52.0)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) + 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: 10.4.5 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.5(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + vite: 7.1.5(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + + '@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - vite: 7.1.5(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.35 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) - '@rolldown/pluginutils': 1.0.0-beta.27 + '@rolldown/pluginutils': 1.0.0-beta.35 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -11960,16 +13921,16 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.38 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': dependencies: - vite: 6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.3) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.2) - '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.3 @@ -11981,7 +13942,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11993,21 +13954,21 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.7(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -12017,7 +13978,7 @@ snapshots: dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 - strip-literal: 3.1.0 + strip-literal: 3.0.0 '@vitest/snapshot@3.2.4': dependencies: @@ -12047,6 +14008,14 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 + '@vue/compiler-core@3.5.21': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.21 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-core@3.5.22': dependencies: '@babel/parser': 7.28.4 @@ -12055,6 +14024,11 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.21': + dependencies: + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 + '@vue/compiler-dom@3.5.22': dependencies: '@vue/compiler-core': 3.5.22 @@ -12082,18 +14056,18 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.1.6(typescript@5.9.3)': + '@vue/language-core@2.1.6(typescript@5.9.2)': dependencies: '@volar/language-core': 2.4.23 - '@vue/compiler-dom': 3.5.22 + '@vue/compiler-dom': 3.5.21 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.22 + '@vue/shared': 3.5.21 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 '@vue/reactivity@3.5.22': dependencies: @@ -12111,11 +14085,13 @@ snapshots: '@vue/shared': 3.5.22 csstype: 3.1.3 - '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.2))': dependencies: '@vue/compiler-ssr': 3.5.22 '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.9.3) + vue: 3.5.22(typescript@5.9.2) + + '@vue/shared@3.5.21': {} '@vue/shared@3.5.22': {} @@ -12128,6 +14104,10 @@ snapshots: abbrev@3.0.1: {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -12138,6 +14118,10 @@ snapshots: mime-types: 3.0.1 negotiator: 1.0.0 + 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 @@ -12205,7 +14189,7 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@7.1.1: + ansi-escapes@7.1.0: dependencies: environment: 1.1.0 @@ -12221,7 +14205,7 @@ snapshots: ansi-styles@6.2.3: {} - ansis@4.2.0: {} + ansis@4.1.0: {} any-promise@1.3.0: {} @@ -12230,6 +14214,28 @@ 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.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - react-native-b4a + arg@5.0.2: {} argparse@1.0.10: @@ -12330,10 +14336,14 @@ snapshots: async-function@1.0.0: {} + async-sema@3.1.1: {} + + async@3.2.6: {} + autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.26.2 - caniuse-lite: 1.0.30001746 + caniuse-lite: 1.0.30001743 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12346,6 +14356,8 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.7.1: {} + babel-dead-code-elimination@1.0.10: dependencies: '@babel/core': 7.28.4 @@ -12374,11 +14386,14 @@ snapshots: balanced-match@1.0.2: {} + bare-events@2.7.0: + optional: true + base64-js@1.5.1: {} base64id@2.0.0: {} - baseline-browser-mapping@2.8.9: {} + baseline-browser-mapping@2.8.6: {} beasties@0.3.5: dependencies: @@ -12396,8 +14411,8 @@ snapshots: '@better-auth/core': 1.3.24 '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 - '@noble/ciphers': 2.0.1 - '@noble/hashes': 2.0.1 + '@noble/ciphers': 2.0.0 + '@noble/hashes': 2.0.0 '@simplewebauthn/browser': 13.2.0 '@simplewebauthn/server': 13.2.1 better-call: 1.0.19 @@ -12431,6 +14446,10 @@ snapshots: binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -12486,14 +14505,16 @@ snapshots: browserslist@4.26.2: dependencies: - baseline-browser-mapping: 2.8.9 - caniuse-lite: 1.0.30001746 - electron-to-chromium: 1.5.228 + baseline-browser-mapping: 2.8.6 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.221 node-releases: 2.0.21 update-browserslist-db: 1.1.3(browserslist@4.26.2) bson@6.10.4: {} + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} buffer@6.0.3: @@ -12503,6 +14524,23 @@ snapshots: bytes@3.1.2: {} + c12@3.3.0(magicast@0.3.5): + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.2 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.5.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} cacache@19.0.1: @@ -12517,7 +14555,7 @@ snapshots: minipass-pipeline: 1.2.4 p-map: 7.0.3 ssri: 12.0.0 - tar: 7.5.1 + tar: 7.4.3 unique-filename: 4.0.0 call-bind-apply-helpers@1.0.2: @@ -12541,7 +14579,7 @@ snapshots: camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001746: {} + caniuse-lite@1.0.30001743: {} chai@5.3.3: dependencies: @@ -12607,6 +14645,12 @@ snapshots: ci-info@3.9.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + + cjs-module-lexer@1.4.3: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -12620,6 +14664,12 @@ snapshots: cli-width@4.1.0: {} + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -12640,6 +14690,8 @@ snapshots: clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -12653,12 +14705,16 @@ snapshots: commander@13.1.0: {} + commander@2.20.3: {} + commander@4.1.1: {} comment-parser@1.4.1: {} common-tags@1.8.2: {} + commondir@1.0.1: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -12666,6 +14722,16 @@ snapshots: compare-versions@6.1.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 + computeds@0.0.1: {} concat-map@0.0.1: {} @@ -12681,6 +14747,8 @@ snapshots: confbox@0.1.8: {} + confbox@0.2.2: {} + connect@3.7.0: dependencies: debug: 2.6.9 @@ -12690,6 +14758,8 @@ snapshots: transitivePeerDependencies: - supports-color + consola@3.4.2: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -12715,6 +14785,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + cookie-es@2.0.0: {} cookie-signature@1.0.6: {} @@ -12725,11 +14797,24 @@ snapshots: cookie@0.7.2: {} + cookie@1.0.2: {} + + core-util-is@1.0.3: {} + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + croner@9.1.0: {} + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -12744,6 +14829,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + crypto-js@4.2.0: {} css-select@5.2.2: @@ -12777,7 +14866,7 @@ snapshots: cssstyle@5.3.1(postcss@8.5.6): dependencies: - '@asamuzakjp/css-color': 4.0.5 + '@asamuzakjp/css-color': 4.0.4 '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) css-tree: 3.1.0 transitivePeerDependencies: @@ -12816,6 +14905,10 @@ snapshots: date-format@4.0.14: {} + db0@0.3.2(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7)): + optionalDependencies: + drizzle-orm: 0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) + de-indent@1.0.2: {} debug@2.6.9: @@ -12848,6 +14941,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -12856,18 +14951,21 @@ snapshots: defu@6.1.4: {} + denque@2.1.0: {} + depd@2.0.0: {} dequal@2.0.3: {} + destr@2.0.5: {} + destroy@1.2.0: {} detect-indent@6.1.0: {} - detect-libc@1.0.3: - optional: true + detect-libc@1.0.3: {} - detect-libc@2.1.1: {} + detect-libc@2.1.0: {} dexie@4.0.10: {} @@ -12887,6 +14985,10 @@ snapshots: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -12920,9 +15022,13 @@ snapshots: dependencies: is-obj: 2.0.0 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + dotenv@16.6.1: {} - dotenv@17.2.3: {} + dotenv@17.2.2: {} drizzle-kit@0.31.5: dependencies: @@ -12933,21 +15039,18 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7): + drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7): optionalDependencies: + '@opentelemetry/api': 1.9.0 '@types/pg': 8.15.5 + gel: 2.1.1 kysely: 0.28.7 pg: 8.16.3 postgres: 3.4.7 - drizzle-zod@0.8.3(drizzle-orm@0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@3.25.76): - dependencies: - drizzle-orm: 0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) - zod: 3.25.76 - - drizzle-zod@0.8.3(drizzle-orm@0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11): + drizzle-zod@0.8.3(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(zod@4.1.11): dependencies: - drizzle-orm: 0.44.5(@types/pg@8.15.5)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) + drizzle-orm: 0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7) zod: 4.1.11 dunder-proto@1.0.1: @@ -12956,11 +15059,13 @@ 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.228: {} + electron-to-chromium@1.5.221: {} emoji-regex@10.5.0: {} @@ -12991,7 +15096,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 24.6.1 + '@types/node': 24.5.2 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -13027,12 +15132,17 @@ snapshots: env-paths@2.2.1: {} + env-paths@3.0.0: + optional: true + environment@1.1.0: {} err-code@2.0.3: {} err-code@3.0.1: {} + error-stack-parser-es@1.0.5: {} + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -13232,14 +15342,16 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.36.0(jiti@2.6.0)): + escape-string-regexp@5.0.0: {} + + eslint-compat-utils@0.5.1(eslint@9.36.0(jiti@2.6.1)): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) semver: 7.7.2 - eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)): + eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.1)): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: @@ -13248,10 +15360,10 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 @@ -13259,23 +15371,23 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-es-x@7.8.0(eslint@9.36.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.36.0(jiti@2.6.0) - eslint-compat-utils: 0.5.1(eslint@9.36.0(jiti@2.6.0)) + eslint: 9.36.0(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@9.36.0(jiti@2.6.1)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1)): dependencies: - '@typescript-eslint/types': 8.45.0 + '@typescript-eslint/types': 8.44.1 comment-parser: 1.4.1 debug: 4.4.3 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.0.3 @@ -13283,43 +15395,43 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.1)) enhanced-resolve: 5.18.3 - eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-es-x: 7.8.0(eslint@9.36.0(jiti@2.6.0)) + eslint: 9.36.0(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@9.36.0(jiti@2.6.1)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.2 - ts-declaration-location: 1.0.7(typescript@5.9.3) + ts-declaration-location: 1.0.7(typescript@5.9.2) transitivePeerDependencies: - typescript - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.1)))(eslint@9.36.0(jiti@2.6.1))(prettier@3.6.2): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.6.1)) - eslint-plugin-react-hooks@5.2.0(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-react-hooks@5.2.0(eslint@9.36.0(jiti@2.6.1)): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.22(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-react-refresh@0.4.23(eslint@9.36.0(jiti@2.6.1)): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@9.36.0(jiti@2.6.0)): + eslint-plugin-react@7.37.5(eslint@9.36.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -13327,7 +15439,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -13341,19 +15453,24 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-solid@0.14.5(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + eslint-plugin-solid@0.14.5(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - eslint: 9.36.0(jiti@2.6.0) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.1) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 known-css-properties: 0.30.0 style-to-object: 1.0.9 - typescript: 5.9.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -13363,9 +15480,52 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.36.0(jiti@2.6.0): + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + eslint@9.36.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 @@ -13401,7 +15561,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.0 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -13413,6 +15573,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} esquery@1.6.0: @@ -13444,10 +15610,14 @@ snapshots: array-push-at-sort-position: 4.0.1 binary-decision-diagram: 3.2.0 + event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} + events@3.3.0: {} + eventsource-parser@3.0.6: {} eventsource@3.0.7: @@ -13562,6 +15732,8 @@ snapshots: fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -13594,10 +15766,16 @@ snapshots: fetchdts@0.1.7: {} + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + file-entry-cache@8.0.0: 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 @@ -13680,6 +15858,12 @@ snapshots: transitivePeerDependencies: - '@react-native-async-storage/async-storage' + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -13750,6 +15934,18 @@ snapshots: functions-have-names@1.2.3: {} + gel@2.1.1: + dependencies: + '@petamoriken/float16': 3.9.2 + debug: 4.4.3 + env-paths: 3.0.0 + semver: 7.7.2 + shell-quote: 1.8.3 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + optional: true + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -13758,8 +15954,6 @@ snapshots: dependencies: is-property: 1.0.2 - generator-function@2.0.1: {} - gensync@1.0.0-beta.2: {} get-browser-rtc@1.1.0: {} @@ -13788,6 +15982,8 @@ 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 @@ -13809,6 +16005,15 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.2 + pathe: 2.0.3 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -13837,6 +16042,10 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globals@14.0.0: {} globals@15.15.0: {} @@ -13857,6 +16066,15 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + globrex@0.1.2: {} goober@2.1.16(csstype@3.1.3): @@ -13875,12 +16093,41 @@ snapshots: graphql@15.10.1: {} + gzip-size@7.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.13.0: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + 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.4: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.3 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + h3@2.0.0-beta.4: dependencies: cookie-es: 2.0.0 fetchdts: 0.1.7 rou3: 0.7.5 - srvx: 0.8.9 + srvx: 0.8.7 has-bigints@1.1.0: {} @@ -13906,13 +16153,15 @@ snapshots: he@1.2.0: {} + hookable@5.5.3: {} + hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 hosted-git-info@9.0.0: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.1 html-encoding-sniffer@4.0.0: dependencies: @@ -13962,6 +16211,8 @@ snapshots: transitivePeerDependencies: - debug + http-shutdown@1.2.2: {} + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -13969,6 +16220,8 @@ snapshots: transitivePeerDependencies: - supports-color + httpxy@0.1.7: {} + human-id@4.1.1: {} human-signals@5.0.0: {} @@ -14006,6 +16259,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.14.4: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + import-lazy@4.0.0: {} imurmurhash@0.1.4: {} @@ -14031,10 +16291,26 @@ snapshots: interpret@1.4.0: {} + ioredis@5.7.0: + dependencies: + '@ioredis/commands': 1.4.0 + cluster-key-slot: 1.1.2 + debug: 4.4.3 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + ip-address@10.0.1: {} ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} + is-arguments@1.2.0: dependencies: call-bound: 1.0.4 @@ -14088,6 +16364,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -14102,10 +16382,9 @@ snapshots: dependencies: get-east-asian-width: 1.4.0 - is-generator-function@1.1.2: + is-generator-function@1.1.0: dependencies: call-bound: 1.0.4 - generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -14118,10 +16397,16 @@ snapshots: dependencies: html-tags: 3.3.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-interactive@2.0.0: {} is-map@2.0.3: {} + is-module@1.0.0: {} + is-my-ip-valid@1.0.1: {} is-my-json-valid@2.20.6: @@ -14143,12 +16428,18 @@ snapshots: is-obj@2.0.0: {} + is-path-inside@3.0.3: {} + is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} is-property@1.0.2: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + is-reference@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -14168,6 +16459,8 @@ snapshots: is-stream@1.1.0: {} + is-stream@2.0.1: {} + is-stream@3.0.0: {} is-string@1.1.1: @@ -14212,10 +16505,26 @@ snapshots: is-windows@1.0.2: {} + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + isarray@2.0.5: {} isbinaryfile@4.0.10: {} + isbot@5.1.30: {} + isbot@5.1.31: {} isexe@2.0.0: {} @@ -14296,7 +16605,9 @@ snapshots: jiti@1.21.7: {} - jiti@2.6.0: {} + jiti@2.5.1: {} + + jiti@2.6.1: {} jju@1.4.0: {} @@ -14319,7 +16630,7 @@ snapshots: jsdom@27.0.0(postcss@8.5.6): dependencies: - '@asamuzakjp/dom-selector': 6.5.7 + '@asamuzakjp/dom-selector': 6.5.5 cssstyle: 5.3.1(postcss@8.5.6) data-urls: 6.0.0 decimal.js: 10.6.0 @@ -14452,13 +16763,15 @@ snapshots: kleur@4.1.5: {} - knip@5.64.1(@types/node@22.18.8)(typescript@5.9.3): + klona@2.0.6: {} + + knip@5.64.1(@types/node@22.18.6)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 22.18.8 + '@types/node': 22.18.6 fast-glob: 3.3.3 formatly: 0.3.0 - jiti: 2.6.0 + jiti: 2.6.1 js-yaml: 4.1.0 minimist: 1.2.8 oxc-resolver: 11.8.4 @@ -14466,15 +16779,21 @@ snapshots: picomatch: 4.0.3 smol-toml: 1.4.2 strip-json-comments: 5.0.2 - typescript: 5.9.3 + typescript: 5.9.2 zod: 4.1.11 + knitwork@1.2.0: {} + known-css-properties@0.30.0: {} kolorist@1.8.0: {} kysely@0.28.7: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -14512,7 +16831,7 @@ snapshots: lightningcss@1.30.1: dependencies: - detect-libc: 2.1.1 + detect-libc: 2.1.0 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 @@ -14548,6 +16867,27 @@ snapshots: transitivePeerDependencies: - supports-color + listhen@1.9.0: + dependencies: + '@parcel/watcher': 2.5.1 + '@parcel/watcher-wasm': 2.5.1 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.4.2 + crossws: 0.3.5 + defu: 6.1.4 + get-port-please: 3.2.0 + h3: 1.15.4 + http-shutdown: 1.2.2 + jiti: 2.5.1 + mlly: 1.8.0 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.9.0 + ufo: 1.6.1 + untun: 0.1.3 + uqr: 0.1.2 + listr2@8.3.3: dependencies: cli-truncate: 4.0.0 @@ -14588,6 +16928,12 @@ snapshots: mlly: 1.8.0 pkg-types: 1.3.1 + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + locate-character@3.0.0: {} locate-path@5.0.0: @@ -14600,8 +16946,12 @@ snapshots: lodash.camelcase@4.3.0: {} + lodash.defaults@4.2.0: {} + lodash.get@4.4.2: {} + lodash.isarguments@3.1.0: {} + lodash.isequal@4.5.0: {} lodash.merge@4.6.2: {} @@ -14617,7 +16967,7 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.1.1 + ansi-escapes: 7.1.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 strip-ansi: 7.1.2 @@ -14641,9 +16991,13 @@ snapshots: loupe@3.2.1: {} + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + lru-cache@10.4.3: {} - lru-cache@11.2.2: {} + lru-cache@11.2.1: {} lru-cache@5.1.1: dependencies: @@ -14756,6 +17110,10 @@ snapshots: mime@2.6.0: {} + mime@3.0.0: {} + + mime@4.1.0: {} + mimic-fn@4.0.0: {} mimic-function@5.0.1: {} @@ -14776,6 +17134,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -14790,7 +17152,7 @@ snapshots: dependencies: minipass: 7.1.2 minipass-sized: 1.0.3 - minizlib: 3.1.0 + minizlib: 3.0.2 optionalDependencies: encoding: 0.1.13 @@ -14819,7 +17181,7 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - minizlib@3.1.0: + minizlib@3.0.2: dependencies: minipass: 7.1.2 @@ -14831,6 +17193,8 @@ snapshots: mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -14838,6 +17202,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + module-details-from-path@1.0.4: {} + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 @@ -14845,7 +17211,7 @@ snapshots: mongodb@6.18.0(socks@2.8.7): dependencies: - '@mongodb-js/saslprep': 1.3.1 + '@mongodb-js/saslprep': 1.3.0 bson: 6.10.4 mongodb-connection-string-url: 3.0.2 optionalDependencies: @@ -14904,15 +17270,122 @@ snapshots: nice-try@1.0.5: {} + nitropack@2.12.6(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.38): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@rollup/plugin-alias': 5.1.1(rollup@4.52.0) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.52.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.52.0) + '@rollup/plugin-json': 6.1.0(rollup@4.52.0) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.52.0) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) + '@rollup/plugin-terser': 0.4.4(rollup@4.52.0) + '@vercel/nft': 0.30.1(encoding@0.1.13)(rollup@4.52.0) + archiver: 7.0.1 + c12: 3.3.0(magicast@0.3.5) + chokidar: 4.0.3 + citty: 0.1.6 + compatx: 0.2.0 + confbox: 0.2.2 + consola: 3.4.2 + cookie-es: 2.0.0 + croner: 9.1.0 + crossws: 0.3.5 + db0: 0.3.2(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7)) + defu: 6.1.4 + destr: 2.0.5 + dot-prop: 9.0.0 + esbuild: 0.25.10 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + exsolve: 1.0.7 + globby: 14.1.0 + gzip-size: 7.0.0 + h3: 1.15.4 + hookable: 5.5.3 + httpxy: 0.1.7 + ioredis: 5.7.0 + jiti: 2.5.1 + klona: 2.0.6 + knitwork: 1.2.0 + listhen: 1.9.0 + magic-string: 0.30.19 + magicast: 0.3.5 + mime: 4.1.0 + mlly: 1.8.0 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.3 + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + pretty-bytes: 7.0.1 + radix3: 1.1.2 + rollup: 4.52.0 + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.38)(rollup@4.52.0) + scule: 1.3.0 + semver: 7.7.2 + serve-placeholder: 2.0.2 + serve-static: 2.2.0 + source-map: 0.7.6 + std-env: 3.9.0 + ufo: 1.6.1 + ultrahtml: 1.6.0 + uncrypto: 0.1.3 + unctx: 2.4.1 + unenv: 2.0.0-rc.21 + unimport: 5.3.0 + unplugin-utils: 0.3.0 + unstorage: 1.17.1(db0@0.3.2(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0) + untyped: 2.0.0 + unwasm: 0.3.11 + youch: 4.1.0-beta.11 + 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 + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + nkeys.js@1.1.0: dependencies: tweetnacl: 1.0.3 + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + node-addon-api@6.1.0: optional: true - node-addon-api@7.1.1: - optional: true + node-addon-api@7.1.1: {} + + node-fetch-native@1.6.7: {} node-fetch@2.7.0(encoding@0.1.13): dependencies: @@ -14920,11 +17393,15 @@ snapshots: optionalDependencies: encoding: 0.1.13 + node-forge@1.3.1: {} + node-gyp-build-optional-packages@5.2.2: dependencies: - detect-libc: 2.1.1 + detect-libc: 2.1.0 optional: true + node-gyp-build@4.8.4: {} + node-gyp@11.4.2: dependencies: env-paths: 2.2.1 @@ -14934,12 +17411,14 @@ snapshots: nopt: 8.1.0 proc-log: 5.0.0 semver: 7.7.2 - tar: 7.5.1 + tar: 7.4.3 tinyglobby: 0.2.15 which: 5.0.0 transitivePeerDependencies: - supports-color + node-mock-http@1.0.3: {} + node-releases@2.0.21: {} nopt@8.1.0: @@ -14974,10 +17453,9 @@ snapshots: semver: 7.7.2 validate-npm-package-name: 6.0.2 - npm-packlist@10.0.2: + npm-packlist@10.0.1: dependencies: ignore-walk: 8.0.0 - proc-log: 5.0.0 npm-pick-manifest@10.0.0: dependencies: @@ -14993,7 +17471,7 @@ snapshots: make-fetch-happen: 14.0.3 minipass: 7.1.2 minipass-fetch: 4.0.1 - minizlib: 3.1.0 + minizlib: 3.0.2 npm-package-arg: 12.0.2 proc-log: 5.0.0 transitivePeerDependencies: @@ -15011,6 +17489,14 @@ snapshots: dependencies: boolbase: 1.0.0 + nypm@0.6.2: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.1 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -15051,6 +17537,16 @@ snapshots: oblivious-set@1.4.0: {} + ofetch@1.4.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.3.0: dependencies: ee-first: 1.1.1 @@ -15071,6 +17567,12 @@ snapshots: dependencies: mimic-function: 5.0.1 + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -15183,7 +17685,7 @@ snapshots: fs-minipass: 3.0.3 minipass: 7.1.2 npm-package-arg: 12.0.2 - npm-packlist: 10.0.2 + npm-packlist: 10.0.1 npm-pick-manifest: 10.0.0 npm-registry-fetch: 18.0.2 proc-log: 5.0.0 @@ -15227,6 +17729,11 @@ snapshots: parseurl@1.3.3: {} + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -15252,10 +17759,16 @@ snapshots: path-type@4.0.0: {} + path-type@6.0.0: {} + + pathe@1.1.2: {} + pathe@2.0.3: {} pathval@2.0.1: {} + perfect-debounce@2.0.0: {} + pg-cloudflare@1.2.7: optional: true @@ -15317,6 +17830,12 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + possible-typed-array-names@1.1.0: {} postcss-import@15.1.0(postcss@8.5.6): @@ -15380,6 +17899,8 @@ snapshots: prettier@3.6.2: {} + pretty-bytes@7.0.1: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -15388,6 +17909,10 @@ snapshots: proc-log@5.0.0: {} + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 @@ -15411,7 +17936,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.6.1 + '@types/node': 22.18.6 long: 5.3.2 proxy-addr@2.0.7: @@ -15457,6 +17982,8 @@ snapshots: queue-microtask@1.2.3: {} + radix3@1.1.2: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -15477,6 +18004,11 @@ snapshots: iconv-lite: 0.7.0 unpipe: 1.0.0 + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + react-dom@19.1.1(react@19.1.1): dependencies: react: 19.1.1 @@ -15501,12 +18033,34 @@ 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.6 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -15532,6 +18086,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 + reflect-metadata@0.2.2: {} reflect.getprototypeof@1.0.10: @@ -15560,6 +18120,14 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + requires-port@1.0.0: {} resolve-from@4.0.0: {} @@ -15599,7 +18167,7 @@ snapshots: dependencies: '@oxc-project/types': 0.89.0 '@rolldown/pluginutils': 1.0.0-beta.38 - ansis: 4.2.0 + ansis: 4.1.0 optionalDependencies: '@rolldown/binding-android-arm64': 1.0.0-beta.38 '@rolldown/binding-darwin-arm64': 1.0.0-beta.38 @@ -15616,38 +18184,48 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.38 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.38 - rollup-plugin-preserve-directives@0.4.0(rollup@4.52.3): + rollup-plugin-preserve-directives@0.4.0(rollup@4.52.0): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.3) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) magic-string: 0.30.19 - rollup: 4.52.3 + rollup: 4.52.0 - rollup@4.52.3: + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.38)(rollup@4.52.0): + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + source-map: 0.7.6 + yargs: 17.7.2 + optionalDependencies: + rolldown: 1.0.0-beta.38 + rollup: 4.52.0 + + rollup@4.52.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.3 - '@rollup/rollup-android-arm64': 4.52.3 - '@rollup/rollup-darwin-arm64': 4.52.3 - '@rollup/rollup-darwin-x64': 4.52.3 - '@rollup/rollup-freebsd-arm64': 4.52.3 - '@rollup/rollup-freebsd-x64': 4.52.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.3 - '@rollup/rollup-linux-arm-musleabihf': 4.52.3 - '@rollup/rollup-linux-arm64-gnu': 4.52.3 - '@rollup/rollup-linux-arm64-musl': 4.52.3 - '@rollup/rollup-linux-loong64-gnu': 4.52.3 - '@rollup/rollup-linux-ppc64-gnu': 4.52.3 - '@rollup/rollup-linux-riscv64-gnu': 4.52.3 - '@rollup/rollup-linux-riscv64-musl': 4.52.3 - '@rollup/rollup-linux-s390x-gnu': 4.52.3 - '@rollup/rollup-linux-x64-gnu': 4.52.3 - '@rollup/rollup-linux-x64-musl': 4.52.3 - '@rollup/rollup-openharmony-arm64': 4.52.3 - '@rollup/rollup-win32-arm64-msvc': 4.52.3 - '@rollup/rollup-win32-ia32-msvc': 4.52.3 - '@rollup/rollup-win32-x64-gnu': 4.52.3 - '@rollup/rollup-win32-x64-msvc': 4.52.3 + '@rollup/rollup-android-arm-eabi': 4.52.0 + '@rollup/rollup-android-arm64': 4.52.0 + '@rollup/rollup-darwin-arm64': 4.52.0 + '@rollup/rollup-darwin-x64': 4.52.0 + '@rollup/rollup-freebsd-arm64': 4.52.0 + '@rollup/rollup-freebsd-x64': 4.52.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.0 + '@rollup/rollup-linux-arm-musleabihf': 4.52.0 + '@rollup/rollup-linux-arm64-gnu': 4.52.0 + '@rollup/rollup-linux-arm64-musl': 4.52.0 + '@rollup/rollup-linux-loong64-gnu': 4.52.0 + '@rollup/rollup-linux-ppc64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-musl': 4.52.0 + '@rollup/rollup-linux-s390x-gnu': 4.52.0 + '@rollup/rollup-linux-x64-gnu': 4.52.0 + '@rollup/rollup-linux-x64-musl': 4.52.0 + '@rollup/rollup-openharmony-arm64': 4.52.0 + '@rollup/rollup-win32-arm64-msvc': 4.52.0 + '@rollup/rollup-win32-ia32-msvc': 4.52.0 + '@rollup/rollup-win32-x64-gnu': 4.52.0 + '@rollup/rollup-win32-x64-msvc': 4.52.0 fsevents: 2.3.3 rou3@0.5.1: {} @@ -15734,6 +18312,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -15809,12 +18389,20 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + seroval-plugins@1.3.3(seroval@1.3.2): dependencies: seroval: 1.3.2 seroval@1.3.2: {} + serve-placeholder@2.0.2: + dependencies: + defu: 6.1.4 + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -15907,6 +18495,8 @@ snapshots: sherif-windows-arm64: 1.6.1 sherif-windows-x64: 1.6.1 + shimmer@1.2.1: {} + shx@0.4.0: dependencies: minimist: 1.2.8 @@ -15979,6 +18569,8 @@ snapshots: slash@3.0.0: {} + slash@5.1.0: {} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.3 @@ -15991,6 +18583,8 @@ snapshots: smart-buffer@4.2.0: {} + smob@1.5.0: {} + smol-toml@1.4.2: {} socket.io-adapter@2.5.5: @@ -16091,7 +18685,7 @@ snapshots: sprintf-js@1.0.3: {} - srvx@0.8.9: + srvx@0.8.7: dependencies: cookie-es: 2.0.0 @@ -16103,6 +18697,8 @@ snapshots: stackback@0.0.2: {} + standard-as-callback@2.1.0: {} + statuses@1.5.0: {} statuses@2.0.1: {} @@ -16126,6 +18722,15 @@ snapshots: transitivePeerDependencies: - supports-color + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.7.0 + transitivePeerDependencies: + - react-native-b4a + string-argv@0.3.2: {} string-width@4.2.3: @@ -16190,6 +18795,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -16216,7 +18825,7 @@ snapshots: strip-json-comments@5.0.2: {} - strip-literal@3.1.0: + strip-literal@3.0.0: dependencies: js-tokens: 9.0.1 @@ -16234,6 +18843,8 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 + supports-color@10.2.2: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -16244,30 +18855,30 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.3.2(picomatch@4.0.3)(svelte@5.39.7)(typescript@5.9.3): + svelte-check@4.3.2(picomatch@4.0.3)(svelte@5.39.8)(typescript@5.9.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.39.7 - typescript: 5.9.3 + svelte: 5.39.8 + typescript: 5.9.2 transitivePeerDependencies: - picomatch - svelte2tsx@0.7.44(svelte@5.39.7)(typescript@5.9.3): + svelte2tsx@0.7.43(svelte@5.39.8)(typescript@5.9.2): dependencies: dedent-js: 1.0.1 - scule: 1.3.0 - svelte: 5.39.7 - typescript: 5.9.3 + pascal-case: 3.1.2 + svelte: 5.39.8 + typescript: 5.9.2 - svelte@5.39.7: + svelte@5.39.8: dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 - '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) '@types/estree': 1.0.8 acorn: 8.15.0 aria-query: 5.3.2 @@ -16286,6 +18897,10 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 + system-architecture@0.1.0: {} + + tailwind-merge@2.6.0: {} + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -16317,6 +18932,14 @@ snapshots: tapable@2.2.3: {} + tar-stream@3.1.7: + dependencies: + b4a: 1.7.1 + fast-fifo: 1.3.2 + streamx: 2.22.1 + transitivePeerDependencies: + - react-native-b4a + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -16326,12 +18949,13 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.5.1: + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.1.0 + minizlib: 3.0.2 + mkdirp: 3.0.1 yallist: 5.0.0 temporal-polyfill@0.3.0: @@ -16342,14 +18966,29 @@ snapshots: term-size@2.2.1: {} + terser@5.44.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 glob: 10.4.5 minimatch: 9.0.5 + text-decoder@1.2.3: + dependencies: + b4a: 1.7.1 + transitivePeerDependencies: + - react-native-b4a + text-extensions@2.4.0: {} + text-table@0.2.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -16368,6 +19007,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.0.1: {} + tinyglobby@0.2.14: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -16419,20 +19060,20 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.9.3 + typescript: 5.9.2 - ts-declaration-location@1.0.7(typescript@5.9.3): + ts-declaration-location@1.0.7(typescript@5.9.2): dependencies: picomatch: 4.0.3 - typescript: 5.9.3 + typescript: 5.9.2 ts-interface-checker@0.1.13: {} - tsconfck@3.1.6(typescript@5.9.3): + tsconfck@3.1.6(typescript@5.9.2): optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 tslib@1.14.1: {} @@ -16463,6 +19104,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.20.2: {} + + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -16507,32 +19152,32 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3))): + typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2))): dependencies: - typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.3)) + typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.9.2)) yaml: 2.8.1 - typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.3)): + typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.9.2)): dependencies: - typedoc: 0.27.9(typescript@5.9.3) + typedoc: 0.27.9(typescript@5.9.2) - typedoc@0.27.9(typescript@5.9.3): + typedoc@0.27.9(typescript@5.9.2): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.3 + typescript: 5.9.2 yaml: 2.8.1 - typescript-eslint@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3): + typescript-eslint@8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.45.0(@typescript-eslint/parser@8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.45.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.45.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.3) - eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.3 + '@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.36.0(jiti@2.6.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -16540,7 +19185,7 @@ snapshots: typescript@5.8.3: {} - typescript@5.9.3: {} + typescript@5.9.2: {} ua-parser-js@0.7.41: {} @@ -16548,6 +19193,8 @@ snapshots: ufo@1.6.1: {} + ultrahtml@1.6.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -16557,12 +19204,54 @@ snapshots: uncrypto@0.1.3: {} + unctx@2.4.1: + dependencies: + acorn: 8.15.0 + estree-walker: 3.0.3 + magic-string: 0.30.19 + unplugin: 2.3.10 + undici-types@6.21.0: {} - undici-types@7.13.0: {} + undici-types@7.12.0: {} undici@7.16.0: {} + unenv@1.10.0: + dependencies: + consola: 3.4.2 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.7 + pathe: 1.1.2 + + unenv@2.0.0-rc.21: + dependencies: + defu: 6.1.4 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + + unicorn-magic@0.3.0: {} + + unimport@5.3.0: + dependencies: + acorn: 8.15.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + pathe: 2.0.3 + picomatch: 4.0.3 + pkg-types: 2.3.0 + scule: 1.3.0 + strip-literal: 3.0.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.0 + unique-filename@4.0.0: dependencies: unique-slug: 5.0.0 @@ -16579,6 +19268,11 @@ snapshots: unpipe@1.0.0: {} + unplugin-utils@0.3.0: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + unplugin@2.3.10: dependencies: '@jridgewell/remapping': 2.3.5 @@ -16610,12 +19304,51 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + unstorage@1.17.1(db0@0.3.2(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0): + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 + lru-cache: 10.4.3 + node-fetch-native: 1.6.7 + ofetch: 1.4.1 + ufo: 1.6.1 + optionalDependencies: + db0: 0.3.2(drizzle-orm@0.44.5(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(gel@2.1.1)(kysely@0.28.7)(pg@8.16.3)(postgres@3.4.7)) + ioredis: 5.7.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.4 + jiti: 2.5.1 + knitwork: 1.2.0 + scule: 1.3.0 + + unwasm@0.3.11: + dependencies: + knitwork: 1.2.0 + magic-string: 0.30.19 + mlly: 1.8.0 + pathe: 2.0.3 + pkg-types: 2.3.0 + unplugin: 2.3.10 + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 + uqr@0.1.2: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -16630,7 +19363,7 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.2.0 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-typed-array: 1.1.15 which-typed-array: 1.1.19 @@ -16651,13 +19384,34 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@20.19.17)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.7(@types/node@20.19.17)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-node@3.2.4(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.7(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -16672,13 +19426,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -16693,45 +19447,30 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@22.18.8)(rollup@4.52.3)(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.2.3(@types/node@22.18.6)(rollup@4.52.0)(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.18.8) - '@rollup/pluginutils': 5.3.0(rollup@4.52.3) + '@microsoft/api-extractor': 7.47.7(@types/node@22.18.6) + '@rollup/pluginutils': 5.3.0(rollup@4.52.0) '@volar/typescript': 2.4.23 - '@vue/language-core': 2.1.6(typescript@5.9.3) + '@vue/language-core': 2.1.6(typescript@5.9.2) compare-versions: 6.1.1 debug: 4.4.3 kolorist: 1.8.0 local-pkg: 0.5.1 magic-string: 0.30.19 - typescript: 5.9.3 + typescript: 5.9.2 optionalDependencies: - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): - dependencies: - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-externalize-deps@0.9.0(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@babel/core': 7.28.4 - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.9(@babel/core@7.28.4)(solid-js@1.9.9) - merge-anything: 5.1.7 - solid-js: 1.9.9 - solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) - optionalDependencies: - '@testing-library/jest-dom': 6.9.0 - transitivePeerDependencies: - - supports-color + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.4 '@types/babel__core': 7.20.5 @@ -16739,14 +19478,14 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: - '@testing-library/jest-dom': 6.9.0 + '@testing-library/jest-dom': 6.8.0 transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.9.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.8(@testing-library/jest-dom@6.8.0)(solid-js@1.9.9)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.4 '@types/babel__core': 7.20.5 @@ -16754,138 +19493,163 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.9 solid-refresh: 0.6.3(solid-js@1.9.9) - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: - '@testing-library/jest-dom': 6.9.0 + '@testing-library/jest-dom': 6.8.0 transitivePeerDependencies: - supports-color - optional: true - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) + tsconfck: 3.1.6(typescript@5.9.2) optionalDependencies: - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) + tsconfck: 3.1.6(typescript@5.9.2) optionalDependencies: - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.10 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.3 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.18.8 - fsevents: 2.3.3 - jiti: 2.6.0 - lightningcss: 1.30.1 - sass: 1.90.0 - tsx: 4.20.6 - yaml: 2.8.1 - - vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.5(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 fsevents: 2.3.3 - jiti: 2.6.0 + jiti: 2.6.1 lightningcss: 1.30.1 sass: 1.90.0 + terser: 5.44.0 tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.5(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.7(@types/node@20.19.17)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 20.19.17 fsevents: 2.3.3 - jiti: 2.6.0 + jiti: 2.6.1 lightningcss: 1.30.1 sass: 1.90.0 + terser: 5.44.0 tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.7(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 22.18.6 fsevents: 2.3.3 - jiti: 2.6.0 + jiti: 2.6.1 lightningcss: 1.30.1 sass: 1.90.0 + terser: 5.44.0 tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.3 + rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.6.1 + '@types/node': 24.5.2 fsevents: 2.3.3 - jiti: 2.6.0 + jiti: 2.6.1 lightningcss: 1.30.1 sass: 1.90.0 + terser: 5.44.0 tsx: 4.20.6 yaml: 2.8.1 - vitefu@1.1.1(vite@6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.6(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu@1.1.1(vite@6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.6(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu@1.1.1(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.7(@types/node@20.19.17)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@20.19.17)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + why-is-node-running: 2.3.0 optionalDependencies: - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + '@types/debug': 4.1.12 + '@types/node': 20.19.17 + jsdom: 27.0.0(postcss@8.5.6) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16903,12 +19667,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.8)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.8 + '@types/node': 22.18.6 jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -16924,11 +19688,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.6.1)(jiti@2.6.0)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16946,12 +19710,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.6.1)(jiti@2.6.0)(lightningcss@1.30.1)(sass@1.90.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.6.1)(lightningcss@1.30.1)(sass@1.90.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.6.1 + '@types/node': 24.5.2 jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -16971,10 +19735,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.6.0)): + vue-eslint-parser@10.2.0(eslint@9.36.0(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.36.0(jiti@2.6.1) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -16983,15 +19747,15 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.5.22(typescript@5.9.3): + vue@3.5.22(typescript@5.9.2): dependencies: '@vue/compiler-dom': 3.5.22 '@vue/compiler-sfc': 3.5.22 '@vue/runtime-dom': 3.5.22 - '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.2)) '@vue/shared': 3.5.22 optionalDependencies: - typescript: 5.9.3 + typescript: 5.9.2 w3c-xmlserializer@5.0.0: dependencies: @@ -17064,7 +19828,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -17097,6 +19861,11 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + optional: true + which@5.0.0: dependencies: isexe: 3.1.1 @@ -17200,6 +19969,19 @@ snapshots: yoctocolors-cjs@2.1.3: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.11: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 + z-schema@6.0.2: dependencies: lodash.get: 4.4.2 @@ -17210,6 +19992,12 @@ snapshots: zimmerframe@1.1.4: {} + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: zod: 3.25.76